MQL4. Нужно ввести блокировку роботов через глобальную переменную. Передрал все из учебника:https://book.mql4.com/ru/variables/globals Но при компиляции предупреждение, ставящее меня в тупик

★3
ВНИМАНИЕ! КОММЕНТАРИИ ПЕРВОГО УРОВНЯ В ВОПРОСАХ УПОРЯДОЧИВАЮТСЯ ПО ЧИСЛУ ПЛЮСИКОВ, А НЕ ПО ВРЕМЕНИ ПУБЛИКАЦИИ.
Что там не понятного? Функция должна возвращать значение, либо сделайте ее void
avatar
SAI

Алексей С, как добросовестный чайник, я взял один к одному из учебника кусок кода. По ссылке. Там стоит return.

Насколько уместно использование void в данном случае я не знаю. Что-то мне подсказывает, что неуместно, поскольку это блок задания глобальных переменных, объявленных за пределами всех функций.

Возможно это и можно, я просто этого не знаю. А там где я не уверен, я осторожничаю.

 

avatar
return(0);
avatar
DedBoroded, 

Что касается замены на return(0) то это решение очевидно. Что меня останавливает? Был случай такой замены в другой задаче.

После него блок (а это был один из узловых блоков программы) стал неработоспособен вообще. Пришлось обходить другими средствами.

avatar
Николай Скриган, конкретно в данном примере ничего плохого от этого не будет.
avatar

DedBoroded, пасиб. Попробую.

Вопрос немного в сторону. А зачем здесь необходимо использование спецфункции init.
Ведь мне всего навсего нужно задать начальное значение глобальной переменной. Но без init меня посылают далеко....

int init() // Спец. функция init
{
GlobalVariableSet(Block,0);
return; // Выход из init()
}

avatar
Николай Скриган, 

А как задать начальное значение по другому? либо никак, либо придётся это делать на каждом тике, что не правильно.

Хотя никак по умолчанию считается =0, но лучше задавать начальные значения явно.

avatar

DedBoroded, глобальныt переменныt программы я задаю без init

Что касается переменной терминала GV, то попытка присвоить ей значение ноль без дополнительных хитростей привела к ошибке компиляции с совершенно идиотским комментарием о том, что не хватает то ли запятой то ли скобки. Уже не помню. Пришлось лезть в учебник и по образу и подобию написанного в нем использовать init, добавив по две строчки выше и ниже значимого оператора.

avatar
DedBoroded, да, спасибо. Надеюсь все будет ОК. Сегодня проверять уже нет ни сил ни желания.
avatar

DedBoroded, пасиб. Сделал немного по-другому. Мне сказали, что в учебнике устаревшие данные относительно языка. Сейчас это должно выглядеть так:

int OnInit()
{
GlobalVariableSet(Block,0);
return(INIT_SUCCEEDED);
}

avatar

Николай Скриган, без разницы, что retern(0) что return(INIT_SUCCEEDED) — это одно и тоже.

Не надо путать глобальные переменные программы и терминала. Первые можно инициализировать и при их создании, вторые — только явно.
Приведённый код не важный — при делении нужно проверить значение на 0 сначала.

avatar
DedBoroded, я не путаю. С глобальными переменными программы я работаю давно и без проблем. С переменными терминала столкнулся только сегодня. Поэтому нюансов не знаю, а в документации все очень скупо описано. Писать у нас не умеют и не хотят. Для того кто в курсе, все ясно, для того кто по нулям, ничего не ясно. Поэтому и возникли вопросы.

P.S. В учебнике стоял проcто return. На это ругался компилятор.
avatar
DedBoroded, 
Эту фразу «Приведённый код не важный — при делении нужно проверить значение на 0 сначала.» абсолютно не понял. Причем тут деление.
avatar

Николай Скриган, Прежде чем делить на 0 нужн опроверить переменную Point, что она != 0, иначе будет ошибка.

Хелп по mql4/5 отличный, написано всё подробно, есть куча примеров… это не qlua.

avatar
DedBoroded, Point не равна нулю по определению.
Впрочем, вы обратили мое внимание на то, что можно сократить часть избыточных операций и ненужных промежуточных вычислений, которые я ввел год назад, по старой привычке явно оговаривая всё и вся, ибо машина дура. Это деление тоже к ним относится :)
avatar

Николай Скриган, Вот из-за таких предубеждений и появляются трудноуловимые баги — как это поинт не равна 0 по определению? Эта переменная может не успеть инициализироваться окружением при первом запросе. Такие моменты случаются не редко, поэтому безопаснее проверять… чисто опыт.

avatar
DedBoroded, спасибо. Учту. Я вообще исключу эту операцию за ненадобностью. Хотя возможность неинициализации исключена, так как вызов пользовательского индикатора запускает достаточно длинную цепочку вычислений. :)
avatar
Бросайте вы это дело. Женитесь, ипотеку возьмите :)
avatar
ELab, вот с этим согласен на 100% — мт4 не заслуживает внимания
avatar

Только зарегистрированные и авторизованные пользователи могут оставлять ответы.

Залогиниться

Зарегистрироваться

теги блога Николай Скриган

....все тэги



UPDONW
Новый дизайн