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 |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|