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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> enum 
:(
    Опции темы
Hawaii
Дата 26.8.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Какой размер у значений перечисляемого типа enum ? Или каждое значение имеет свой размер.

Есть такая строчка. enum employee_type {tmanager, tscientist, tlaborer};

Является ли каждое в отдельности значение tmanager, tscientist, tlaborer типом char*  или каким-нибудь другим?

Как эти значения записываются в файл в этом коде, неужели посимвольно?

Код

      etype = arrap[j]->get_type();
                              //write type to file
      ouf.write( (char*)&etype, sizeof(etype) );        <------  ???
      switch(etype)           //find its size                       
         {                                                          
         case tmanager:   size=sizeof(manager); break;               
         case tscientist: size=sizeof(scientist); break;        
         case tlaborer:   size=sizeof(laborer); break;
         }                    //write employee object to file 
      ouf.write( (char*)(arrap[j]), size );



 smile
PM MAIL   Вверх
bsa
Дата 26.8.2007, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Это зависит от настроек компилятора. По сути, enum эквивалентен unsigned.
PM   Вверх
zkv
Дата 26.8.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Код

write( /*А тут требуется приведение типа?*/(char*)&etype, sizeof(etype) );

этого достаточно smile
PM MAIL   Вверх
Lazin
Дата 26.8.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



по умолчанию enum это unsigned int, а значения в фигурных скобках - просто константы, если явно не указывать то начинаются с нуля tmanager = 0, tscientist = 1, tlaborer = 2
PM MAIL Skype GTalk   Вверх
Hawaii
Дата 26.8.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ouf.write( (char*)&etype, sizeof(unsigned int) );     Спасибо всем за разъяснение.   С аргументом   unsigned int тоже работает  smile     
PM MAIL   Вверх
zkv
Дата 27.8.2007, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Hawaii @  26.8.2007,  23:31 Найти цитируемый пост)
ouf.write( (char*)&etype, sizeof(unsigned int) );

все таки лучше было:
Код

write( (char*)&etype, sizeof(etype) );

так как:
Цитата(bsa @  26.8.2007,  22:15 Найти цитируемый пост)
Это зависит от настроек компилятора.

а второй вариант не будет от них зависеть
PM MAIL   Вверх
bsa
Дата 27.8.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Hawaii @ 26.8.2007,  23:31)
ouf.write( (char*)&etype, sizeof(unsigned int) );     Спасибо всем за разъяснение.   С аргументом   unsigned int тоже работает  smile

На самом деле, я немного упростил свой ответ. Все намного сложнее. Например, на архитектуре x86_64 под Linux перечисления могут иметь размер sizeof(unsigned long) == 2*sizeof(unsigned).
Поэтому правильная запись - так, как указал zkv.
С другой стороны, если ты собираешься работать с платформонезависимым форматом файла и не хочешь переписывать процедуры под разные платформы и настройки компилятора, то надо пользоваться жестко заданными размерами (без использования sizeof).
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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