А влогах ошибки ни какой нет?) Я не пользуюсь import-ом, я включаю файл в тело эксперта напрямую, т.е. через #include И всё замечательно работает Пример: Эксперт
komposter: А влогах ошибки ни какой нет?)
Я не пользуюсь import-ом, я включаю файл в тело эксперта напрямую,
т.е. через #include
И всё замечательно работает
Пример:
Эксперт
библиотека test_lib.mqh - должна быть в папке include:
RunTestFunction(){Print(testVar);
}
зы: пока писАл, заметил: ты int testVar; повторно объявляешь в библиотеке.
Её значение и выводилось на принт =)
А если я не объявлю переменную то библиотека test_lib просто не скомпилируется:
типа нет такой переменной.
Я привёл этот пример как шаблон, что можно сделать чтобы объявить
общую переменную и иметь к ней доступ с разных файлов.
Есть ли такой механизм?
Вот скиф предлагает объявить общую переменную в файле .mq4 и включать
через #include его везде где, переменная будет использоваться.
И это эквивалент того что в каждом файле объявить эту пеерменную.
Я это уже пробовал.
Как вот передавать одну глобальную переменную об]явленную
в одном модуле (файле) в другой файл для расчётов в функциях
там каких-то
В си бы это я сделал черз extern. А в mql4 он играет другую роль. Делает
их как входные параметры эти переменные.
А вообще я понял ваш подход. Но я не хочу влючать один файл c кодом
в другой. Поэтому-то и разделил их. Хотел чтобы у меня одни и
те же были переменные глобальные, но обособленные а кое какие
общие.
Например если обявлю int Var в одном файле и в другом то это будут
совсем разные пеерменные. В языка си если в другом файле приписать
extern то это сделает переменную общей для модуля где она объявлена
и в модуле где она продекларирована с extern int Var.
Я уже склоняюсь к написанию DLL. Хотя скрипт меня по началу устраивал.
Но вот эти заморочки
Нет, если переменная объявлена вне всех ф-ций, она будет видна
отовсюду. Нельзя делать "обособленные" глобальные переменные.
А проблемы я не вижу абсолютно - в тело эксперта включается необходимое
кол-во библиотек, и все ф-ции, которые используются в работе
видят все переменные, объявленные на гл. уровне.
В чём трабл?)
Трабл заключается в смешивании понятий. Библиотека - это выполняемый
модуль, существующий отдельно.
Вы же используете включаемые файлы исходных текстов. Это - правильный
подход, но не надо включаемые исходные файлы называть библиотекой.
Проблема ещё вот в чём. Я объявил глобальную переменную string sVar
в библиотеке одной и прописал в ней функции типа string GetStringVar()
и
SetStringVar(string str) А в другой библиотеке пытаюсь вызвать GetStringVar()
и она мне возващается пустую строку или "506" :). Хотя я проинициализировал
её c "test_string" в библиотеке, где функции эти объявлены. Хотя,
если я вызываю GetStringVar() в главном модуле советника, который импортирует
библиотеку с этими функциями, то мне возвращается нормальная
строка. С этим сегодня вожусь и не пойму в чём проблема.
А алгоритм включения библиотек по компостеру это всё равно,
что пистать все функции и переменные в одном файле. Это простой
подход, но тогда все глобальные переменные и функции должны называться уникальным именем иначе не скомпилируется
код.
Трабл заключается в смешивании понятий. Библиотека - это выполняемый
модуль, существующий отдельно.
Вы же используете включаемые файлы исходных текстов. Это - правильный
подход, но не надо включаемые исходные файлы называть библиотекой.
ОК, будем называть по-другому ;)
Например, просто "включаемый файл" )
Вот скиф предлагает объявить общую переменную в файле .mq4 и включать
через #include его везде где, переменная будет использоваться.
Я этого не предлагаю.
Если все глоб. перем. собрать в один файл, то его с помощью #include
нужно присоединить в головной файл (например, эксперт, содержащий
функции) один раз. Объявленные таким образом глоб. переменные будут доступны
всем функциям такого эксперта, причём как явно написанным в
самом эксперте, так и присоединённым в него с помощью #include. При
этом ни в каких функциях эксперта эти переменные объявлять
не нужно; они уже доступны, нужно просто к ним обратиться.
Вот скиф предлагает объявить общую переменную в файле .mq4 и включать
через #include его везде где, переменная будет использоваться.
Я этого не предлагаю.
Если все глоб. перем. собрать в один файл, то его с помощью #include
нужно присоединить в головной файл (например, эксперт, содержащий
функции) один раз. Объявленные таким образом глоб. переменные будут доступны
всем функциям такого эксперта, причём как явно написанным в
самом эксперте, так и присоединённым в него с помощью #include. При
этом ни в каких функциях эксперта эти переменные объявлять
не нужно; они уже доступны, нужно просто к ним обратиться.
Правильно, но это и есть включаемый файл, а значит все глобальные переменные в этом включаемом файле должны быть с уникальными именами.
Нет возможности в разных файлах-модулях объявить одноимённую
переменную. А такое часто приходится делать, иначе замучаешься
придумывать имена переменных, искажая их смысл или приписывать
там чёрточки, буковки и прочую билиберду к ним, делая код потом
не читабельным для себя самого.
Вот к примеру я хочу сделать две библиотеки сейчас. Названия
большинства массивов и переменных и функций в них совпадают,
но отличается алгоритм расчётов в этих функциях несколько.
И как теперь быть? Переназвать все массивы, глобальные переменные
и названия функций. Не удобно!
Если это одна переменная, то она одна. Хоть глобальная, хоть
локальная.
Если это другая переменная по сути, то у неё и название другое.
По-моему, это просто.
А не удобно только поначалу. Бывает трудно управляться с большим
количеством новых понятий. А когда освоишься, то становится
мало..:)
Если это одна переменная, то она одна. Хоть глобальная, хоть
локальная.
Если это другая переменная по сути, то у неё и название другое.
По-моему, это просто.
А не удобно только поначалу. Бывает трудно управляться с большим
количеством новых понятий. А когда освоишься, то становится
мало..:)
Ну может вы и правы что можно привыкнуть, но я привык писать на
Си, Яве и Паскале и в каждом языке в каждом модуле программы
можно было объявлять свои глобальные переменные одноименные с переменными в другом модуле - индексы, имена массивов,
флаги или функции. Но в MQL4 хоть и похож на си но во много отличается
в структуре программы.
Поэтому думаю что буду создавтаь код и компилировтать его в
DLL. Здесь правда другие проблемы возникают с доступность предопределённых
переменных и функций MQL4. Надо посмотреть как в примере. А то
придётся думаю всё же делать как скиф и компостер :) Грубо но
зато дёшево надёжно и практично :)
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Я не пользуюсь import-ом, я включаю файл в тело эксперта напрямую, т.е. через #include
И всё замечательно работает
Пример:
Эксперт
библиотека test_lib.mqh - должна быть в папке include:
зы: пока писАл, заметил: ты int testVar; повторно объявляешь в библиотеке. Её значение и выводилось на принт =)
А влогах ошибки ни какой нет?)
Я не пользуюсь import-ом, я включаю файл в тело эксперта напрямую, т.е. через #include
И всё замечательно работает
Пример:
Эксперт
библиотека test_lib.mqh - должна быть в папке include:
зы: пока писАл, заметил: ты int testVar; повторно объявляешь в библиотеке. Её значение и выводилось на принт =)
Я привёл этот пример как шаблон, что можно сделать чтобы объявить общую переменную и иметь к ней доступ с разных файлов.
Есть ли такой механизм?
Вот скиф предлагает объявить общую переменную в файле .mq4 и включать через #include его везде где, переменная будет использоваться.
И это эквивалент того что в каждом файле объявить эту пеерменную. Я это уже пробовал.
Как вот передавать одну глобальную переменную об]явленную в одном модуле (файле) в другой файл для расчётов в функциях там каких-то
В си бы это я сделал черз extern. А в mql4 он играет другую роль. Делает их как входные параметры эти переменные.
А вообще я понял ваш подход. Но я не хочу влючать один файл c кодом в другой. Поэтому-то и разделил их. Хотел чтобы у меня одни и те же были переменные глобальные, но обособленные а кое какие общие.
Например если обявлю int Var в одном файле и в другом то это будут совсем разные пеерменные. В языка си если в другом файле приписать extern то это сделает переменную общей для модуля где она объявлена и в модуле где она продекларирована с extern int Var.
Я уже склоняюсь к написанию DLL. Хотя скрипт меня по началу устраивал. Но вот эти заморочки
А проблемы я не вижу абсолютно - в тело эксперта включается необходимое кол-во библиотек, и все ф-ции, которые используются в работе видят все переменные, объявленные на гл. уровне.
В чём трабл?)
В чём трабл?)
Вы же используете включаемые файлы исходных текстов. Это - правильный подход, но не надо включаемые исходные файлы называть библиотекой.
SetStringVar(string str) А в другой библиотеке пытаюсь вызвать GetStringVar() и она мне возващается пустую строку или "506" :). Хотя я проинициализировал её c "test_string" в библиотеке, где функции эти объявлены. Хотя, если я вызываю GetStringVar() в главном модуле советника, который импортирует библиотеку с этими функциями, то мне возвращается нормальная строка. С этим сегодня вожусь и не пойму в чём проблема.
А алгоритм включения библиотек по компостеру это всё равно, что пистать все функции и переменные в одном файле. Это простой подход, но тогда все глобальные переменные и функции должны называться уникальным именем иначе не скомпилируется код.
В чём трабл?)
Вы же используете включаемые файлы исходных текстов. Это - правильный подход, но не надо включаемые исходные файлы называть библиотекой.
Например, просто "включаемый файл" )
Если все глоб. перем. собрать в один файл, то его с помощью #include нужно присоединить в головной файл (например, эксперт, содержащий функции) один раз. Объявленные таким образом глоб. переменные будут доступны всем функциям такого эксперта, причём как явно написанным в самом эксперте, так и присоединённым в него с помощью #include. При этом ни в каких функциях эксперта эти переменные объявлять не нужно; они уже доступны, нужно просто к ним обратиться.
Если все глоб. перем. собрать в один файл, то его с помощью #include нужно присоединить в головной файл (например, эксперт, содержащий функции) один раз. Объявленные таким образом глоб. переменные будут доступны всем функциям такого эксперта, причём как явно написанным в самом эксперте, так и присоединённым в него с помощью #include. При этом ни в каких функциях эксперта эти переменные объявлять не нужно; они уже доступны, нужно просто к ним обратиться.
Нет возможности в разных файлах-модулях объявить одноимённую переменную. А такое часто приходится делать, иначе замучаешься придумывать имена переменных, искажая их смысл или приписывать там чёрточки, буковки и прочую билиберду к ним, делая код потом не читабельным для себя самого.
Вот к примеру я хочу сделать две библиотеки сейчас. Названия большинства массивов и переменных и функций в них совпадают, но отличается алгоритм расчётов в этих функциях несколько. И как теперь быть? Переназвать все массивы, глобальные переменные и названия функций. Не удобно!
Если это одна переменная, то она одна. Хоть глобальная, хоть локальная.
Если это другая переменная по сути, то у неё и название другое.
По-моему, это просто.
А не удобно только поначалу. Бывает трудно управляться с большим количеством новых понятий. А когда освоишься, то становится мало..:)
Я не согласен.
Если это одна переменная, то она одна. Хоть глобальная, хоть локальная.
Если это другая переменная по сути, то у неё и название другое.
По-моему, это просто.
А не удобно только поначалу. Бывает трудно управляться с большим количеством новых понятий. А когда освоишься, то становится мало..:)
Поэтому думаю что буду создавтаь код и компилировтать его в DLL. Здесь правда другие проблемы возникают с доступность предопределённых переменных и функций MQL4. Надо посмотреть как в примере. А то придётся думаю всё же делать как скиф и компостер :) Грубо но зато дёшево надёжно и практично :)