Показать сообщение отдельно
Старый 10.03.2009, 09:14   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Особенности поведения str
Обнаружил интересные вещи. В AX4, как оказалось, размер str ограничен загадочным образом:
X++:
    int i,j;

    str  s;
    str s2;
    SysOperationProgress p = new SysOperationProgress();
    ;



    try
    {

        while (i <= 140000000)
        {
            i += 1000;

            j =strlen(s);

            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";

            s2 = s;

            p.setText(strfmt("%1", strlen(s)));
        }
    }
    catch
    {
        info(strfmt("last %1", j));
    }
Аксапта в некоторый момент выдает: "Недостаточно памяти для исполнения кода".
Момент этот зависит от количества знаков в строке. То есть при превышении некоторого количества знаков в строке, с ней невозможно производить никаких операций. Допустимое количество знаков зависит, вероятно, от количества свободной памяти в системе. У меня падает обычно примерно на 4000000 символов. Однажды упало где-то на 2000000. Опять же, значение не фиксировано, может меняться, но колеблется в этом районе. Для себя я решил, что надежное значение - 1000000 символов.

Дальше, нельзя выставить размер строки больше 1000 символов:
X++:
str 2000 s;
В отладчике можно увидеть, что до присвоения какого-либо значения переменной размер ее не определен. В момент присвоения размер устанавливается (если было указано больше 1000) в 1000 символов. Разумеется, если присваемое значение имеет длину более 1000 символов, то с оставшейся частью строки можно попрощаться.

В AX3 дела обстоят уже лучше. Размер строки не ограничивается. Во всяком случае, я не дождался окончания работы вышеуказанного джоба.
Но также нельзя объявлять строки больше 1000 символов - режутся как и в 4-ке.
Кроме того, при передачи строк большого размера от сервера к клиенту, тот принудительно обрывает связь.

Еще одна особенность - по мере роста строки затрачивается все больше времени на его модификацию. Непонятно почему, strlen занимает много времени.

Вот такие дела... Из-за ограничения размера str, кстати, падают некоторые ресурсоемкие операции.