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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нумерация enum, Как пользоваться нумерацией? 
:(
    Опции темы
gendalf7771
Дата 19.7.2012, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток!
Изучаю перечисления enum, и возник вопрос - как пользоваться нумерацией этого типа? Пытался скомпилировать это:
Код

#include <iostream>
#include <stdlib.h>
using namespace std;

enum EAxes
{
    x=0,
    y=1,
    z=2
};

int main(void)
{
    int iArr[3][3];
    EAxes axVar;
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            axVar=j;
            iArr[i][j]=(i+j)*3;
            cout << axVar << i << ": " << iArr[i][j] << '\t';
        }
        cout << '\n';
    }
    system("pause");
}


Результат ожидал такой:
x1: 0   y1: 3   z1:   6
x2: 3   y2: 6   z2:   9
x3: 6   y3: 9   z3:   12

Вместо этого получил 
Цитата
Ошибка    2    error C2440: =: невозможно преобразовать "int" в "EAxes"    C:\Documents and Settings\User\Рабочий стол\C++\struct\struct\main.cpp    74    1    union

Как же использовать нумерацию перечислений? И если можно, какой-нибудь примерчик, в котором чётко видно преимущество enum перед массивами smile 
PM MAIL   Вверх
bsa
Дата 19.7.2012, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(gendalf7771 @  19.7.2012,  11:48 Найти цитируемый пост)
Как же использовать нумерацию перечислений?

перечисления используются для создания именованных констант.
Цитата(gendalf7771 @  19.7.2012,  11:48 Найти цитируемый пост)
И если можно, какой-нибудь примерчик, в котором чётко видно преимущество enum перед массивами
покажи сначала пример преимущества яблони перед домкратом. а потом по аналогии получишь ответ на свой вопрос.


Это сообщение отредактировал(а) bsa - 19.7.2012, 10:58
PM   Вверх
gendalf7771
Дата 19.7.2012, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @  19.7.2012,  10:58 Найти цитируемый пост)
перечисления используются для создания именованных констант.

Да, это я понимаю. В своём коде я указал трём константам их имена - 0,1,2. Хочется узнать, что нужно сделать, чтобы происходила замена имени на значение.

Цитата(bsa @  19.7.2012,  10:58 Найти цитируемый пост)
покажи сначала пример преимущества яблони перед домкратом. а потом по аналогии получишь ответ на свой вопрос.

Я имел ввиду, что можно ведь просто массив строк создать и не мучаться. Но ведь enum'ы для чего-то другого создавались, наверное.  Также можно и #define пользоваться, тогда зачем enum? Или у меня в корне неверное представление о перечислениях?
PM MAIL   Вверх
unclebenedict
Дата 19.7.2012, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Видимо ты просто не совсем понимаешь для чего нужны перечисления. Их часто используют для ослеживания состояний(например при интернет соединении) или ими достаточно удобно задавать свойства. Но я ниразу не встречал что бы перечислению что то присваивали smile Вот глянь пример использования http://liveworkspace.org/code/3ac1089fdaff...c5a6cd3ba6c4685

Это сообщение отредактировал(а) unclebenedict - 19.7.2012, 11:27
PM MAIL   Вверх
gendalf7771
Дата 19.7.2012, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Посмотрел, спасибо) Однако всё ещё не вижу отличия от того же #define. smile  В вашем примере вполне можно так сделать. Или вся разница только в синтаксисе?

Честно, смотрел описание enum на cplusplus.com и в темах здесь, и в интернете читал много

Это сообщение отредактировал(а) gendalf7771 - 19.7.2012, 11:46
PM MAIL   Вверх
bsa
Дата 19.7.2012, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



gendalf7771, #define это операция препроцессора. В место использования макроса тупо подставляется значение. В итоге, результат может в корне отличаться от ожидаемого, так как компилятор не всегда способен понять, что именно ты хотел получить и предупредить тебя об опасности. В случае перечислений компилятор такие проверки сделать уже может. И если ты попытаешься присвоить левое значение переменной типа перечисления, то он тебя пошлет. Что есть совершенно правильно. Препроцессор вообще зло. И использовать его нужно только тогда, когда других вариантов не остается.
PM   Вверх
gendalf7771
Дата 19.7.2012, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо всем! Разобрался smile 
PM MAIL   Вверх
xvr
Дата 19.7.2012, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(gendalf7771 @  19.7.2012,  11:39 Найти цитируемый пост)
Однако всё ещё не вижу отличия от того же #define.

Ну вот например отличие:
Код

enum {
 x=10
};

int test()
{
 int x=1;
 return x;
}

и
Код

#define x 10

int test()
{
 int x=1;
 return x;
}

Второе выдаст ошибку при компиляции

PM MAIL   Вверх
math64
Дата 19.7.2012, 13:17 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 12
Всего: 72



Для задания констнты нужно пользоваться не enum, а const:
Код

const x = 10;

int test()
{
 int x=1;
 return x;
}

int test2()
{
int y = x;
return y;
}

Будет компилироваться

enum используется для связанных значений, которые может принимать переменная:
Код

enum EAxes
{
    x,
    y,
    z
};

struct Point {
int x;
int y;
int z;
};
void main {
  EAxes axe = x;
  Point p;
  int coord;
  switch(axe) {
    case x: coord = p.x; break;
    case y: coord = p.y; break;
    case z: coord = p.z; break;
  }
}

В случае если в switch будет пропущен один из case компилятор выдаст предупреждение.

PM   Вверх
EvilsInterrupt
Дата 19.7.2012, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Цитата

Для задания констнты нужно пользоваться не enum, а const:

Почему? А если так:

Код

class Class1
{
public:
   typedef  std::streamsize   Class1StreamSize;
   enum { Class1StreamSizeMax = (Class1StreamSize)(-1) };
//...много кода
};


?
PM MAIL WWW ICQ Jabber   Вверх
bsa
Дата 19.7.2012, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



EvilsInterrupt, перечисления менее универсальны, чем константные переменные (доступны только целые значения и нельзя разделить объявления и определения). Но под них гарантированно не выделяется память в сегменте данных.
PM   Вверх
EvilsInterrupt
Дата 19.7.2012, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



bsa
Ну так это же хорошо, что гарантированно не выделяется! Если константа очень редко используется, то в некоторых случаях мы от этой вставки только выигрываем.

Еще раз перескажу сказанное тобою:

Как правило enum-константы вставляются прямо по месту в коде, а секции кода очень часто в исполнимых файлах помечаются только с атрибутами по чтению и выполнению. 

А константы по методу const int очень часто ложатся в секцию данных с атрибутом на чтение и в коде указатель на эту область. Что не особо хорошо.

Пересказал, только лишь для того чтобы другие, кто не знал, понимали еще одно отличие этих констант.
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 19.7.2012, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(EvilsInterrupt @  19.7.2012,  17:41 Найти цитируемый пост)
Как правило enum-константы вставляются прямо по месту в коде, а секции кода очень часто в исполнимых файлах помечаются только с атрибутами по чтению и выполнению. 

А константы по методу const int очень часто ложатся в секцию данных с атрибутом на чтение и в коде указатель на эту область. Что не особо хорошо.

не в этом главное отличие константы от енума.. 



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


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Цитата

не в этом главное отличие константы от енума.. 

А никто и не говорил, что это главное! ;)
PM MAIL WWW ICQ Jabber   Вверх
gendalf7771
Дата 20.7.2012, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mes, можно поподробнее об остальных отличиях?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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