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

 

Тут фича в понятии инстанс.

Каждый модуль создает для своих глобальный переменных (объявленных выше уровня всех функции) отдельные инстансы (экземпляры) для каждого из внешних модулей. При том бред в том, что если я из скрипта/эксперта/индикатора (М0) вызову функцию из модуля М1, а та функция вызовет функцию из модуля M2, которая в модуле M2 изменит значение глобальной для этого модуля переменной - это будет отдельный инстанс, исключительно для модуля M1 (тот кто непосредственно обращается к модулю). Т.е. если я сразу же вызову из модуля М0 читающую функцию из M2 (т.е. уже без посреднечества M1), то я получу иное значение, нежели я туда положил используя в качестве посредника функцию из M1.

Получается, что создается два разных инстанса одной и той же переменной - отдельно для M1 и отдельно для M2. Это ОЧЕНЬ усложняет жизнь. Т.е. я не могу эффективно (без неожиданностей) использовать модули, если сразу не определю точную картину вызовов в которой этот модуль будет использоваться. А это уже противоречит самой идеи модуля-библиотеки, которая должна без головной боли подключаться к любому нужному модулю.



// M2.mqh
 
#import "M2.ex4"
  void m2_setVar(int var);
  int m2_getVar();
#import


// M2 module with target variable
 
int targetVar;
 
void m2_setVar(int var){
  targetVar = var;
}
 
int m2_getVar(){
  return (targetVar);
}
// M1 - mediator between M0 and M1

#include <M2.mqh> 

void m1_setVarForM0(int var){
  m2_setVar(var);
}
// M0 - script/indicator/expert

// M1.mqh - same as M2.mqh for M2.mq4

#include <M1.mqh>
#include <M2.mqh>

int start(){
 m2_setVar(1);
 m1_setVarForM0(2);

 Print(m2_getVar());
}

Print вернет 1. Т.к. 2 хоть и позже был поставлен, но через модуль M1.


В купе с отсутствием типа "структура", невозможностью передавать параметры по ссылке в другие модули и невозможностью возвращать массивы - это очень большая головная боль.


Я вижу пока только один выход (если не выносить логику в dll) - передавать данные через файлы. В моем случае нужно массивы данных передавать - получается в виде строки с разделителем.


А вообще я сгустил, краски :))

Можно юзать бинарные файлы, как хранилище глобальных переменных. Особенно для массивов удобно.