доступность одной переменной в разных модулях программы ... - страница 2

 
А влогах ошибки ни какой нет?)
Я не пользуюсь import-ом, я включаю файл в тело эксперта напрямую, т.е. через #include
И всё замечательно работает
Пример:
Эксперт
#include <test_lib.mqh> int testVar; int init() { testVar = 1; } int start() { RunTestFunction(); }

библиотека test_lib.mqh - должна быть в папке include:
RunTestFunction() { Print(testVar); }


зы: пока писАл, заметил: ты int testVar; повторно объявляешь в библиотеке. Её значение и выводилось на принт =)
 
komposter:
А влогах ошибки ни какой нет?)
Я не пользуюсь import-ом, я включаю файл в тело эксперта напрямую, т.е. через #include
И всё замечательно работает
Пример:
Эксперт
#include <test_lib.mqh> int testVar; int init() { testVar = 1; } int start() { RunTestFunction(); }

библиотека test_lib.mqh - должна быть в папке include:
RunTestFunction() { Print(testVar); }


зы: пока писАл, заметил: ты int testVar; повторно объявляешь в библиотеке. Её значение и выводилось на принт =)
А если я не объявлю переменную то библиотека test_lib просто не скомпилируется: типа нет такой переменной.
Я привёл этот пример как шаблон, что можно сделать чтобы объявить общую переменную и иметь к ней доступ с разных файлов.
Есть ли такой механизм?
Вот скиф предлагает объявить общую переменную в файле .mq4 и включать через #include его везде где, переменная будет использоваться.
И это эквивалент того что в каждом файле объявить эту пеерменную. Я это уже пробовал.
Как вот передавать одну глобальную переменную об]явленную в одном модуле (файле) в другой файл для расчётов в функциях там каких-то
В си бы это я сделал черз extern. А в mql4 он играет другую роль. Делает их как входные параметры эти переменные.

А вообще я понял ваш подход. Но я не хочу влючать один файл c кодом в другой. Поэтому-то и разделил их. Хотел чтобы у меня одни и те же были переменные глобальные, но обособленные а кое какие общие.
Например если обявлю int Var в одном файле и в другом то это будут совсем разные пеерменные. В языка си если в другом файле приписать extern то это сделает переменную общей для модуля где она объявлена и в модуле где она продекларирована с extern int Var.
Я уже склоняюсь к написанию DLL. Хотя скрипт меня по началу устраивал. Но вот эти заморочки
 
Нет, если переменная объявлена вне всех ф-ций, она будет видна отовсюду. Нельзя делать "обособленные" глобальные переменные.
А проблемы я не вижу абсолютно - в тело эксперта включается необходимое кол-во библиотек, и все ф-ции, которые используются в работе видят все переменные, объявленные на гл. уровне.
В чём трабл?)
 
komposter:
В чём трабл?)
Трабл заключается в смешивании понятий. Библиотека - это выполняемый модуль, существующий отдельно.
Вы же используете включаемые файлы исходных текстов. Это - правильный подход, но не надо включаемые исходные файлы называть библиотекой.
 
Проблема ещё вот в чём. Я объявил глобальную переменную string sVar в библиотеке одной и прописал в ней функции типа string GetStringVar() и
SetStringVar(string str) А в другой библиотеке пытаюсь вызвать GetStringVar() и она мне возващается пустую строку или "506" :). Хотя я проинициализировал её c "test_string" в библиотеке, где функции эти объявлены. Хотя, если я вызываю GetStringVar() в главном модуле советника, который импортирует библиотеку с этими функциями, то мне возвращается нормальная строка. С этим сегодня вожусь и не пойму в чём проблема.
А алгоритм включения библиотек по компостеру это всё равно, что пистать все функции и переменные в одном файле. Это простой подход, но тогда все глобальные переменные и функции должны называться уникальным именем иначе не скомпилируется код.
 
stringo:
komposter:
В чём трабл?)
Трабл заключается в смешивании понятий. Библиотека - это выполняемый модуль, существующий отдельно.
Вы же используете включаемые файлы исходных текстов. Это - правильный подход, но не надо включаемые исходные файлы называть библиотекой.
ОК, будем называть по-другому ;)
Например, просто "включаемый файл" )
 
Вот скиф предлагает объявить общую переменную в файле .mq4 и включать через #include его везде где, переменная будет использоваться.
Я этого не предлагаю.
Если все глоб. перем. собрать в один файл, то его с помощью #include нужно присоединить в головной файл (например, эксперт, содержащий функции) один раз. Объявленные таким образом глоб. переменные будут доступны всем функциям такого эксперта, причём как явно написанным в самом эксперте, так и присоединённым в него с помощью #include. При этом ни в каких функциях эксперта эти переменные объявлять не нужно; они уже доступны, нужно просто к ним обратиться.
 
SKif:
Вот скиф предлагает объявить общую переменную в файле .mq4 и включать через #include его везде где, переменная будет использоваться.
Я этого не предлагаю.
Если все глоб. перем. собрать в один файл, то его с помощью #include нужно присоединить в головной файл (например, эксперт, содержащий функции) один раз. Объявленные таким образом глоб. переменные будут доступны всем функциям такого эксперта, причём как явно написанным в самом эксперте, так и присоединённым в него с помощью #include. При этом ни в каких функциях эксперта эти переменные объявлять не нужно; они уже доступны, нужно просто к ним обратиться.
Правильно, но это и есть включаемый файл, а значит все глобальные переменные в этом включаемом файле должны быть с уникальными именами.
Нет возможности в разных файлах-модулях объявить одноимённую переменную. А такое часто приходится делать, иначе замучаешься придумывать имена переменных, искажая их смысл или приписывать там чёрточки, буковки и прочую билиберду к ним, делая код потом не читабельным для себя самого.
Вот к примеру я хочу сделать две библиотеки сейчас. Названия большинства массивов и переменных и функций в них совпадают, но отличается алгоритм расчётов в этих функциях несколько. И как теперь быть? Переназвать все массивы, глобальные переменные и названия функций. Не удобно!
 
Я не согласен.

Если это одна переменная, то она одна. Хоть глобальная, хоть локальная.
Если это другая переменная по сути, то у неё и название другое.
По-моему, это просто.

А не удобно только поначалу. Бывает трудно управляться с большим количеством новых понятий. А когда освоишься, то становится мало..:)
 
SKif:
Я не согласен.

Если это одна переменная, то она одна. Хоть глобальная, хоть локальная.
Если это другая переменная по сути, то у неё и название другое.
По-моему, это просто.

А не удобно только поначалу. Бывает трудно управляться с большим количеством новых понятий. А когда освоишься, то становится мало..:)
Ну может вы и правы что можно привыкнуть, но я привык писать на Си, Яве и Паскале и в каждом языке в каждом модуле программы можно было объявлять свои глобальные переменные одноименные с переменными в другом модуле - индексы, имена массивов, флаги или функции. Но в MQL4 хоть и похож на си но во много отличается в структуре программы.
Поэтому думаю что буду создавтаь код и компилировтать его в DLL. Здесь правда другие проблемы возникают с доступность предопределённых переменных и функций MQL4. Надо посмотреть как в примере. А то придётся думаю всё же делать как скиф и компостер :) Грубо но зато дёшево надёжно и практично :)
Причина обращения: