Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кол-во энумераторов 
:(
    Опции темы
proc_maker
Дата 17.8.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 11.11.2006

Репутация: нет
Всего: 1



Всем Алоха!! smile

Вот есть такой вот энум:
Код

enum TType
{
   TYPE_1,
   TYPE_2,
   TYPE_3,
   TYPE_4
};



Есть структура к примеру типа

Код

struct TRecord
{
   TType type;
   int value;
};


Хочется иметь возможность создания такой вот конструкции:
Код

TRecord recs[COUNT_VALUES(TType)] =
{
   {TYPE_1, 0},
   {TYPE_2, 0},
   {TYPE_3, 0},
   {TYPE_4, 0},
};



тоесть на этапе компиляции знать сколько у нас значений определено в энумерейшене чтобы в recs было _не_более_ чем надо кол-ва элементов при условии уникальности значения первого поля.

Пока найдено такое решение - 

Код

enum TType
{
   __FIRST_VALUE_DO_NOT_USE = 0,
   TYPE_1,
   TYPE_2,
   TYPE_3,
   TYPE_4,
   __LAST_VALUE_DO_NOT_USE
};

TRecord recs[__LAST_VALUE_DO_NOT_USE - 1] =
{
...
};


Может можно сделать красивее?

Риспект откликнувшимся smile

Дмитрий
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 17.8.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



а в чем проблема?
Код

enum TType
{
    TYPE_1,
    TYPE_2,
    TYPE_3,
    TYPE_4
};

struct TRecord
{
    TType type;
    int value;
};

TRecord recs[] =
{
    {TYPE_1, 0},
    {TYPE_2, 0},
    {TYPE_3, 0},
    {TYPE_4, 0},
};


PM   Вверх
proc_maker
Дата 17.8.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 11.11.2006

Репутация: нет
Всего: 1



Хочется избежать ошибок рода

Код

TRecord recs[] =
{
    {TYPE_1, 0},
    {TYPE_2, 0},
    {TYPE_3, 0},
    {TYPE_4, 0},
    {TYPE_4, 0},
    {TYPE_4, 0},
};


тоесть чтобы компайлер прошарил максимально возможное колво элементов в массиве. В моем примере это определяется явным указанием размера массива. Было бы удобно - легче найти ошибки, да и мэйнтейнить удобнее мне кажется smile

Это сообщение отредактировал(а) proc_maker - 17.8.2010, 15:24
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 17.8.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(proc_maker @  17.8.2010,  15:23 Найти цитируемый пост)
тоесть чтобы компайлер прошарил максимально возможное колво элементов в массиве.

тогда твой вариант, только вот так
Код

enum TType
{
   TYPE_1,
   TYPE_2,
   TYPE_3,
   TYPE_4,
   SIZE // must be last
};
TRecord recs[SIZE] =
{
...
};


PM   Вверх
proc_maker
Дата 17.8.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 11.11.2006

Репутация: нет
Всего: 1



Да, за исключением того что энумераторы могут иметь не линейно инкрементальные либо отрицательные значения:

Код

enum TType
{
   TYPE_1 = 0,
   TYPE_2 = 4,
   TYPE_3 = 8,
   TYPE_4 = -1,
   SIZE // must be last
};


Не сочтите за назоливость, просто хочется какого-нибудь универсального решения.

тоесть в идеале хорошо было бы знать на этапе компиляции, что у нас определены 4 значения.

Это сообщение отредактировал(а) proc_maker - 17.8.2010, 15:40
PM MAIL ICQ Skype   Вверх
SABROG
Дата 17.8.2010, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(proc_maker @  17.8.2010,  15:31 Найти цитируемый пост)
тоесть в идеале было бы знать на этапе компиляции, что у нас определены 4 значения.

В C++ стандартных средств нет, в Qt это достигается за счет мета-объектного компилятора, которому автоматически скармливаются исходники. Таким образом уже в рантайме приложение видит все перечисления и даже их текстовые имена.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
azesmcar
Дата 17.8.2010, 15:45 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(proc_maker @  17.8.2010,  15:31 Найти цитируемый пост)
Да, за исключением того что энумераторы могут иметь не линейно инкрементальные либо отрицательные значения:

что значит могут? в конкретном случае либо они имеют, либо нет. Надо исходить из этого а не из потенциально возможных вариантов. Если имеют - тогда другой вопрос, в придеведенном примере этого нет.

Цитата(proc_maker @  17.8.2010,  15:31 Найти цитируемый пост)
тоесть в идеале было бы знать на этапе компиляции, что у нас определены 4 значения.

К сожалению нету такого. enum -ы в C++ имеют небогатый функционал.
PM   Вверх
proc_maker
Дата 17.8.2010, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 11.11.2006

Репутация: нет
Всего: 1



Цитата(azesmcar @  17.8.2010,  15:45 Найти цитируемый пост)
что значит могут? в конкретном случае либо они имеют, либо нет.


т.н. абстрагирование - наиболее элементарный пример для пояснения сути вопроса не вдаваясь в детали.  В процессе мэйнтейна возможно добавление новых значений в энумератор, в том числе и отрицательных. В таком случае, ограничившись возможностью работать только с положительными значениями интерфейс станет непригодным, чего очень не хотелось бы.
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 17.8.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



proc_maker

Я думаю вариант, приведенный мною в первом ответе наиболее подходящий. Все равно, даже если решить этот вопрос это не спасет от других потенциальных ошибок, таких как например неверная очередность инициализации данных и так далее, в этой части кода надо быть внимательным в любом случае. 
PM   Вверх
mes
Дата 17.8.2010, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



proc_maker, в том как Вы описываете задачу,  надо не енумы контролировать, а описывать общую структуру, которая может быть представлена как массивом, так и енумом. В помощь всеми любимая #define
smile



--------------------
PM MAIL WWW   Вверх
proc_maker
Дата 18.8.2010, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 11.11.2006

Репутация: нет
Всего: 1



Цитата(mes @  17.8.2010,  18:22 Найти цитируемый пост)
В помощь всеми любимая #define


Не пойму что Вы имеете в виду, можно примерчик?
PM MAIL ICQ Skype   Вверх
mes
Дата 18.8.2010, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



примерно так :
Код


// table.inc.h
//-->
PP_ARG( TYPE_1,  0 ),

PP_ARG( TYPE_2,  0 ),
PP_ARG( TYPE_3,  0 ),
PP_ARG( TYPE_4,  0 )
//<--

//main.cpp
//-->
#define PP_ARG(a,b) a

enum TType
{  
#  include "table.inc.h"
};

#undef PP_ARG

#define PP_ARG(a,b) { a, b }

TRecord recs[] = {

#  include "table.inc.h"

};
#undef PP_ARG
//<--



Это сообщение отредактировал(а) mes - 18.8.2010, 10:52


--------------------
PM MAIL WWW   Вверх
proc_maker
Дата 18.8.2010, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 11.11.2006

Репутация: нет
Всего: 1



Понял, интересная мысль... Хоть я и не совсем люблю макросы выглядит красиво smile

Спасибо.
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0920 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.