Sıralı olarak bir numaralandırma üzerinde yineleme nasıl yapılır? - sayfa 7

 
Комбинатор :

Peki ya yorumlardaki normal isimler?

Dinamik ENUM - dahili kullanım için ayarlar penceresinde gösterilmezler. Normal adlara/yorumlara gerçekten gerek yok
 

Bu arada, mql önişlemcisinde bir hata var gibi görünüyor.

 #define i ##nt ll;

'i nt ll' olarak genişler; ve bir hata atar:

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


Numaralandırmadaki yorumlarla ilgili olarak - teoride, C önişlemcisine geçmeleri gerekir. Bu nedenle, bir yorumu zorlamak mümkün olsaydı bile, pek bir etkisi olmazdı. İyi bir şekilde, sözdizimini değiştirmeniz (örneğin _cmnt_ olarak) ve C önişlemcisini, yorumları çıkaran bir önişlemci ile çağırma sırasını değiştirmeniz gerekir. Bu tür reformlar için beklentiler pek olası değil bence))

 
pavlick_ :

Bu arada, mql önişlemcisinde bir hata var gibi görünüyor.

'i nt ll' olarak genişler; ve bir hata atar:

Bir yerde hatan var. Doğru bir şekilde ortaya koyuyor: nt ll;
 
Alexander Puzanov :
Dinamik ENUM - dahili kullanım için ayarlar penceresinde gösterilmezler. Normal adlara/yorumlara gerçekten gerek yok
Böyle dinamik bir numaralandırma, çok daha güzel bir forma sığdırılabilir.
 

Önceki yöntem, enum altında manuel olarak boşluklar yazmayı ve bir dizi değer döndüren bir işlevi gerektiriyordu. Bunu anlamaya ve yazmaya karar verdim, böylece buna olan ihtiyaç ortadan kalkacak. Doğru, bu mql'de derlenemez, değişken sayıda argümana sahip makrolar yoktur, ancak teorik olarak görünebilirler. Genel olarak, olan buydu:

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

// emum1 için oluşturulan kod
// enum numaralandırma1{
// q = 1,
// e = 3,
// t = 65,
// z = 90,
// };
// imzasız 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] = sıcaklık[i]; }
// dönüş sizeof(temp) / sizeof(int);
// };

Bu konuyla ilgili makale http://jhnet.co.uk/articles/cpp_magic. Genel olarak, elbette çok fazla sihir var. Ancak teknik, önişlemci kod üretimiyle ilgili çok çeşitli görevler için faydalı olabilir.

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...
 
Tin) ama saygı
 

Konuyu ilgiyle okudum, makrolarla her şey çok güzel.

Sadece belli değil, neden bu danslara enum ile ihtiyacımız var? Pratik bir örnek verebilir misiniz?

TF hakkında açık, ama aynı zamanda?

 
pavlick_ :

Doğru, bu mql'de derlenemez, değişken sayıda argümana sahip makrolar yoktur, ancak teorik olarak görünebilirler.

Pekala, bu kilit nokta. MQL5'te makrolar sadece sabit sayıda argümana sahip olmakla kalmaz, bu sayı 8 ile sınırlıdır. Böylece sadece 3 değer için enum yapmak mümkün olacaktır.

Ve teorik görünüme gelince, numaralandırma için normal bir işlev muhtemelen daha hızlı görünecektir. Geliştiriciler zaten bir şey doğurmaya söz verdiler.

 
Alexey Navoykov :

Pekala, bu kilit nokta. MQL5'te makrolar sadece sabit sayıda argümana sahip olmakla kalmaz, bu sayı 8 ile sınırlıdır. Böylece sadece 3 değer için enum yapmak mümkün olacaktır.

Ve teorik görünüme gelince, numaralandırma için normal bir işlev muhtemelen daha hızlı görünecektir. Geliştiriciler zaten bir şey doğurmaya söz verdiler.

Numaralandırıcı değerleri üzerinde yineleme yapacak bir yineleyici planlanmamıştır.
Bir dizi kullanarak değerleri yinelemek için daha önce önerilen yolu kullanın.
 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 :
Numaralandırıcı değerleri üzerinde yineleme yapacak bir yineleyici planlanmamıştır.
Bir dizi kullanarak değerleri yinelemek için daha önce önerilen yolu kullanın.
Bunun aynı anahtar olduğu, ancak yandan görünüş olduğu ortaya çıktı. Yani, her durumda, iki liste tutmak gerekli olacaktır: numaralandırmanın kendisi ve dizi (anahtardan gelen durumlar).