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

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.97
John Paramol
#1

Помогите разобраться с выравниванием данных - C++ Builder

10.05.2007, 00:44. Просмотров 4970. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Помогите, пожалуйста, у меня уже голова кругом. В приложении кусок кода. Компилятор C++ Bulder 6. Пытаюсь выровнять данные по границе 16 байт. По всем признакам, это делается директивой #pragma pack(16), однако данные не хотят выравниваться. Я уже добавил лишние float Unused[7] для дополнения структуры до размера, кратного 16 байтам, но все равно не помогает.
Может, кто-нибудь сталкивался с подобным? Хотя бы что можно еще попробовать?
Может быть, можно выделить память с помощью GlobalAlloc с выравниванием?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  #pragma pack(push,16)
  struct SSE_128AlignedData
  {
    float Data[9];
    float Unused[7];
  };
  static SSE_128AlignedData Koef;
  static SSE_128AlignedData CR;
  static SSE_128AlignedData CG;
  static SSE_128AlignedData CB;
  #pragma pack (pop)
  /*ShowMessage("Koef = 0x"+IntToHex((int)&Koef,8)+
              "  CR = 0x"+IntToHex((int)&CR,8)+
              "  CG = 0x"+IntToHex((int)&CG,8)+
              "  CB = 0x"+IntToHex((int)&CB,8));*/
  if((DWORD)&Koef % 16 ||
     (DWORD)&CR % 16 ||
     (DWORD)&CG % 16 ||
     (DWORD)&CB % 16) Beep(1000,100);
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2007, 00:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Помогите разобраться с выравниванием данных (C++ Builder):

Помогите разобраться с библиотеками - C++ Builder
#include <vcl.h> #include <math.h> #pragma hdrstop #include "Main.h" #include <stdio.h> ...

Помогите разобраться в C++ Builder XE - C++ Builder
Помогите разобраться в C++ Builder XE !! Вчера установил себе новый С++ до этого работал в С++ Builder 6 ,а в этом счасть е даже не знаю...

Помогите разобраться с шаблонами - C++
Пытаюсь реализовать новую для себя методику "службы класса". Все хорошо работало, пока не возникла необходимость в качестве клиента слжбы...

Помогите разобраться новичку!! - C++ Builder
Всем здрасте!) Мы только начали изучать среду Borland C++ Builder, поэтому многих вещей я не понимаю. Нужную литературу как ни старалась...

Помогите разобраться в коде - C++ Builder
Здрасьте!!! помогиде разобраться в одном коде!!!! void __fastcall TForm1::Button2Click(TObject *Sender) { spisok obj; bool is...

Помогите разобраться (не создает папки) - C++ Builder
Пытаюсь программно создать папки в системных папках (например System32) на семерке, если без прав администратора то выкидывает ошибку,...

5
Logot
1 / 1 / 0
Регистрация: 15.05.2010
Сообщений: 54
10.05.2007, 03:58 #2
Ну так а в чем проблема? Как раз эта структура и кратна 16 байтам и без прагмы
C++
1
2
3
4
5
6
struct SSE_128AlignedData
{
  float Data[9];
  float Unused[7];
};
std::cout << sizeof(SSE_128AlignedData) / 16 << std::endl;
Выведет 4

Ты напиши, что тебе нужно сделать, а то не совсем понятно
0
John Paramol
10.05.2007, 04:48 #3
Проблема не в этом. Размер структуры мне не так важен. Надо чтобы структура располагалась в памяти по адресу, кратному 16 байтам.
Поэтому я делаю проверку (DWORD)&Koef % 16 == 0, т.е. остаток от деления адреса структуры на 16 должен равняться нулю.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
11.05.2007, 16:14 #4
Вот тут есть пример работы #pragma pack(1):

http://publib.boulder.ibm.com/infoce...f/rnpgpack.htm



по-моему там выравнивание не адреса по которому распологаются объекты структуры, а выравниваение адресов по которому располагаются элементы структуры относительно друг друга



С уважением,

Владимир
0
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
11.05.2007, 16:25 #5
Похоже, что в Borland Builder #pragma pack работает похожим образом:

http://faqs.org.ru/progr/c_cpp/cbuilder.htm
>Q9: Почему в билдере размер структуры всегда растягивается до кратного 4-ем?
A: Из-за выравнивания (RTFM Data Alignment).

Чтобы поля структуры выравнивались на 8-ми битную границу, необходимо использовать следующую конструкцию:
C++
1
2
3
#pragma pack(push, 1)
<structure definition>
#pragma pack(pop)
Менять выравнивание для всего проекта (Project OptionsAdvanced Compiler Data Alignment) не рекомендуется.
0
John Paramol
12.05.2007, 03:11 #6
Да, спасибо, насчет #pragma pack мне уже подсказали. Остается способ выделять память GlobalAlloc, чуть большую, чем нужно, потом сдвигаться до адреса, кратного 16. Но этот вариант меня не совсем устраивает по ряду причин. Очень жаль, что нет такой простой директивы препроцессора.
12.05.2007, 03:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2007, 03:11
Привет! Вот еще темы с ответами:

Помогите разобраться ошибкой Convert - C++ Builder
Не найден псевдоним &quot;Convert&quot; что делать? Может какой нибудь класс надо добавить?

Помогите разобраться с динамическими библиотеками - C++
Здравсвуйте форумчане... т.к я еще молод и зелен прошу помочь тех кто разбирается в динамических библиотеках: что такое есть билиотека( у...

OLE-Container, помогите разобраться - C++ Builder
Доброго времени суток всем! Сразу к делу. Вопрос вот в чем: как управлять объектом внутри OLE-контейнера? (конкретно- у меня обект...

Чат ч-з Indy. Помогите разобраться!!! - C++ Builder
Нашол пример чата в книге но переписав его для просмотра работы, повыскакивали ошибки!!! (ReadLn() и WriteLn(); не пренадлежат классу...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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