Ошибка передачи NULL параметра в функцию - страница 2

 
для констант (коей является NULL) "приведение типов" проводится на этапе компиляции. то есть подстановку 0.0 вместо 0 для операций с даблами даже и нельзя назвать приведением типов, так как нету лишней операции.
 
Приведение целого типа к типу строка в MQL есть (видимо по аналогии с JavaScript и пр.), а С++ его нет.

Отсюда вывод: у MQL IV и С++ много общего, но есть и различия. Главное не запутаться и разобраться в чем причина ошибки.
 
С другой стороны строки в С передаются через указатели,
отсюда наверное и путаница (MQL и С) ...

Совершенно верно.
В С++ нет типа string, вместо него используется указатель на массив символов (char *str1).
Но можно объявить тип string таким образом: typedef char * string;
Таким образом в С++ переменная типа string равная NULL является пустой строкой, т.е. равна "",
в то время как в MQL IV переменная типа string равная NULL не является пустой строкой, она равна "0"
/Ч.Т.Д.
 
в то время как в MQL IV переменная типа string равная NULL не является пустой строкой, она равна "0"

Вывод неверен.
 
Но можно объявить тип string таким образом: typedef char * string;
Таким образом в С++ переменная типа string равная NULL является пустой строкой, т.е. равна ""

Неа,
попробуйте в Си обратиться к переменной типа string которая равна NULL.
Либо прога свалится, либо эксепшен получите.
А то, что в некоторых функциях вместо указателя на строку можно передать NULL говорит только о том, что внутри нее есть проверка на этот NULL.
 
Почему не правильно? Вы же сами писали
Дело в том, что NULL - это предопределенный нуль

и далее на собственном же примере...
то есть, нуль автоматически преобразовался в строку "0".

на основе всего вешесказанного можно сделать вывод, что в С++ строка - это указатель на массив символов, а в MQL IV строка - это массив символов или что-то там еще, Вам виднее. Отсюда и получается, что передавать NULL в качестве строкового параметра в пользовательскую функцию нежелательно, т.к. вместо ожидаемого "" получаем "0".
Используйте вызов AC(Symbol(),0,0));
 
Но можно объявить тип string таким образом: typedef char * string;
Таким образом в С++ переменная типа string равная NULL является пустой строкой, т.е. равна ""

Неа,
попробуйте в Си обратиться к переменной типа string которая равна NULL.
Либо прога свалится, либо эксепшен получите.

Вот кусок кода, где все прекрасно работает
#include <iostream.h>
typedef char * string;
void func(string s)
{ cout << "Ex2=" << s << "/"; }

main()
{  cout << "Ex1=" << NULL << "/";
   func(NULL);
   return 0;
}


результат будет следующий : Ex1=0/Ex2=/

А то, что в некоторых функциях вместо указателя на строку можно передать NULL говорит только о том, что внутри нее есть проверка на этот NULL.

Само собой разумеется есть, иначе до сих пор работали бы в Бэйсике на ZX-Spectrum :)

 
Правильно, а теперь скажите что такое:
cout << "Ex2=" << s << "/";


и что такое

cout << "Ex1=" << NULL << "/";


Конкретнее, разберитесь с тем что такое cout << ....
И вы сами ответите на свой вопрос.
Ответ я уже давал выше.

 
Правильно, а теперь скажите что такое:
cout << "Ex2=" << s << "/";


s - указатель на массив символов char, равный NULL, поэтому cout << s дает пустую строку "". Так работают строки в С++

и что такое
cout << "Ex1=" << NULL << "/";


а здесь NULL приводится к типу char и дает ноль, т.е. строку из одного символа содержащую "0". Так обрабатываются строки равные NULL в MQL.
Очевидно, что т.к. в MQL нет указателей вообще (хотя для строк и массивов можно было бы сделать исключение) передача параметров в функции реализована исключительно по значению, а отсюда повышенный расход памяти и процессорного времени.
 
а здесь NULL приводится к типу char и дает ноль, т.е. строку из одного символа содержащую "0".

Это не так, но не в том суть.

Скажите, что такое "<<" ?
И что такое "cout << ..." ?

Дам наводку.
Поищите в *.h файлах описание cout, посмотрите ее тип, и поищите описание этого типа.
И может быть даже в предков углубиться придется.
Поищите там описание оператора "<<", посмотрите сколько их там.
После этого посмотрите то, что вы написали выше.

cout << a - это вызов определенной пользователем функции.
Причем таких функций много, для разных типов переменной а есть своя функция.
И более того, вы можете даже сами добавить несколько таких функций в язык.
Эта конструкция никакого отношения к С++ и к его компилятору не имеет.

Точнее сказать не могу, нет у меня ничего под рукой, ни книг, ни С++ компилятора.
----------------------------------------------------
В общем-то это уже офтопик.
Причина обращения: