реклама на сайте
подробности

 
 
> Указатели на массивы в структуре
Grizzzly
сообщение Mar 11 2014, 16:30
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 565
Регистрация: 22-02-13
Пользователь №: 75 748



Разбираю код, написанный давным-давно не мной и скомпилированный древним RVDS 2.2. Программа работает, но возник вопрос.
Есть некая структура:
Код
typedef struct
    {
     UINT64 Power[5];
     UINT64 IncThreshold[5];
     REAL32 NoisePower[5];
    }Data;

Затем в программе объявляется указатель на Power:
Код
UINT64 *pPower = &ChData.Power[0];

А потом по этому же указателю происходит обращение к элементам массива IncThreshold. Например,
Код
pPower[5];
И так далее.
Насколько это безопасно? В данном случае массивы Power и IncThreshold расположены последовательно. Ошибки нет.
Вдруг другой компилятор расположит элементы структуры по-другому? Не говоря уже о том, что можно забыть и самому добавить новые элементы в структуру между данными массивами.
На мой взгляд, доволно странный код.

Сообщение отредактировал Grizzzly - Mar 11 2014, 16:32
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
aaarrr
сообщение Mar 11 2014, 16:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Grizzzly @ Mar 11 2014, 20:30) *
Вдруг другой компилятор расположит элементы структуры по-другому? Не говоря уже о том, что можно забыть и самому добавить новые элементы в структуру между данными массивами.

Пока массивы имеют одинаковый тип и расположены последовательно, ничего страшного не произойдет: компилятор не имеет права менять расположение элементов внутри структуры.

Цитата(Grizzzly @ Mar 11 2014, 20:30) *
На мой взгляд, доволно странный код.

Да, так лучше не делать.
Go to the top of the page
 
+Quote Post
msalov
сообщение Mar 12 2014, 05:29
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Это плохой стиль, т.к. форма (имя переменной) не соответствует содержанию. Если поля с одинаковым индексом связаны логически, имеет смысл сделать массив структур:
Код
typedef struct
       {
        UINT64 Power;
        UINT64 IncThreshold;
        REAL32 NoisePower;
       }Data_element;

   typedef Data_element[5] Data;

Но это потянет изменения в программе. А с учётом стиля её написания - будет много веселья.
Go to the top of the page
 
+Quote Post
Grizzzly
сообщение Mar 12 2014, 13:08
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 565
Регистрация: 22-02-13
Пользователь №: 75 748



Цитата(aaarrr @ Mar 11 2014, 20:49) *
Пока массивы имеют одинаковый тип и расположены последовательно, ничего страшного не произойдет: компилятор не имеет права менять расположение элементов внутри структуры.

Спасибо.


Цитата(msalov @ Mar 12 2014, 09:29) *
Но это потянет изменения в программе. А с учётом стиля её написания - будет много вселеья.

Спасибо. Если будет свободное время, перепишу код. Уже чую предстоящее веселье. Поэтому пока склонен оставить как есть.
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 13 2014, 02:40
Сообщение #5


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (aaarrr @ Mar 11 2014, 23:49) *
Пока массивы имеют одинаковый тип и расположены последовательно, ничего страшного не произойдет: компилятор не имеет права менять расположение элементов внутри структуры.

С этим я бы поспорил. На некоторых 32-разрядных платформах любой агрегатный объект размещается по адресу, кратному 4, поэтому два идущих подряд массива, например, с 8-ми или 16-ти разрядными элементами могут иметь "дырку" между собой.

UPD: правда, я уже не помню, на какой платформе это было.

QUOTE
Да, так лучше не делать.

+1.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016