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

 
Пример кода:
double func(string symbol, int timeframe, int shift)
{
double res=iAC(symbol, timeframe, shift);
Print("res=",res);
res=iAC(NULL, timeframe, shift);
Print("res=",res);
return(res);
}

int start()
{
func(NULL,PERIOD_M15,0);
return(0);
}

Проблема в следующем: в пользовательскую функцию передается значение NULL , но оказывается это значение уже не NULL, а 0. В связи с чем пара вопросов:
1. как передавать параметр NULL
2. как определить переменная является NULL или нет.
 
Проблема в следующем: в пользовательскую функцию передается значение NULL , но оказывается это значение уже не NULL, а 0. В связи с чем пара вопросов:
1. как передавать параметр NULL
2. как определить переменная является NULL или нет.

А NULL и есть 0. Обозначение NULL вместо 0 используется лишь для удобства восприятия.
 
А NULL и есть 0

Тогда подскажите пожалуйста, что я делаю неправильно. Пример ниже должен возвращать идентичные значения, но этого не происходит

double AC( string symbol, int timeframe, int shift)
{
double res=iAC(symbol,timeframe,shift);
return(res);
}

int start()
{
//----
Print("iAC ",iAC(0,0,0));
Print("AC ",AC(0,0,0));
//----
return(0);
}
 
Дело в том, что NULL - это предопределенный нуль. В данном случае его можно передавать напрямую в целевую функцию, которая распознает его. А при косвенной передаче через другие параметры происходит автоматическое приведение типов, что дает:

void test(string symbol) { Print("Symbol: ",symbol); }
void start() { test(NULL);  }



вывод: "Symbol: 0"
То есть, нуль автоматически преобразовался в строку "0".
Используйте вызов AC(Symbol(),0,0));

 
Спасибо за разъяснения. Все ясно. NULL это вовсе не NULL, как в C++, а просто ноль.
 
Спасибо за разъяснения. Все ясно. NULL это вовсе не NULL, как в C++, а просто ноль.

А разве в С NULL это не ноль?
Просто в С есть указатели и NULL - это пустой указатель.
Здесь таких указателей нет.
 
Спасибо за разъяснения. Все ясно. NULL это вовсе не NULL, как в C++, а просто ноль.

А разве в С NULL это не ноль?


А разве не -1? (Я могу и ошибаться)
 
А разве не -1? (Я могу и ошибаться)

Вообще-то я тоже могу ошибаться,
на Си писал лет 15 назад или более :)
Память не резиновая ...
 
выдержка из файла AFX.H
// Standard constants
#undef FALSE
#undef TRUE
#undef NULL

#define FALSE   0
#define TRUE    1
#define NULL    0
 
выдержка из файла AFX.H
#define NULL 0

В С++ над NULL не проводится операция приведения типа
 
В С++ над NULL не проводится операция приведения типа

Вы путаете чтото?

В С++ NULL - это макрос, вместо которого препроцессор в текст подставляет символ 0.
Для самого компилятора NULL не существует и типа не имеет, поэтому говорить о приведении типа смысла не имеет.

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

Приведение целого типа к типу строка в MQL есть (видимо по аналогии с JavaScript и пр.), а С++ его нет. Там есть перекрытие операций, когда для выражений типа "ааааа" + 999 вы можете определить свою функцию типа string add(string, int), которая преобразует int в string и возвращает их конкатенацию. Т.е. это не приведение типов компилятором, а скрытый вызов пользовательской функции.

С другой стороны строки в С передаются через указатели,
отсюда наверное и путаница (MQL и С) ...

Или я чтото не то говорю?
(типа - чтото с памятью моей стало :))