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

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

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
06.03.2012, 13:30     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? #1
То есть вот структура:
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     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть?
Посмотрите здесь:

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

fwrite(&tgaheader, sizeof(tgaheader));

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

но луче всего создать функцию записи/сохранения, которая бы записывала/считывала каждый член структуры в отдельности.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,308
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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
07.03.2012, 00:41  [ТС]     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? #4
CheshireCat, спасибо, помогло
C++
1
2
         WORD    ColourMapOrigin __attribute__ ((packed));
         WORD    ColourMapLength __attribute__ ((packed));
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
07.03.2012, 00:43     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? #5
kravam, внимание вопрос: зачем тебе это? Выравнивание компилятор не чисто поржать делал.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
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     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть?
Еще ссылки по теме:

Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L C++
C++ Написать программу, которая считывает текст из файла и выводит на экран только цитаты, то есть предложения, заключенные в кавычки
C++ Тело POST запроса. Как самому узнать, что там должно быть?

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

Или воспользуйтесь поиском по форуму:
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     Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть?
Ответ Создать тему
Опции темы

Текущее время: 23:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru