Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
#1

Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? - C++

06.03.2012, 13:30. Просмотров 450. Ответов 6
Метки нет (Все метки)

То есть вот структура:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct TGAHEADER
{
         char   IdLength;
         char   ColourMapType;
         char   DataTypeCode;
         WORD    ColourMapOrigin;
         WORD    ColourMapLength;
         char   ColourMapDepth;
         WORD    x_Origin;
         WORD    y_Origin;
         WORD    Width;
         WORD    Height;
         char   BitsPerPixel;
         char   ImageDescriptor;
};
TGAHEADER tgaheader;
 
//И она располагается в каком-то файле Fire.tag, вот я её считал:
fread(&tgaHeader, 1/* sizeof(TGAHEADER)*/, 18, pFile);
Теперь как обратиться к полю BitsPerPixel? Вот так не обратиться!
C++
1
tgaHeader.BitsPerPixel
А потому, что предыдущее поле ColourMapOrigin считьывается не по смещению 3, где оно есть, а по смещению 4. НАверное, потому что word. Соттветственно и последующие поля считываются не оттуда, где они находятся, а с других адресов

Ну я извращаюсь щас всяко, так например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct TGAHEADER
{
         char   IdLength;
         char   ColourMapType;
         char   DataTypeCode;
         
         //Если понадобится один из пяти байтов, опять придётся извращаться
         char x [5];
 
         WORD    x_Origin;
         WORD    y_Origin;
         WORD    Width;
         WORD    Height;
         char   BitsPerPixel;
         char   ImageDescriptor;
};
Можно так ещё:
C++
1
*((char*)&tgaHeader+ 16;
Но это костыли какие-то, есть грамотный способ? Спасибо, кто откликнется!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2012, 13:30     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть?
Посмотрите здесь:

Константные поля и операция присвоения - как быть? C++
C++ Есть общая структура программы, как правильно (написать)определить функции к ней?
Как назывался компилятор типаBorland Pascal только для C++ C++
Структура: база сотрудников и их адресов C++
C++ Как через if объявить, что некоторые значения не должны быть равны 0
написать программу, которая считывает текст из файла и выводит на экран только цитаты, то есть предложения, заключенные в кавычки C++
Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
06.03.2012, 14:39     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? #2
записать нужно так

fwrite(&tgaheader, sizeof(tgaheader));

а считать fread(&tgaheader, sizeof(tgaheader));

но луче всего создать функцию записи/сохранения, которая бы записывала/считывала каждый член структуры в отдельности.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
06.03.2012, 15:48     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? #3
Читай про выравнивание.
Можешь обернуть свою структуру в прагмы (они могут отличаться в твоем компиляторе, RTFM документацию на него):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma pack(push, 1)
struct TGAHEADER {
          char   IdLength;
          char   ColourMapType;
          char   DataTypeCode;
          WORD    ColourMapOrigin;
          WORD    ColourMapLength;
          char   ColourMapDepth;
          WORD    x_Origin;
          WORD    y_Origin;
          WORD    Width;
          WORD    Height;
          char   BitsPerPixel;
          char   ImageDescriptor;
};
#pragma pack(pop)

kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
07.03.2012, 00:41  [ТС]     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? #4
CheshireCat, спасибо, помогло
C++
1
2
         WORD    ColourMapOrigin __attribute__ ((packed));
         WORD    ColourMapLength __attribute__ ((packed));
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,113
07.03.2012, 00:43     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? #5
kravam, внимание вопрос: зачем тебе это? Выравнивание компилятор не чисто поржать делал.
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
07.03.2012, 00:53  [ТС]     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? #6
Чтобы можно было обращаться к полю структуры
C++
1
tgaHeader.BitsPerPixel
+++++++++++++++++++++++++++++++++

И да, а зачем он выравнивает? Наверное, чтобы прога побыстрее работала, но в моём случае это некритично. Была бы какая другая причина- наверное, он бы не скомпилил код, не?

Добавлено через 6 минут
И кстати, сразу же договорися о терминах- при считывании из файла в структуру компилятор НЕ ВЫРАВНИВАЕТ, он перегоняет содержимое структуры КАК ЕСТЬ.
Но вот при считывании из этого участка памяти программа считает, что все поля выровнены.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2012, 01:20     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть?
Еще ссылки по теме:

C++ Написать программу, которая считывает текст из файла и выводит на экран только цитаты, то есть предложения, заключенные в кавычки
C++ Тело POST запроса. Как самому узнать, что там должно быть?
C++ Code::Blocks выдаёт ошибку там где её не должно быть
C++ Как вставить пробел после знака препинания, если его там нет?
Программа считывает только первую строку файла,как сделать чтобы она считывала все строки C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
07.03.2012, 01:20     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? #7
Шилдт описывал такую вещь как указатель на поле структуры, может пригодится:
C++
1
2
3
4
5
    TGAHEADER tgah;
    tgah.BitsPerPixel = 'X';
    char TGAHEADER::*bpp;           // объявляем указатель на член класса
    bpp = &TGAHEADER::BitsPerPixel; // Определяем смещение BitsPerPixel
    cout << tgah.*bpp << endl;
Yandex
Объявления
07.03.2012, 01:20     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru