По поводу комментариев в перечислении - по идее, они должны дёргаться до Си препроцессора. Поэтому даже если бы впихнуть комментарий удалось, то вряд ли бы он имел эффект. По-хорошему, нужно менять синтаксис (на _cmnt_, наример) и менять последовательность вызова Си препроцессора с препроцессором, который выдёргивает комменты. Перспективы таких реформ маловероятны, думаю ))
Прошлый метод требовал написания заготовок вручную под enum и функцию возвращающую массив значений. Решил разобраться и написать так, чтобы необходимость в этом отпала. Правда это нельзя скомпилировать на mql, отсутствуют макросы с переменным числом аргументов, но теоретически могут появиться. В общем получилось вот что:
// Сгенерированный код для 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); // };
Статья на эту тему http://jhnet.co.uk/articles/cpp_magic. Вообще, магии многовато, конечно. Но техника может сгодиться для широкого круга задач относящихся к препроцессорной кодогенерации.
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...
Правда это нельзя скомпилировать на mql, отсутствуют макросы с переменным числом аргументов, но теоретически могут появиться.
Ну вот это ключевой момент. В MQL5 макросы мало того, что с фиксированным числом аргументов, так ещё и это число ограничено 8. Так что удастся сделать enum всего для 3 значений.
А насчёт теоретического появления, наверно быстрей появится штатная функция для парсинга enum. Разработчики уже обещали родить что-нибудь.
Ну вот это ключевой момент. В MQL5 макросы мало того, что с фиксированным числом аргументов, так ещё и это число ограничено 8. Так что удастся сделать enum всего для 3 значений.
А насчёт теоретического появления, наверно быстрей появится штатная функция для парсинга enum. Разработчики уже обещали родить что-нибудь.
Итератора для перебора значений энумератора не планируется. Используйте ранее предложенный способ перебора значений с использованием массива.
Ilyas: Итератора для перебора значений энумератора не планируется. Используйте ранее предложенный способ перебора значений с использованием массива.
Выходит, что это тот же switch, но вид сбоку. То есть в любом случае потребуется поддерживать два списка: само перечисление и массив (кейсы от switch'a).
А как быть с нормальными именами которые в комментах?
Кстати, в mql препроцессоре ошибка, видимо.
раскрывается в 'i nt ll;' и выдаёт ошибку:
'i nt' - undeclared identifier t_t_t.mq4 50 1
По поводу комментариев в перечислении - по идее, они должны дёргаться до Си препроцессора. Поэтому даже если бы впихнуть комментарий удалось, то вряд ли бы он имел эффект. По-хорошему, нужно менять синтаксис (на _cmnt_, наример) и менять последовательность вызова Си препроцессора с препроцессором, который выдёргивает комменты. Перспективы таких реформ маловероятны, думаю ))
Кстати, в mql препроцессоре ошибка, видимо.
раскрывается в 'i nt ll;' и выдаёт ошибку:
Динамический ENUM - для внутреннего пользования, в окне настроек такие не показывают. Нормальные имена / комменты не оч нужны
Прошлый метод требовал написания заготовок вручную под enum и функцию возвращающую массив значений. Решил разобраться и написать так, чтобы необходимость в этом отпала. Правда это нельзя скомпилировать на mql, отсутствуют макросы с переменным числом аргументов, но теоретически могут появиться. В общем получилось вот что:
Выхлоп printf:
----enum1-----
1
3
65
90
----enum2-----
100
-3
21
----enum3-----
871
213
226
// Сгенерированный код для 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);
// };
Статья на эту тему http://jhnet.co.uk/articles/cpp_magic. Вообще, магии многовато, конечно. Но техника может сгодиться для широкого круга задач относящихся к препроцессорной кодогенерации.
Я с интересом читаю ветку, все очень круто с макросами.
Только неясно, а зачем нужны эти танцы с enum? Можно привести практический пример?
Про ТФ ясно, а еще?
Правда это нельзя скомпилировать на mql, отсутствуют макросы с переменным числом аргументов, но теоретически могут появиться.
Ну вот это ключевой момент. В MQL5 макросы мало того, что с фиксированным числом аргументов, так ещё и это число ограничено 8. Так что удастся сделать enum всего для 3 значений.
А насчёт теоретического появления, наверно быстрей появится штатная функция для парсинга enum. Разработчики уже обещали родить что-нибудь.
Ну вот это ключевой момент. В MQL5 макросы мало того, что с фиксированным числом аргументов, так ещё и это число ограничено 8. Так что удастся сделать enum всего для 3 значений.
А насчёт теоретического появления, наверно быстрей появится штатная функция для парсинга enum. Разработчики уже обещали родить что-нибудь.
Используйте ранее предложенный способ перебора значений с использованием массива.
Итератора для перебора значений энумератора не планируется.
Используйте ранее предложенный способ перебора значений с использованием массива.