Wie gehe ich eine Aufzählung konsequent durch? - Seite 2

 

Und mit ein wenig mehr Gehirnschmalz kann man eine Funktion wie diese erhalten

int GetPeriodEnumerator(
uchar i,              // индекс перечисления 
ENUM_TIMEFRAMES &tf,  // сюда принимаем числовое значение таймфрейма 
string &tfs           // сюда принимаем строковое значение таймфрейма
)
  {
   switch(i)
     {
      case 0:  {tf=PERIOD_M1;tfs="M1";return(0);}
      case 1:  {tf=PERIOD_M2;tfs="M2";return(0);}
      case 2:  {tf=PERIOD_M3;tfs="M3";return(0);}
      case 3:  {tf=PERIOD_M4;tfs="M4";return(0);}
      case 4:  {tf=PERIOD_M5;tfs="M5";return(0);}
      case 5:  {tf=PERIOD_M6;tfs="M6";return(0);}
      case 6:  {tf=PERIOD_M10;tfs="M10";return(0);}
      case 7:  {tf=PERIOD_M12;tfs="M12";return(0);}
      case 8:  {tf=PERIOD_M15;tfs="M15";return(0);}
      case 9:  {tf=PERIOD_M20;tfs="M20";return(0);}
      case 10: {tf=PERIOD_M30;tfs="M30";return(0);}
      case 11: {tf=PERIOD_H1;tfs="H1";return(0);}
      case 12: {tf=PERIOD_H2;tfs="H2";return(0);}
      case 13: {tf=PERIOD_H3;tfs="H3";return(0);}
      case 14: {tf=PERIOD_H4;tfs="H4";return(0);}
      case 15: {tf=PERIOD_H6;tfs="H6";return(0);}
      case 16: {tf=PERIOD_H8;tfs="H8";return(0);}
      case 17: {tf=PERIOD_H12;tfs="H12";return(0);}
      case 18: {tf=PERIOD_D1;tfs="D1";return(0);}
      case 19: {tf=PERIOD_W1;tfs="W1";return(0);}
      case 20: {tf=PERIOD_MN1;tfs="MN1";return(0);}
     }
   return(-1);
  }
 
sergey1294:

Und wenn Sie Ihr Gehirn ein bisschen mehr anstrengen, können Sie folgende Funktion erhalten

Warum

return(0)

Da es sich bei der Funktion um eine int-Funktion handelt, kann auch return verwendet werden.

int GetPeriodEnumerator(
uchar i,              // индекс перечисления 
ENUM_TIMEFRAMES &tf,  // сюда принимаем числовое значение таймфрейма 
string &tfs           // сюда принимаем строковое значение таймфрейма
)
  {
   switch(i)
     {
      case 0:  {tf=PERIOD_M1;tfs="M1";return(PeriodSeconds(tf)/60);}
      case 1:  {tf=PERIOD_M2;tfs="M2";return(PeriodSeconds(tf)/60);}
      case 2:  {tf=PERIOD_M3;tfs="M3";return(PeriodSeconds(tf)/60);}
      case 3:  {tf=PERIOD_M4;tfs="M4";return(PeriodSeconds(tf)/60);}
      case 4:  {tf=PERIOD_M5;tfs="M5";return(PeriodSeconds(tf)/60);}
      case 5:  {tf=PERIOD_M6;tfs="M6";return(PeriodSeconds(tf)/60);}
      case 6:  {tf=PERIOD_M10;tfs="M10";return(PeriodSeconds(tf)/60);}
      case 7:  {tf=PERIOD_M12;tfs="M12";return(PeriodSeconds(tf)/60);}
      case 8:  {tf=PERIOD_M15;tfs="M15";return(PeriodSeconds(tf)/60);}
      case 9:  {tf=PERIOD_M20;tfs="M20";return(PeriodSeconds(tf)/60);}
      case 10: {tf=PERIOD_M30;tfs="M30";return(PeriodSeconds(tf)/60);}
      case 11: {tf=PERIOD_H1;tfs="H1";return(PeriodSeconds(tf)/60);}
      case 12: {tf=PERIOD_H2;tfs="H2";return(PeriodSeconds(tf)/60);}
      case 13: {tf=PERIOD_H3;tfs="H3";return(PeriodSeconds(tf)/60);}
      case 14: {tf=PERIOD_H4;tfs="H4";return(PeriodSeconds(tf)/60);}
      case 15: {tf=PERIOD_H6;tfs="H6";return(PeriodSeconds(tf)/60);}
      case 16: {tf=PERIOD_H8;tfs="H8";return(PeriodSeconds(tf)/60);}
      case 17: {tf=PERIOD_H12;tfs="H12";return(PeriodSeconds(tf)/60);}
      case 18: {tf=PERIOD_D1;tfs="D1";return(PeriodSeconds(tf)/60);}
      case 19: {tf=PERIOD_W1;tfs="W1";return(PeriodSeconds(tf)/60);}
      case 20: {tf=PERIOD_MN1;tfs="MN1";return(PeriodSeconds(tf)/60);}
     }
   return(-1);
  }

und der Aufruf sieht wahrscheinlich folgendermaßen aus

   ENUM_TIMEFRAMES tf;
   string tfs;
   Print(" мин=",GetPeriodEnumerator(11,tf,tfs),"  ENUM=",tf,"  string=",tfs);

das Ergebnis ist

 мин=60  ENUM=16385  string=H1
 
Zu den Aufzählungen gibt es eine Diskussion:
1) Einführung von ++ für die Aufzählung
2) Umwandlung der Aufzählung in einen String
ENUM_TIMEFRAMES t=PERIOD_M1;
string s=(string)t;

s будет иметь значение "PERIOD_M1"
 
mql5:
Zu den Aufzählungen gibt es eine Diskussion:
1) Einführung von ++ für die Aufzählung
2) Umwandlung der Aufzählung in einen String

Nachdrücklich unterstützen. Insbesondere der erste Punkt. Allein im Standardpaket gibt es Hunderte von Aufzählungen, und es ist zu teuer, für jede Aufzählung eine eigene Funktion zu schreiben.
 
Ilyas:
Es gibt eine Diskussion über Transfers:
1) Einführung von ++ für die Aufzählung


Gibt es diese Funktion bereits?

Oder eine andere Alternative, um die Artikel nacheinander aufzulisten?

 
Gebt uns Iteratoren!
 

Es scheint mir, dass das Inkrementieren einer Aufzählung nicht der richtige Schritt ist.

Die Standardaufzählung muss nicht notwendigerweise sequentiell sein, und außerdem können während der Entwicklung Werte "in der Mitte" hinzugefügt werden.

Natürlich wäre es zur "Vereinfachung" schön, durch Inkrementierung der Aufzählung sofort den "nächsten" Wert zu erhalten, aber meiner Meinung nach ist dies eine potenziell gefährliche Praxis.

Um den "nächsten Wert" in der Aufzählung zu erhalten, ist es am sinnvollsten, eine spezielle Funktion zu verwenden, wie hier bereits erwähnt.

Und die Leute scheinen den Standard-Selektor zu ignorieren, und zwar vergeblich. Jeder switch() muss diesen Selektor mit einer Warnung enthalten, dass ein obskurer Wert eingetroffen ist.

 

George Merts:

durch Inkrementierung von Aufzählungen - sofortiger Erhalt des "nächsten" Wertes

Das ist es, wasIlyas meinte.

Ich hatte eine Frage an ihn oder den verantwortlichen Entwickler. Wurde dieses Problem gelöst - irgendwie durch alle Elemente programmatisch zu gehen oder ist es immer noch in den Prozess...

Es ist mir eigentlich egal, wie ich bestehen kann.

foreach-Operator

neue Funktionen wie GetNextEnum / GetLastEnum / GetFirstEnum

oder Überlastung ++

solange es nicht so ist, wie oben vorgeschlagen wurde - Funktionen für aktuelle Bezeichnungen zu zeichnen und dann Angst zu haben, dass nichts kaputt geht, wenn sie von Entwicklern aktualisiert werden

 

Gott, warum diese Komplexität - einige Plusser, Iteratoren... Die naheliegendste und flexibelste Lösung ist es, eine Funktion in die Sprache einzuführen, die alle Aufzählungswerte in ein Array holt. Und dann entscheiden Sie, wie Sie dieses Array durchlaufen, auch quer dazu.Außerdem müssen Sie sowieso alle Werte speichern, da Sie nicht bei jedem Aufruf alles neu aufbereiten wollen. Wenn Sie es einmal umgangen und gespeichert haben, können Sie es einfach aus dem Array nehmen. Ist es also nicht einfacher, ein fertiges Array auf einmal zu bekommen?

Übrigens kann die Variante mit der Überladung des Operators ++ dazu führen, dass bestehende Programme nicht richtig funktionieren, ist also ein äußerst schlechter Weg.

Nun, die hier gezeigten Beispiele (Fall 1: Rückgabewert1; Fall 2: Rückgabewert2; Fall 3: Rückgabewert3... Eine geeignete Person würde alle Werte in einem Array ablegen und den benötigten Wert einfach über seinen Index abrufen, während er/sie für die umgekehrte Aufgabe die binäre Suche verwenden würde.

 
Alexey Navoykov:

Gott, was ist das für eine Komplexität - die Pluszeichen, die Iteratoren...

Es ist mir egal, wie Sie es haben wollen.

Nun, die hier gezeigten Beispiele (Fall 1: Rückgabewert1; Fall 2: Rückgabewert2; Fall 3: Rückgabewert3... Eine geeignete Person würde alle Werte in ein Array packen und einfach den benötigten Wert über seinen Index abrufen, während für die umgekehrte Aufgabe eine binäre Suche verwendet wird.

Schalter ist eine sehr effektive Sache