Показать сообщение отдельно
Старый 05.06.2007, 12:06   #1  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
! контейнер: += трагедия вставки пустой строки.
предлагаю вашему вниманию очередную бочину в энджине аксапты (ax3sp2):
демонстрирует его следующий джобик: кодирует строку в штрих код с попутной вставкой пустой строки в контейнер.
X++:
#define.bug(0)
#define.showstep(1)
#define.str2code("123")

static void Job144(Args _args)
{
container   ret1;
str         cret;
int         clen;
int         i;

// кодирует barcode
str  encode(str _string)
{
    DLLFunction         _BC_Code128;
    DLL                 _barcodeDLL;
    str                 barcodeStr;
;
    try
    {
        _barcodeDLL = new DLL('Bcfont32');
    } catch(Exception::Internal)
    {
        info("barcodeDLL error!!!");
        return '';
    }
    _BC_Code128 = new DLLFunction(_barcodeDLL,'BC_Code128');
    _BC_Code128.returns(ExtTypes::STRING);
    _BC_Code128.arg(ExtTypes::STRING);
    barcodeStr = _BC_Code128.call(_string);
    _barcodeDLL = null;
    _BC_Code128 = null;
    return barcodeStr;
}

;
    try
    {
        cret =  encode(#str2code);
        info("до вставки в контейнер : '"+cret+"'");
        for(i=1;i<10;i++)
        {
            #if.bug(1)
                ret1 += "";
            #endif
            #if.bug(0)
                ret1 = conins(ret1,conlen(ret1)+1,"");
            #endif
            #if.showstep(1)
                cret =  encode(#str2code);
                info(strfmt("вставка %1, строка: '%2', баркод: '%3'",i,#str2code,cret));
            #endif
        }
        cret =  encode(#str2code);
    }
    catch
    {
        info("catch !!!");
    }

    info("после вставки в контейнер : '"+cret+"'");
}
В джобике проверяю как отрабатывает вызов dll функции после разных методов вставки в контейнер: ret1 += "" и ret1 = conins(ret1,conlen(ret1)+1,"")

для начала ставим #define.bug(0) -> происходит 10 вставок в контейнер с помощью conins + 10 удачных кодирований.
теперь ставим #define.bug(1) -> происходит 10 вставок в контейнер оператором += и 10 кодирований из которых 3 правильно, остальные нет.
для чистоты эксперимента можно исключить вызов кодирования в каждой итерации #define.showstep(0).
(совсем забыл, после того как контейнер "уложит" вызов ф-ции кодирования, функция уже нормально не отработает - перезапуск клиента). Т.е. нарушение каких то внутренних структур на лицо.

Вывод: не использовать для контейнера оператор +=<str>

PPS: вывод оказался не верным, что не может не радовать - базовые операторы таки работают нормально.
__________________
--- SHiSHok

Последний раз редактировалось SHiSHok; 06.06.2007 в 16:24. Причина: более понятно написал