AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.08.2009, 20:52   #1  
John_11 is offline
John_11
Участник
 
5 / 10 (1) +
Регистрация: 28.08.2009
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  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,759 / 3627 (178) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
У вас типичный случай с переполнением стека.

Цитата:
Сообщение от John_11 Посмотреть сообщение
X++:
        bin1 = new Binary(8);

        st1.string(0,"Тестовая строка 1");
        st2.string(0,"Тестовая строка 2");

        bin1.binary(0,st1);
        bin1.binary(4,st2);
Вы выделяете под bin память размером 8 байт, а затем заталкиваете в эту область текст, длиной 17 байт. Причем во второй раз еще и со смещением в 4 байта. Вот и получаете странные значения в других переменных, размещенных в стеке.

А если измените порядок переменных в стеке
X++:
static void BinSTR(Args _args)
{
    Binary  st1;
    Binary  st2;
    Binary  bin1;
то скорее всего, аксапта просто вылетать начнет.

См. msdn: http://msdn.microsoft.com/en-us/library/aa500848.aspx
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 31.08.2009, 14:28   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,555 / 2313 (83) +++++++++
Регистрация: 20.08.2005
Сергей, там просто сохраняются адреса, а не сами значения.

Но вот после сохранения адреса, области памяти со строками освобождаются инициализируются заново. Сделайте так
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  
John_11 is offline
John_11
Участник
 
5 / 10 (1) +
Регистрация: 28.08.2009
Да, действительно ошибка была связана с обнулением переменных.
Я вызывал метод в который передавал строку и он мне возвращал 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;
    }
При выходе из данного метода, локальные переменные освобождались и я получал непонятный результат. Хуже всего что он мог воспроизводиться один раз из 10-20 запусков.
Старый 27.10.2017, 15:10   #5  
kia is offline
kia
Участник
 
94 / 19 (1) ++
Регистрация: 07.10.2008
Адрес: Харьков
В продолжение старой темы.
Имеется С-библиотека, которая в 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  
kia is offline
kia
Участник
 
94 / 19 (1) ++
Регистрация: 07.10.2008
Адрес: Харьков
В данном случае размера буфера более чем достаточно.
Вижу пока вариант написать свой метод вместо string() на основе тестового цикла.
То есть, самому считывать строку посимвольно.
Теги
ax3.0, binary, string

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
palleagermark: Saving the reference to a unique record as a string Blog bot DAX Blogs 0 20.10.2008 11:05
gl00mie: View AOCP/RPC Interface Version used by an Arbitrary DAX Binary Blog bot DAX Blogs 0 30.09.2008 16:05
Ошибка времени выполнения: Binary (Объект), метод string вызван с недопустимыми параметрами. mmm DAX: Программирование 4 15.05.2007 16:00
String or binary data would not be truncated DreamCreator DAX: Программирование 4 22.02.2005 03:06
Binary in Axapta BorDark DAX: Программирование 6 01.09.2004 19:08
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:31.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.