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

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

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

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

06.03.2012, 13:30. Просмотров 470. Ответов 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;
Но это костыли какие-то, есть грамотный способ? Спасибо, кто откликнется!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2012, 13:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? (C++):

Программа считывает очередную строку совершенно верно, но в ней она находит цифры, которых там вообще нет - Free Pascal
У меня возникла такая проблема. В некотором файле в каждой строке записан какой-то текст(может быть из нескольких слов), в котором только в...

Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L - C++
Помогите написать программу такого рода: Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L. Буду благодарен...

Есть ключ, нет диска. Как быть? - Windows 8, 8.1
Люди, такой вопрос. Есть диск с windows 8.1 (лицензия), но он царапаный, так же есть ключ. С диска я загрузится не могу, можно ли где...

В компе дисковод показывает, что там есть диск (на нём игра, открываются все папки), хотя его там нет! Другие диски не видит. Пишет "Вставьте диск" - Windows 7
В компе дисковод показывает, что там есть диск (на нём игра, открываются все папки), хотя его там нет! Другие диски не видит. Пишет...

Программа считывает очередную строку совершенно верно, но в ней она находит цифры, которых там вообще нет - Free Pascal
У меня возникла такая проблема. В некотором файле в каждой строке записан какой-то текст(может быть из нескольких слов), в котором только в...

Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L - C++
Помогите написать программу такого рода: Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L. Буду благодарен...

Есть ключ, нет диска. Как быть? - Windows 8, 8.1
Люди, такой вопрос. Есть диск с windows 8.1 (лицензия), но он царапаный, так же есть ключ. С диска я загрузится не могу, можно ли где...

В компе дисковод показывает, что там есть диск (на нём игра, открываются все папки), хотя его там нет! Другие диски не видит. Пишет "Вставьте диск" - Windows 7
В компе дисковод показывает, что там есть диск (на нём игра, открываются все папки), хотя его там нет! Другие диски не видит. Пишет...

Программа считывает очередную строку совершенно верно, но в ней она находит цифры, которых там вообще нет - Free Pascal
У меня возникла такая проблема. В некотором файле в каждой строке записан какой-то текст(может быть из нескольких слов), в котором только в...

Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L - C++
Помогите написать программу такого рода: Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L. Буду благодарен...

Есть ключ, нет диска. Как быть? - Windows 8, 8.1
Люди, такой вопрос. Есть диск с windows 8.1 (лицензия), но он царапаный, так же есть ключ. С диска я загрузится не могу, можно ли где...

В компе дисковод показывает, что там есть диск (на нём игра, открываются все папки), хотя его там нет! Другие диски не видит. Пишет "Вставьте диск" - Windows 7
В компе дисковод показывает, что там есть диск (на нём игра, открываются все папки), хотя его там нет! Другие диски не видит. Пишет...

Программа считывает очередную строку совершенно верно, но в ней она находит цифры, которых там вообще нет - Free Pascal
У меня возникла такая проблема. В некотором файле в каждой строке записан какой-то текст(может быть из нескольких слов), в котором только в...

Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L - C++
Помогите написать программу такого рода: Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L. Буду благодарен...

Программа считывает очередную строку совершенно верно, но в ней она находит цифры, которых там вообще нет - Free Pascal
У меня возникла такая проблема. В некотором файле в каждой строке записан какой-то текст(может быть из нескольких слов), в котором только в...

Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L - C++
Помогите написать программу такого рода: Дано натуральное число N. Определить есть ли оно кратным K, но не кратным L. Буду благодарен...

Есть ключ, нет диска. Как быть? - Windows 8, 8.1
Люди, такой вопрос. Есть диск с windows 8.1 (лицензия), но он царапаный, так же есть ключ. С диска я загрузится не могу, можно ли где...

В компе дисковод показывает, что там есть диск (на нём игра, открываются все папки), хотя его там нет! Другие диски не видит. Пишет "Вставьте диск" - Windows 7
В компе дисковод показывает, что там есть диск (на нём игра, открываются все папки), хотя его там нет! Другие диски не видит. Пишет...


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

Или воспользуйтесь поиском по форуму:
6
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
06.03.2012, 14:39 #2
записать нужно так

fwrite(&tgaheader, sizeof(tgaheader));

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

но луче всего создать функцию записи/сохранения, которая бы записывала/считывала каждый член структуры в отдельности.
1
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
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)

1
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
07.03.2012, 00:41  [ТС] #4
CheshireCat, спасибо, помогло
C++
1
2
         WORD    ColourMapOrigin __attribute__ ((packed));
         WORD    ColourMapLength __attribute__ ((packed));
0
NoMasters
Псевдослучайный
1762 / 1105 / 73
Регистрация: 13.09.2011
Сообщений: 3,141
07.03.2012, 00:43 #5
kravam, внимание вопрос: зачем тебе это? Выравнивание компилятор не чисто поржать делал.
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
07.03.2012, 00:53  [ТС] #6
Чтобы можно было обращаться к полю структуры
C++
1
tgaHeader.BitsPerPixel
+++++++++++++++++++++++++++++++++

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

Добавлено через 6 минут
И кстати, сразу же договорися о терминах- при считывании из файла в структуру компилятор НЕ ВЫРАВНИВАЕТ, он перегоняет содержимое структуры КАК ЕСТЬ.
Но вот при считывании из этого участка памяти программа считает, что все поля выровнены.
0
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;
0
07.03.2012, 01:20
Ответ Создать тему
Опции темы

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