Проблема в следующем: в пользовательскую функцию передается значение NULL , но оказывается это значение уже не NULL, а 0. В связи с чем пара вопросов:
1. как передавать параметр NULL
2. как определить переменная является NULL или нет.
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 это не ноль?
А разве не -1? (Я могу и ошибаться)
А разве не -1? (Я могу и ошибаться)
Вообще-то я тоже могу ошибаться,
на Си писал лет 15 назад или более :)
Память не резиновая ...
выдержка из файла AFX.H
// Standard constants #undef FALSE #undef TRUE #undef NULL #define FALSE 0 #define TRUE 1 #define NULL 0
В С++ над NULL не проводится операция приведения типа
Вы путаете чтото?
В С++ NULL - это макрос, вместо которого препроцессор в текст подставляет символ 0.
Для самого компилятора NULL не существует и типа не имеет, поэтому говорить о приведении типа смысла не имеет.
Так что говорить можно только о приведении типа для целого, и тут NULL не отличается от всех прочих целых.
Приведение целого типа к типу строка в MQL есть (видимо по аналогии с JavaScript и пр.), а С++ его нет. Там есть перекрытие операций, когда для выражений типа "ааааа" + 999 вы можете определить свою функцию типа string add(string, int), которая преобразует int в string и возвращает их конкатенацию. Т.е. это не приведение типов компилятором, а скрытый вызов пользовательской функции.
С другой стороны строки в С передаются через указатели,
отсюда наверное и путаница (MQL и С) ...
Или я чтото не то говорю?
(типа - чтото с памятью моей стало :))
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
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 или нет.