MQL5 перебирает структуру - PullRequest
       4

MQL5 перебирает структуру

0 голосов
/ 05 декабря 2018

Можно ли выполнить итерации по обоим измерениям структуры?Если быть более конкретным, мне было интересно, можно ли перебирать столбцы структуры, такие как:

struct Struct { string NAME; int WERT; double VALUE; datetime TIME; int INT; string TYPE; };

Struct s[];

string cols[]={"NAME","WERT","VALUE","TIME","INT","TYPE" };

s[0].NAME = "B";
s[0].WERT = 10;
s[0].VALUE= 50.00;
s[0].TIME = TimeCurrent();
s[0].INT=5;
s[0].TYPE="Man";

s[1].NAME = "A";
s[1].WERT = 10000;
s[1].VALUE= 40000.00;
s[1].TIME = TimeCurrent();
s[1].INT=100;
s[1].TYPE="female";

for(int i=0; i<3; i++)
  {
   for(int j=0; j<=ArraySize(cols); j++)
     {
      s[i].cols[j]; // <-------------------
     }
  }

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы действительно можете использовать библиотеку JAson для этого типа поведения. linky

Пример:

#include <jason.mqh>

void OnStart()
{
   CJAVal s;
   s[0]["NAME"] = "B";
   s[0]["WERT"] = 10;
   s[0]["VALUE"]= 50.00;
   s[0]["TIME"] = (int)TimeCurrent();
   s[0]["INT"]=5;
   s[0]["TYPE"]="Man";

   s[1]["NAME"] = "A";
   s[1]["WERT"] = 10000;
   s[1]["VALUE"]= 40000.00;
   s[1]["TIME"] = (int)TimeCurrent();
   s[1]["INT"]=100;
   s[1]["TYPE"]="female";

   Print(s.Serialize());
   for(int i=0; i<s.Size(); i++) {
      for(int j=0; j<s[i].Size(); j++) {
         string key = s[i].m_e[j].m_key;
         printf("%s = string(%s), int(%d), double(%.3f)", 
            key, 
            s[i][key].ToStr(),
            s[i][key].ToInt(),
            s[i][key].ToDbl()
         );
      }
   }
}

Хотя вам гораздо лучше создать метод to_string на structs и classes

struct Struct { 
   string   name; 
   int      wert; 
   double   value; 
   string   str() {
      return StringFormat("Struct(%s, %d, %.2f)", name, wert, value);
   }
};
0 голосов
/ 06 декабря 2018

Добро пожаловать в SOF!
Прежде всего, лучше избегать использования сложных структур, таких как string внутри struct.Используйте class, если вы хотите, чтобы ваши структуры имели значения string.Используйте char[] и конвертируйте, если вам действительно нужно string.
Во-вторых, вы не можете знать, сколько элементов у вас внутри struct и не можете итерировать по этому - без рефрекции, извините.Если бы я был вами, я бы преобразовал ваши TYPE в bool (enum в случае, если «мужской» и «женский» недостаточно :) и имел бы array из long (включая * 1015)*, bool, datetime и любые другие целочисленные типы) и double (добавьте в него float), затем итерируйте по размеру этих двух array.

...