Comment faire pour passer une énumération de manière cohérente ? - page 7

 
Комбинатор:

Qu'en est-il des noms normaux qui sont dans les commentaires ?

Dynamic ENUM est à usage interne, il n'apparaît pas dans la fenêtre des paramètres. Les noms normaux/commentaires ne sont pas vraiment nécessaires
 

Au fait, il semble y avoir une erreur dans le préprocesseur mql.

#define  i ##nt  ll;

se développe en 'i nt ll;' et donne une erreur :

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


En ce qui concerne les commentaires dans l'énumération - en théorie, ils devraient s'élever jusqu'au préprocesseur C. Ainsi, même s'il était possible d'insérer un commentaire, il serait peu probable qu'il ait un effet. Dans le bon sens, il faut changer la syntaxe (en _cmnt_, par exemple) et modifier la séquence d'appel du préprocesseur C avec le préprocesseur qui tire les commentaires. Les perspectives de telles réformes sont peu probables, je pense ;)

 
pavlick_:

Au fait, il semble y avoir une erreur dans le préprocesseur mql.

se développe en 'i nt ll;' et donne une erreur :

Vous avez une erreur quelque part. Il se développe correctement : "nt ll" ;
 
Alexander Puzanov:
Dynamic ENUM est à usage interne, la fenêtre des paramètres ne les affiche pas. Les noms normaux/commentaires ne sont pas vraiment nécessaires
Une telle énumération dynamique peut être présentée sous une forme beaucoup plus agréable.
 

La dernière méthode nécessite d'écrire les blancs manuellement pour l'enum et la fonction qui renvoie un tableau de valeurs. J'ai décidé de le comprendre et de l'écrire de manière à ce qu'il ne soit plus nécessaire. Cependant, il ne peut pas être compilé en mql, il n'y a pas de macros avec un nombre variable d'arguments, mais théoriquement elles peuvent apparaître. Bref, voilà ce que j'ai :

// Выглядит страшно, да )). Но это универсальная заготовка
// Можно засунуть в какой-нибудь 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

// Code généré pour 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) ;
// }

Article sur ce sujet http://jhnet.co.uk/articles/cpp_magic. En somme, beaucoup de magie, bien sûr. Mais cette technique peut être utile pour un large éventail de tâches se rapportant à la génération de code de préprocesseur.

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...
 
Bummer) mais bravo à vous.
 

J'ai lu le fil de discussion avec intérêt, tout est très cool avec les macros.

C'est juste que ce n'est pas clair, pourquoi avons-nous besoin de toute cette danse avec les enum ? Pouvez-vous donner un exemple concret ?

C'est clair pour le TF, mais quoi d'autre ?

 
pavlick_:

Cependant il ne peut pas être compilé en mql, il n'y a pas de macros avec un nombre variable d'arguments, mais théoriquement elles peuvent apparaître.

Dans MQL5, les macros ont non seulement un nombre fixe d'arguments, mais leur nombre est limité à 8. Vous pouvez donc créer un enum pour seulement 3 valeurs.

En ce qui concerne l'aspect théorique, il sera probablement plus rapide d'obtenir une fonction interne pour l'analyse des énumérations, car les développeurs ont déjà promis de faire quelque chose.

 
Alexey Navoykov:

Dans MQL5, les macros ont non seulement un nombre fixe d'arguments, mais leur nombre est limité à 8. Ainsi, nous pouvons créer un enum pour seulement 3 valeurs.

Pour ce qui est de l'aspect théorique, il est probablement plus rapide d'obtenir une fonction interne pour l'analyse des énumérations. Les développeurs ont déjà promis de proposer quelque chose.

Aucun itérateur pour énumérer les valeurs des énumérations n'est prévu.
Utiliser la méthode d'énumération proposée précédemment en utilisant un tableau.
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:
Aucun itérateur n'est prévu pour l'énumération des valeurs.
Utilisez la méthode suggérée précédemment pour énumérer les valeurs à l'aide d'un tableau.
Il s'avère que c'est le même interrupteur, mais de côté. C'est-à-dire que deux listes devront être maintenues dans tous les cas : l'énumérateur lui-même et le tableau (cas de commutation).
Raison: