Вопрос: kernel32.dll _lread

 

собственно вопрос не важный но любопытство берет верх.

имеем 2 куска кода: 

   handle=_lopen (FileLocation,2); 
   string char="x"; <<< вот тут разница
   _lread (handle,char,4);
   Print(char);

 

   handle=_lopen (FileLocation,2); 
   string char;
   _lread (handle,char,4);
   Print(char);

 почему второй не работает а первый работает? почему функции _lread так принципиально чтобы принимающий буфер не был пустым? 

 
MrGold166:

собственно вопрос не важный но любопытство берет верх.

имеем 2 куска кода: 

 

 почему второй не работает а первый работает? почему функции _lread так принципиально чтобы принимающий буфер не был пустым? 

 

Наверно потому, что перед использованием переменной ее нужно инициализировать.
 
Graff:
Наверно потому, что перед использованием переменной ее нужно инициализировать.

я это и сделал:

string char;

 но это не работает, пока не присвоишь переменной любое значение, например: 

string char="x";

 

 

 

 

 
Единственное что приходит мне в голову: нет присвоения - нет выделения памяти (пустой указатель), но сомнеительно это...
 
MrGold166:

я это и сделал:

 но это не работает, пока не присвоишь переменной любое значение, например: 

 

 

 

 

string char;
Тут Вы объявили переменную, а инициализация (фактическое выделение памяти) произошла при записи в нее информации. Можете попробовать перенести и откомпилировать этот код в вижуал студию в приложение на языке С - получите тоже самое.
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
Основы языка / Переменные / Создание и уничтожение объектов - Документация по MQL5
 
MrGold166:


Кстати, а чего вы ожидаете? Хотите скопировать четыре байта в нулевой буфер? Нехорошо. Позаботиться о размере буфера - ваша задача. И на каком этапе ошибка (при компиляции, или при отладке)? А первый вариант прокатывает, потому что буфер как раз получается четыре байта. И еще, очень любопытно, вы объявили переменную с именем char? Как так....
 
MrGold166:

собственно вопрос не важный но любопытство берет верх.

имеем 2 куска кода: 

 

 почему второй не работает а первый работает? почему функции _lread так принципиально чтобы принимающий буфер не был пустым? 

 

Тут может быть два варианта:

1 Вы переопределили зарезервированное под тип char слово как переменную типа string (готовьтесь что компилятор может как то всбыркнуть).

2 Вы определили переменную char но не инициализировали её char=""; тогда в памяти находится непойми что и опять же компилятор может как то не так как вы желаете это обрабатывать.

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
220Volt:
Кстати, а чего вы ожидаете? Хотите скопировать четыре байта в нулевой буфер? Нехорошо. Позаботиться о размере буфера - ваша задача. И на каком этапе ошибка (при компиляции, или при отладке)? А первый вариант прокатывает, потому что буфер как раз получается четыре байта. И еще, очень любопытно, вы объявили переменную с именем char? Как так....
было сделано в mql4, сути не меняет. 
 
Graff:
Тут Вы объявили переменную, а инициализация (фактическое выделение памяти) произошла при записи в нее информации. Можете попробовать перенести и откомпилировать этот код в вижуал студию в приложение на языке С - получите тоже самое.
спасибо! 
 
Urain:

Тут может быть два варианта:

1 Вы переопределили зарезервированное под тип char слово как переменную типа string (готовьтесь что компилятор может как то всбыркнуть).

2 Вы определили переменную char но не инициализировали её char=""; тогда в памяти находится непойми что и опять же компилятор может как то не так как вы желаете это обрабатывать.

нет, Graff ответил в чем причина. Но спасибо. 
 

Стало интересно, решил проверить на каком этапе занимается память (инициализация или объявление), написал такого вида код:

int _tmain(int argc, _TCHAR* argv[])
{
   char k[100];                 
   cin >>k;                         // Здесь процесс занимает 412 KB
   double *p;
   p = new double[20000000];
   cin >>k;                        // Здесь процесс занимает 156900 KB
   delete p;
   return 0; 
}

Мой вывод: память выделяется при объявлении, а не при инициализации.  А на счет String - считаю что это класс, следовательно момент выделения памяти под его буфер зависит от конкретной реализации класса String.