Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на C / C++

Выпуск № 133
от 29.11.2002, 04:20

Администратор:
Имя: Nick.Box
URL: Информационный ресурс
ICQ: 365124
[censored], [censored]
О рассылке:
Задано вопросов: 398
Отправлено ответов: 871
Активность: 218.8 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Yuri Gordienko
Статус: Опытный
Общий рейтинг: 119.35
[Подробней >>]
Avl2k
Статус: Доверительный
Общий рейтинг: 127.04
[Подробней >>]
Dzik
Статус: Профессиональный
Общий рейтинг: 114.55
URL: Разработка игрушек
[Подробней >>]
 
vitya
Статус: Профессиональный
Общий рейтинг: 108.23
[Подробней >>]
Jadd
Статус: Профессиональный
Общий рейтинг: 140.92
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 387. Здравствуйте, такая проблема: есть class: class CChar { public: unsigned char Name; unsigned short... (ответов: 5)

Вопросов: 1, ответов: 5


 Вопрос № 387

Здравствуйте, такая проблема:
есть class:
class CChar
{
public:
unsigned char Name;
unsigned short Index;
};
sizeof(Name) == 1;
sizeof(Index) == 2;
Почему bc 3.0 (под ДОС) мне упрямо говорит что
sizeof(CChar) == 4?
и в файл тоже пишет 4 байта, откуда он его вообще берет?
И как от этого избавиться?
Еще вопрос:
Что значит третий параметр в функции fwrite/fread?
и до кучи:
метод:
int CChar::SaveToFile(FILE *fp)
{
int n = fwrite(&Name, sizeof(Name), 1, fp);
n += fwrite(&Index, sizeof(Index), 1, fp);
return n;
}
IMHO: должно быть == 3 т.к. fwrite возвращяет число записанных байт так и есть в файле 3 байта
а на самом деле n == 2
Почему так?
Что значит третий параметр как я уже писАл - незнаю



Вопрос отправлен: 26.11.2002, 04:10
Отправитель: Serzhant (Serzhant_mail@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Yuri Gordienko

Приветствую Вас, Serzhant!
Если включено выравнивание (по умолчанию включено почти везде, т.к. ускоряет многие операции), то может теоретически и 10 вернуть ;). Поэтому во всех умных книжках пишется, что сравнивать(писать в файл также) структуры как массив байт крайне не рекомендуется, т.к. в данном массиве могут быть дырки, значение которых не определено. Сохраняй в файл почленно. Избавляться от этого не рекомендуется, - нужно просто правильно писать.
Третий параметр в fread/fwrite - это количество блоков чтения/записи размер которого(блока) равен второму параметру.
Функция возвращает не число записанных байт, а число блоков, поэтому возвращается все правильно
Советую дернуть в инете русский мануал по glibc, - в нем все эти функции расписаны прекрасно. Если нужно, могу на ящик сбросить.
Удачи


Ответ отправлен: 26.11.2002, 10:19
Отправитель: Yuri Gordienko


Отвечает Avl2k

Приветствую Вас, Serzhant!
1. Размер структуры в общем случае не равен сумме размеров ее членов, поскольку компиляторы для оптимизации (быстрее доступ к данным) применяют выравнивание данных по определенной границе. В данном случае стоит выравнивание по границе 2 или 4. Не знаю как в bc 3.0, а в VC++ для управления выравниванием есть опция компилятора и #pragma pack.
2. В функции fwrite второй параметр - это размер элемента, а третий - количество элементов указанного размера, которые необходимо записать. И возвращает она не количество записанных байт, а количество записанных элементов. Поэтому и возвращается 2, так как в обоих вызовах было записано по одному элементу.
С уважением, Avl2k.

Ответ отправлен: 26.11.2002, 10:32
Отправитель: Avl2k


Отвечает Dzik

Здравствуйте, Serzhant!
1)4 потому, что идет округление до long, т.е. пишется в любом случае число кратное 4
2)3 парметр это кол-во записываемых элементов.


Ответ отправлен: 26.11.2002, 05:35
Отправитель: Dzik


Отвечает vitya

Доброе время суток, Serzhant!
Есть такое понятие, как alignment. Он все структуры делает кратными 4 байтам.
Второй параметер из себя представляет размер элемента, который будет записываться в файл, а третий параметр - их количество.


Ответ отправлен: 26.11.2002, 14:27
Отправитель: vitya


Отвечает Jadd

Приветствую Вас, Serzhant!
1) А сколько, по-твоему, должно быть? Давай считать: unsigned char - 1 байт, unsigned short - 2 байта. Далее, идет выравнивание памяти до 4-х байт. Причем, скорее выравнивание будет таким: 1 байт под char, 1 байт под выравнивание и 2 байта под short. Все просто. Избавиться от этого можно используя директиву препроцессора #pragma с опцией pack
2)третий параметр fread/fwrite - size_t count. Согласно MSDN - Maximum number of items to be read/written. Т.е. fread считывает count элементов размером size каждый в буффер Buffer из потока stream.
3)А как инициализируется Index? Чаще всего Index первого элемента равен 0.

Ответ отправлен: 26.11.2002, 15:07
Отправитель: Jadd



Форма отправки вопроса

Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (41)
C / C++ (29)
Perl (9)
Delphi (14)
Pascal (22)
Basic / VBA (10)
Java / JavaScript (15)
PHP (10)
MySQL / MSSQL (9)
Пользователю
Windows 95/98/Me (35)
Windows NT/2000/XP (22)
"Железо" (27)
Поиск информации (16)
Администратору
Windows NT/2000/XP (12)
Linux / Unix (17)
Юристу
Гражданское право (9)
Семейное право (3)
Трудовое право (5)
КоАП (3)

Отправить вопрос всем экспертам выбранной рассылки.




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное