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

 
Комбинатор:

Was ist mit den normalen Namen, die in den Kommentaren stehen?

Dynamische ENUM sind für den internen Gebrauch, das Einstellungsfenster zeigt sie nicht an. Normale Namen/Kommentare werden nicht wirklich benötigt
 

Übrigens scheint es einen Fehler im mql-Präprozessor zu geben.

#define  i ##nt  ll;

expandiert zu 'i nt ll;' und gibt einen Fehler aus:

'i nt' - undeclared identifier    t_t_t.mq4    50    1


Was die Kommentare in der Aufzählung angeht - theoretisch sollten sie bis zum C-Präprozessor zucken. Selbst wenn es also möglich wäre, einen Kommentar einzubauen, wäre es unwahrscheinlich, dass er eine Wirkung hätte. Man sollte die Syntax ändern (z.B. in _cmnt_) und die Aufrufreihenfolge des C-Präprozessors mit dem Präprozessor, der die Kommentare zieht, ändern. Die Aussichten auf solche Reformen sind meines Erachtens unwahrscheinlich ))

 
pavlick_:

Übrigens scheint es einen Fehler im mql-Präprozessor zu geben.

expandiert zu 'i nt ll;' und gibt einen Fehler aus:

Sie haben irgendwo einen Fehler. Sie wird korrekt erweitert: 'nt ll;
 
Alexander Puzanov:
Dynamic ENUM ist für den internen Gebrauch, das Einstellungsfenster zeigt diese nicht an. Normale Namen/Kommentare werden nicht wirklich benötigt
Eine solche dynamische Aufzählung kann in eine viel schönere Form gepresst werden.
 

Die letzte Methode erforderte das manuelle Schreiben der Leerzeichen für enum und die Funktion, die ein Array von Werten zurückgibt. Ich habe beschlossen, es herauszufinden und es so zu schreiben, dass es nicht mehr benötigt wird. Es kann jedoch nicht in mql kompiliert werden, es gibt keine Makros mit variabler Anzahl von Argumenten, aber theoretisch können sie erscheinen. Wie auch immer, hier ist, was ich habe:

// Выглядит страшно, да )). Но это универсальная заготовка
// Можно засунуть в какой-нибудь cpp_magic.h
//cpp_magic.h
#define  EVAL(...) EVAL1024(__VA_ARGS__)
#define  EVAL1024(...) EVAL512(EVAL512(__VA_ARGS__))
#define  EVAL512(...) EVAL256(EVAL256(__VA_ARGS__))
#define  EVAL256(...) EVAL128(EVAL128(__VA_ARGS__))
#define  EVAL128(...) EVAL64(EVAL64(__VA_ARGS__))
#define  EVAL64(...) EVAL32(EVAL32(__VA_ARGS__))
#define  EVAL32(...) EVAL16(EVAL16(__VA_ARGS__))
#define  EVAL16(...) EVAL8(EVAL8(__VA_ARGS__))
#define  EVAL8(...) EVAL4(EVAL4(__VA_ARGS__))
#define  EVAL4(...) EVAL2(EVAL2(__VA_ARGS__))
#define  EVAL2(...) EVAL1(EVAL1(__VA_ARGS__))
#define  EVAL1(...) __VA_ARGS__
#define  SECOND(a, b, ...) b
#define  FIRST(a, ...) a
#define  CAT(a,b) a ##  b
#define EMPTY()
#define  DEFER1(m) m EMPTY()
#define  DEFER2(m) m EMPTY EMPTY()()
#define  DEFER3(m) m EMPTY EMPTY EMPTY()()()
#define  DEFER4(m) m EMPTY EMPTY EMPTY EMPTY()()()()
#define  IS_PROBE(...) SECOND(__VA_ARGS__, 0)
#define  PROBE() ~, 1
#define  NOT(x) IS_PROBE(CAT(_NOT_, x))
#define _NOT_0 PROBE()
#define  BOOL(x) NOT(NOT(x))
#define  HAS_ARGS(...) BOOL(FIRST(_END_OF_ARGUMENTS_ __VA_ARGS__)())
#define _END_OF_ARGUMENTS_() 0
#define  IF_ELSE(condition) _IF_ELSE(BOOL(condition))
#define _IF_ELSE(condition) CAT(_IF_, condition)
#define _IF_1(...) __VA_ARGS__ _IF_1_ELSE
#define _IF_0(...)             _IF_0_ELSE
#define _IF_1_ELSE(...)
#define _IF_0_ELSE(...) __VA_ARGS__
#define  MAP1(m, first, ...)          \
  m(first)                           \
  IF_ELSE(HAS_ARGS(__VA_ARGS__))(    \
  DEFER2(_MAP1)()(m, __VA_ARGS__)    \
  )()
#define _MAP1() MAP1
#define  MAP2(m, first, second, ...)  \
  m(first, second)                   \
  IF_ELSE(HAS_ARGS(__VA_ARGS__))(    \
  DEFER2(_MAP2)()(m, __VA_ARGS__)    \
  )()
#define _MAP2() MAP2
// main.cpp
#include <stdio.h>
#include "cpp_magic.h"

#define  CREATE_ENUM_HELPER_1(el, val)  el = val,
#define  CREATE_ENUM_HELPER_2(el, val)  el,
#define  CREATE_ENUM(name, ...)                                     \
  enum name{                                                       \
    EVAL( MAP2(CREATE_ENUM_HELPER_1, __VA_ARGS__) )                \
  };                                                               \
  unsigned get_##name##_array(int *ar){                            \
    int temp[] = {                                                 \
    EVAL( MAP2(CREATE_ENUM_HELPER_2, __VA_ARGS__) )                \
    };                                                             \
    if(ar != NULL)                                                 \
      for(unsigned i = 0;  i < sizeof(temp) / sizeof(int);  ++i){  \
        ar[i] = temp[i];                                           \
    }                                                              \
    return sizeof(temp) / sizeof(int);                             \
  };

CREATE_ENUM(enum1, q,1, e,3, t,65, z,90)
CREATE_ENUM(enum2, ww,100, ss,-3, dh,21)
struct S{
  CREATE_ENUM(enum3, q,871, e,213, t,226)
}s;

int main()
{
  int ar[100];

  printf("----enum1-----\n");
  get_enum1_array(ar);
  for(unsigned i = 0;  i < get_enum1_array(NULL);  ++ i)
    printf("%d\n", ar[i]);

  printf("----enum2-----\n");
  get_enum2_array(ar);
  for(unsigned i = 0;  i < get_enum2_array(NULL);  ++ i)
    printf("%d\n", ar[i]);

  printf("----enum3-----\n");
  s.get_enum3_array(ar);
  for(unsigned i = 0;  i < s.get_enum3_array(NULL);  ++ i)
    printf("%d\n", ar[i]);
}

Выхлоп printf:
 ----enum1-----
 1
 3
 65
 90
 ----enum2-----
 100
 -3
 21
 ----enum3-----
 871
 213

226

// Generierter Code für emum1
// enum enum1{
// q = 1,
// e = 3,
// t = 65,
// z = 90,
// };
// unsigned get_enum1_array(int *ar){
// int temp[] = { q, e, t, z, };
// if(ar != NULL)
// for(unsigned i = 0; i < sizeof(temp) / sizeof(int); ++i){
// ar[i] = temp[i]; }
// return sizeof(temp) / sizeof(int);
// }

Artikel zu diesem Thema http://jhnet.co.uk/articles/cpp_magic. Alles in allem natürlich eine Menge Magie. Die Technik kann jedoch für eine breite Palette von Aufgaben im Zusammenhang mit der Erzeugung von Präprozessor-Code nützlich sein.

C Pre-Processor Magic - Articles - Jhnet
  • jhnet.co.uk
The C Pre-Processor (CPP) is the somewhat basic macro system used by the C programming language to implement features such as and which allow very simple text-substitutions to be carried out at compile time. In this article we abuse the humble to implement if-statements and iteration. Before we begin, a disclaimer: these tricks, while perfectly...
 
Schade), aber Hut ab vor Ihnen.
 

Ich habe den Thread mit Interesse gelesen, alles sehr cool mit Makros.

Es ist einfach nicht klar, warum wir dieses ganze Tanzen mit enum brauchen. Können Sie ein praktisches Beispiel nennen?

Das mit der TF ist klar, aber was noch?

 
pavlick_:

Es kann jedoch nicht in mql kompiliert werden, es gibt keine Makros mit variabler Anzahl von Argumenten, aber theoretisch können sie erscheinen.

In MQL5 haben Makros nicht nur eine feste Anzahl von Argumenten, sondern ihre Anzahl ist auf 8 begrenzt. Sie können also ein Enum für nur 3 Werte erstellen.

Was das theoretische Aussehen betrifft, wird es wahrscheinlich schneller sein, eine eigene Funktion für das Parsen von Aufzählungen zu entwickeln, da die Entwickler bereits versprochen haben, etwas zu tun.

 
Alexey Navoykov:

In MQL5 haben Makros nicht nur eine feste Anzahl von Argumenten, sondern ihre Anzahl ist auf 8 begrenzt. Wir können also ein Enum für nur 3 Werte erstellen.

Was das theoretische Aussehen betrifft, so ist es wahrscheinlich schneller, eine eigene Funktion für das Parsen von Aufzählungen zu entwickeln. Die Entwickler haben bereits versprochen, sich etwas einfallen zu lassen.

Es ist kein Iterator zur Aufzählung von Enum-Werten vorgesehen.
Verwenden Sie die zuvor vorgeschlagene Methode der Aufzählung mit Array.
enum Enum
 {
  VAL_0,
  VAL_1,
  ...
 };

const  Enum EnumValues[]={ VAL_0, VAL_1, ... };

for(uint i=0;i<ArraySize(EnumValues);i++)
   Print(EnumToString(EnumValues[i]));
 
Ilyas:
Für die Aufzählung von Aufzählungswerten ist kein Iterator vorgesehen.
Verwenden Sie die zuvor vorgeschlagene Methode der Aufzählung von Werten mit Hilfe eines Arrays.
Es stellt sich heraus, dass es sich um denselben Schalter handelt, allerdings von der Seite. Das heißt, dass in jedem Fall zwei Listen geführt werden müssen: der Enumerator selbst und das Array (Wechselfälle).