Скачать MetaTrader 5

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

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

и все же,

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

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

и все же,

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


При чтении элемента массива строковых переменных, который не был ранее инициализирован.
wladimir
1160
wladimir  
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);
wladimir
1160
wladimir  
при создании 2 или более переменых, ERROR 4008 выпадает всегда на index=1
Рустам
3597
Рустам  
коллизия однако, смотрим :
Константа Значение Описание
NULL0Указывает пустое состояние строки

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

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

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

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

Рустам
3597
Рустам  

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

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

for(int i=GlobalVariablesTotal(); i>=0; i--) {
                string name = GlobalVariableName(i);
Алексей Тарабанов
7323
Алексей Тарабанов  

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

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

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

o_o
Модератор
24106
o_o  
wlad:

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


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

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

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

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий