|  28.08.2009, 20:52 | #1 | 
| Участник | Binary.string 
			
			Axapta 3.0. SP3 X++: static void BinSTR(Args _args) { Binary st1; Binary st2; Binary bin1; int i; ; for (i=0; i<=10;i++) { st1 = new Binary(256); st2 = new Binary(256); bin1 = new Binary(8); st1.string(0,"Тестовая строка 1"); st2.string(0,"Тестовая строка 2"); bin1.binary(0,st1); bin1.binary(4,st2); st1 = new Binary(256); st2 = new Binary(256); st1.attach(bin1.dWord(0),255); st2.attach(bin1.dWord(4),255); info(st1.string(0)); info(st2.string(0)); } } Если запустить несколько раз - результат может получиться правильный. Если открыть любую форму, и снова запустить джоб, то опять получаю на выходе абракадабру Не могу понять в чем проблема. Интересно, какой результат у других. | 
|  | 
|  31.08.2009, 14:04 | #2 | 
| Участник | 
			
			У вас типичный случай с переполнением стека. Цитата: А если измените порядок переменных в стеке X++: static void BinSTR(Args _args) { Binary st1; Binary st2; Binary bin1; См. msdn: http://msdn.microsoft.com/en-us/library/aa500848.aspx | 
|  | 
|  31.08.2009, 14:28 | #3 | 
| Участник | 
			
			Сергей, там просто сохраняются адреса, а не сами значения. Но вот после сохранения адреса, области памяти со строками освобождаются инициализируются заново. Сделайте так X++: static void BinSTR(Args _args) { Binary st1; Binary st2; Binary st3; Binary st4; Binary bin1; int i; ; for (i=0; i<=10;i++) { st1 = new Binary(256); st2 = new Binary(256); bin1 = new Binary(8); st1.string(0,"Тестовая строка 1"); st2.string(0,"Тестовая строка 2"); bin1.binary(0,st1); bin1.binary(4,st2); st3 = new Binary(256); st4 = new Binary(256); st3.attach(bin1.dWord(0),255); st4.attach(bin1.dWord(4),255); info(st3.string(0)); info(st4.string(0)); } } 
				__________________ Axapta v.3.0 sp5 kr2 | 
|  | |
| За это сообщение автора поблагодарили: mazzy (2), John_11 (1). | |
|  01.09.2009, 10:38 | #4 | 
| Участник | 
			
			Да, действительно ошибка была связана с обнулением переменных. Я вызывал метод в который передавал строку и он мне возвращал Binary, как указатель на это строку. X++: Binary Str2Ptr(Str _st) { Binary bin = new Binary(256); Binary ptr = new Binary(4); ; bin.string(0,_st); ptr.binary(0,bin); return ptr; } | 
|  | 
|  27.10.2017, 15:10 | #5 | 
| Участник | 
			
			В продолжение старой темы. Имеется С-библиотека, которая в out параметр возвращает структуру с указателем на стоку (PSTR) неизвестной длины. В Ах я ее получаю в Binary _info и пытаюсь вытащить строку. X++: p1 = new Binary(1000);
p1.attach(_info.dWord(offset), 300);
sss = p1.string(0);В выделенный буфер метод attach копирует заданное количество байт, а потом метод string копирует из них строку до первого нуля. Но иногда при работе клиент падает на методе string. Скорей всего из-за обращения к не той памяти. X++: // проверка текстовых данных for (n=0; n<=300; n+=1) { info(strfmt('%1 = %2 %3', n, int2hex(p1.byte(n), 2), num2char(p1.byte(n)) )); if (p1.byte(n) == 0x00) break; } Какие у кого идеи? | 
|  | 
|  27.10.2017, 16:33 | #7 | 
| Участник | 
			
			В данном случае размера буфера более чем достаточно. Вижу пока вариант написать свой метод вместо string() на основе тестового цикла. То есть, самому считывать строку посимвольно. | 
|  | 
| Теги | 
| ax3.0, binary, string | 
|  | 
| 
 |