Что такое ERR_NOT_INITIALIZED_STRING (4008)?

 
Описание в хелпе как всегда минимальное. На форуме ответа не нашел. Что значит, что строка "неинициализирована"? Как такую вообще можно получить? По умолчанию, переменная типа string инициализируется пустой строкой, даже если явно через присваивание это не указано.
 

и все же,

когда такое выпадает ?

 
когда вы производите операции со строкой, которая не была инициализирована. По-моему само название ошибки говорит за себя.
 
wlad:

и все же,

когда такое выпадает ?


При чтении элемента массива строковых переменных, который не был ранее инициализирован.
 
sergeev:
когда вы производите операции со строкой, которая не была инициализирована. По-моему само название ошибки говорит за себя.

вот код для проверки, при создании более 2 глобалЬных перемен вылезает ERROR 4008

   string name, txt;
   double val;
   int err;
        //--
        GetLastError();                             
        //--
        for(int i=0; i<GlobalVariablesTotal(); i++) {
                name = GlobalVariableName(i);
           val  = GlobalVariableGet(name);
           err=GetLastError();
                if(err!=0) {
                   Alert("ERROR! ",err, " name=",name);
                        //continue;     
           }
                txt=txt+i+" "+name+" = "+val+"\n";
        }
   Comment(txt);
 
при создании 2 или более переменых, ERROR 4008 выпадает всегда на index=1
 
коллизия однако, смотрим :
Константа Значение Описание
NULL0Указывает пустое состояние строки

Но при этом NULL не является строковым типом, следовательно обратившись к строке, или чаще элемент строкового массива которая (который(которые)) предварительно не проинициализированны

Любым строковым значением, например "". Вы получаете 4008 ошибку. Выход: ВСЕГДА ИНИЦИАЛИЗИРОВАТЬ ПЕРЕМЕННЫЕ ПРИ ОБЪЯВЛЕНИИ и не полагаться на препроцесор.

Подобные коллизии замечены даже переменных типа int - если ее объявить без инициализации, а потом использовать например в функциях инкремента \ декремента, то на выходе

вы рискуете получить мусор. (особенно часто это проявляется с локальными переменными объявленными в пользовательских функциях ( чаще объявленными в заголовке функции)).

 

В вашем варианте вот такая конструкция была бы более правильной :

for(int i=GlobalVariablesTotal(); i>=0; i--) {string name = "";
                name = GlobalVariableName(i);
или

for(int i=GlobalVariablesTotal(); i>=0; i--) {
                string name = GlobalVariableName(i);
 

Мдя, не зря Билли грозился принять на работу любого, прочитавшего Кнутта :)

faq, извините, но Ваш код компилятор не пропустит.

Хотя - он ведь и не компилятор вовсе :) Насчет коллизии согласен, но суть, imho,- в БОЛЬШОЙ путанице, допущенной при формировании и реализации правил неявного преобразования типов данных.

 
wlad:

вот код для проверки, при создании более 2 глобалЬных перемен вылезает ERROR 4008


инициализируйте txt до цикла, и симптомы пройдут.
 

И где же скажите компилятор на моем коде запнется ?

Не поставил минус 1 за Объектс тотал - извините забыл, это как то ...

Причина обращения: