Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Указатели на массивы в структуре
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Grizzzly
Разбираю код, написанный давным-давно не мной и скомпилированный древним 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 расположены последовательно. Ошибки нет.
Вдруг другой компилятор расположит элементы структуры по-другому? Не говоря уже о том, что можно забыть и самому добавить новые элементы в структуру между данными массивами.
На мой взгляд, доволно странный код.
aaarrr
Цитата(Grizzzly @ Mar 11 2014, 20:30) *
Вдруг другой компилятор расположит элементы структуры по-другому? Не говоря уже о том, что можно забыть и самому добавить новые элементы в структуру между данными массивами.

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

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

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

   typedef Data_element[5] Data;

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

Спасибо.


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

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

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

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

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

+1.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.