Скачать MetaTrader 5

Вопрос: kernel32.dll _lread

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Публикуй программы в Code Base. Увеличивай свой рейтинг!
Nikolay Khrushchev
19184
Nikolay Khrushchev 2012.02.22 00:07 

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

имеем 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 так принципиально чтобы принимающий буфер не был пустым? 

Serge
457
Serge 2012.02.22 10:26  
MrGold166:

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

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

 

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

 

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

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

string char;

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

string char="x";

 

 

 

 

220Volt
1175
220Volt 2012.02.22 11:15  
Единственное что приходит мне в голову: нет присвоения - нет выделения памяти (пустой указатель), но сомнеительно это...
Alexander Laur
7692
Alexander Laur 2012.02.22 11:25  
MrGold166:

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

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

В первой строчке Вы объявили переменную, выделили под нее память.

Во второй строчке Вы инициализировали переменную, присвоили ей значение.

Что у Вас будет читать, если нет значения? 

Serge
457
Serge 2012.02.22 11:28  
MrGold166:

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

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

 

 

 

 

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


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

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

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

 

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

 

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

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

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

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

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

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

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

нет, Graff ответил в чем причина. Но спасибо. 
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий