Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Как купить продукт в MetaTrader AppStore? Прочитай статью об этом!
Stanislav Korotky
17924
Stanislav Korotky 2010.04.23 21:46 
Описание в хелпе как всегда минимальное. На форуме ответа не нашел. Что значит, что строка "неинициализирована"? Как такую вообще можно получить? По умолчанию, переменная типа string инициализируется пустой строкой, даже если явно через присваивание это не указано.
wladimir
1162
wladimir 2011.10.19 21:03  

и все же,

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

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

и все же,

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


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

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

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

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

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

Рустам
3597
Рустам 2011.10.19 21:57  

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

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

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

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

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

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

o_o
Модератор
23694
o_o 2011.10.19 22:14  
wlad:

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


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

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

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

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