01.09.2004, 14:11 | #1 |
Участник
|
Binary in Axapta
Добрый день. Вот, нежданно-негаданно на ровном месте столкнулся с такой проблемой.
Работал с API функциями Crystal Report в Аксапте. Там некогторые функции принимают в качестве параметра структуры, которые я реализовывал, создавая класс binary и записывая в него с определнным смещением требуемые члены-данные структуры. И все типа данных в аксапте как типы, кроме str. Он имеет в аксапте неограниченную длину, поэтому, когда я писал static void Job3(Args _args) { binary bin = new binary(128); int n = 666; str 9 s = "123456789"; ; bin.word(10, n); bin.string(0, s); box::info(strfmt("%1", bin.Word(10))); } последний box выдавал 0. А, насколько я понимаю, должен был выдать 5. Если заремить bin.string(0, s);, то все работает. Я так предполагаю, что это из-за того, что string просто затирает весь bin до конца. Никто не имеет никаких мыслей по сему поводу? Я пробовал так ограничить стринг: static void Job3(Args _args) { binary bin = new binary(128); binary bin9 = new binary(9); int n = 666; str 9 s = "123456789"; ; bin.word(10, n); bin9.string(0, s); bin.binary(0, bin9); box::info(strfmt("%1", bin.word(10))); // выдает 5 - павильно box::info(strfmt("%1", bin.string(0))); // вместо строки какие-то закорлючки } Может кто-то подскажет, в чем может быть глюк? Или найдет другой способ вложить в binary строку, чтобы она не затерла все за собой? Ведь с bin.Word все замечательно работает. Может я просто не понимаю, как работает этот бинари? Спасибо, о други! |
|
01.09.2004, 14:17 | #2 |
Участник
|
строка содержит на 1 символ больше, чем объявлено.
В конце хранится терминирующий 0. Т.е. число надо класть с 11 символа. Без терминирующего 0 не строка, а массив символов. |
|
01.09.2004, 14:23 | #3 |
Участник
|
Да ведь проовал уже, и с 11, и с 100-го и с 1000-го, а результат тот же
|
|
01.09.2004, 14:32 | #4 |
Участник
|
BorDark, извините.
Вы размещаете строку с 0 байта. Поэтому у вас все правильно. Это я протормозил. А вот глюк похоже имеет место быть. Если переставить строки местами PHP код:
Обращайтесь к вашему партнеру или регистрируйте ошибку в сервисной системе, если вы сами являетесь партнером. Обходной путь сейчас - устанавливать байты посимвольно. |
|
01.09.2004, 15:47 | #5 |
Участник
|
Эх
Если переставить строки, то число без проблем ложится по своему адресу. но у меня кадое смещение является полем структуры и устанавливать все последующие поля заново после изменения текстового члена структуры ой как не хочется, а поменять саму структуру я не могу - он регламентирована АПИ кристала репорта.
Я пробовал так static void Job7(Args _args) { binary bin = new binary(16); int n = 666; str 9 s = "123456789"; int i; char c; ; bin.word (11, n); for(i = 0; i <= 15; i++) { c = substr(s, i + 1, 1); bin.string(i, c); } box::info(strfmt("%1", bin.Word(11))); // все равно 0 } но ничего не добился. А что Вы имеете ввиду под установкой байтов посимвольно? |
|
01.09.2004, 16:55 | #6 |
Участник
|
Re: Эх
Цитата:
Изначально опубликовано BorDark
А что Вы имеете ввиду под установкой байтов посимвольно? только не надо пользоваться методом string Вот это работает - проверено на Axapta 3.0 SP3 PHP код:
|
|
01.09.2004, 19:08 | #7 |
Участник
|
Похоже, что больше ничего не остается
Да я, собственно, так и сделал уже, просто кривовато оно как-то, не по людски, получается
Ну, раз больше ничего не остается, буду использовать это. Спасибо, mazzy, за внимание к теме и дельные советы. |
|
|
|