я использую в разных функциях одну и ту же конструкцию
if(FileReadStruct(handle,temp_rate)!=60)
{
IsError=true;
Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError());
return;
}
Однако, одни функции имеют тип void, а другие возвращают значение, поэтому из них я возвращаю ноль:
return(0);
Могу ли я сделать такой волшебный макрос, который в каждом случае подставлял бы мне нужный вариант?
я использую в разных функциях одну и ту же конструкцию
Однако, одни функции имеют тип void, а другие возвращают значение, поэтому из них я возвращаю ноль:
Могу ли я сделать такой волшебный макрос, который в каждом случае подставлял бы мне нужный вариант?
Использование return в макросе - есть взведенный пистолет, направленный себе в ногу, а в купе с if - он превращается в пушку))) Но если очень хочется, то:
#define CHECK_READ(dHndl,dRate,dRet) do \
if(FileReadStruct(dHndl,dRate)!=60){ \
IsError=true; \
Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError()); \
return dRet;} while(false)
...
CHECK_READ(handle,temp_rate,);
...
CHECK_READ(handle,temp_rate,0);
...
Не проверял, но должно работать. Заодно пушку обратно в пистолет превратил)))
То есть я передаю последним параметром или значение для return, или пустоту, которая превратится в
return ;
а пробел ничего не значит. Ну конечно, как я забыл, что его можно использовать и без моих любимых скобок.
return(x);
return x; //равноценны
А не подскажите заодно, зачем эта конструкция засунута внутрь цикла, который может выполниться только один раз? Это пушка, превращённая обратно в пистолет? Возможны ситуации типа бесконечной рекурсии или что-то в этом роде?
То есть я передаю последним параметром или значение для return, или пустоту, которая превратится в
а пробел ничего не значит. Ну конечно, как я забыл, что его можно использовать и без моих любимых скобок.
А не подскажите заодно, зачем эта конструкция засунута внутрь цикла, который может выполниться только один раз? Это пушка, превращённая обратно в пистолет? Возможны ситуации типа бесконечной рекурсии или что-то в этом роде?
if (condition) CHECK_READ(h,r,0); else CHECK_READ(h,r,1);
Разверните макрос без do-while обертки и посмотрите, что получится)))
Vladimir Simakov: if (condition) CHECK_READ(h,r,0); else CHECK_READ(h,r,1);
Разверните макрос без do-while обертки и посмотрите, что получится)))
if (condition) if(FileReadStruct(h,r)!=60){
IsError=true;
Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError());
return 0;}; else if(FileReadStruct(dHndl,dRate)!=60){
IsError=true;
Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError());
return dRet;};
=
if (condition)
if(FileReadStruct(h,r)!=60)
{
IsError=true;
Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError());
return 0;
};
else
if(FileReadStruct(dHndl,dRate)!=60)
{
IsError=true;
Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError());
return dRet;
};
Кажется, так, если я правильно понял принцип подстановки.
Лишние точки с запятой после фигурных скобок. И непонятно, к чему теперь относится else.
Жаль, что нет, видимо, простого способа автоматизировать разворачивание макросов, чтобы посмотреть, что получится. Разве что замутить собственный скрипт.
Спасибо! Не зря после while в макросе нет точки с запятой.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Вам для мт4 или мт5? тот код который я выставлял - я удалил. не сразу заметил что тут обсуждают мт4
MQL4
MQL4
Советую - много хорошего можно найти https://www.mql5.com/ru/forum/131859/page6#comment_3359705
Более конкретный и, возможно, интересный вопрос:
я использую в разных функциях одну и ту же конструкцию
Однако, одни функции имеют тип void, а другие возвращают значение, поэтому из них я возвращаю ноль:
Могу ли я сделать такой волшебный макрос, который в каждом случае подставлял бы мне нужный вариант?
Более конкретный и, возможно, интересный вопрос:
я использую в разных функциях одну и ту же конструкцию
Однако, одни функции имеют тип void, а другие возвращают значение, поэтому из них я возвращаю ноль:
Могу ли я сделать такой волшебный макрос, который в каждом случае подставлял бы мне нужный вариант?
Использование return в макросе - есть взведенный пистолет, направленный себе в ногу, а в купе с if - он превращается в пушку))) Но если очень хочется, то:
Не проверял, но должно работать. Заодно пушку обратно в пистолет превратил)))
Спасибо!
То есть я передаю последним параметром или значение для return, или пустоту, которая превратится в
return ;а пробел ничего не значит. Ну конечно, как я забыл, что его можно использовать и без моих любимых скобок.
А не подскажите заодно, зачем эта конструкция засунута внутрь цикла, который может выполниться только один раз? Это пушка, превращённая обратно в пистолет? Возможны ситуации типа бесконечной рекурсии или что-то в этом роде?
Спасибо!
То есть я передаю последним параметром или значение для return, или пустоту, которая превратится в
а пробел ничего не значит. Ну конечно, как я забыл, что его можно использовать и без моих любимых скобок.
А не подскажите заодно, зачем эта конструкция засунута внутрь цикла, который может выполниться только один раз? Это пушка, превращённая обратно в пистолет? Возможны ситуации типа бесконечной рекурсии или что-то в этом роде?
if (condition) CHECK_READ(h,r,0); else CHECK_READ(h,r,1);
=
Кажется, так, если я правильно понял принцип подстановки.
Лишние точки с запятой после фигурных скобок. И непонятно, к чему теперь относится else.
Жаль, что нет, видимо, простого способа автоматизировать разворачивание макросов, чтобы посмотреть, что получится. Разве что замутить собственный скрипт.
Спасибо! Не зря после while в макросе нет точки с запятой.