|
Обращение к элементу двухмерного массива используя адрес массива |
|
|
|
Dec 24 2010, 14:13
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 14-03-10
Из: BELARUS
Пользователь №: 55 953

|
Код //Структура описывающая подпрофиль typedef struct { unsigned short type; unsigned short signal; } sub_profile;
//Массив подпрофиля 1 const sub_profile SUB_PROFILE_1 = { 330, 400 };
//Массив подпрофиля 2 const sub_profile SUB_PROFILE_2 = { 100, 1200 };
......
//Массив подпрофиля n const sub_profile SUB_PROFILE_n = { 1, 2 }; Массив профиля состоящий из указателей на подпрофили Код const sub_profile * PROFILE_1[] = {&SUB_PROFILE_1, &SUB_PROFILE_2, ... , &SUB_PROFILE_n, 0}; И еще один массив содержащий указатели на профили Код const sub_profile ** PROFILE[] = {PROFILE_1, ... , PROFILE_n, 0}; Массив PROFILE[] не объявлен, но известно что он начинается с адреса 0x0801F000 (по этому адресу он записывается при помощи другого проекта). Каким образом я могу обратиться к элементу структуры определенного подпрофиля, определенного профиля. При попытке: Код #define PROFILE ((sub_profile **)(0x0801F000))
unsigned int temp; temp = PROFILE[1][0]->type; IAR ARM 5.50 выдает ошибку expression must have pointer type
|
|
|
|
|
 |
Ответов
(15 - 29)
|
Dec 26 2010, 18:52
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(sigmaN @ Dec 27 2010, 02:36)  И вообще мне интересо, почему Ваш этот ИАР не хавает предложенный мною вариант... вроде там всё по Сишному правильно....какого он, извиняюсь, икса.... Дык там скобочек не хватает. Вот так не ругается Код temp = ((sub_profile *)(*PROFILE))[0].type; //temp == 330 правда и не работает как хотелось бы ТС
|
|
|
|
|
Dec 26 2010, 20:58
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 14-03-10
Из: BELARUS
Пользователь №: 55 953

|
компилируется и работает. Цитата(rezident @ Dec 26 2010, 22:38)  Ну вот так точно уж должно работать Код #define PROFILE ((sub_profile **)(0x0801F000))
unsigned short temp; sub_profile **pptr, *pntr;
pptr = PROFILE; // инициализируем указатель pptr = (sub_profile **)(pptr[1]); // извлекаем из массива указатель на требуемый массив указателей pntr = (sub_profile *)(*pptr); // извлекаем из массива указателей требуемый указатель на структуру temp = pntr[1].type; //извлекаем элемент структуры Тут все по-отдельности, но типизация соответствует. компилируется и тоже работает. Цитата(rezident @ Dec 26 2010, 23:17)  Вот так тоже работает, но лично меня сложность такой конструкции несколько угнетает  Код temp = ((sub_profile *)(*(sub_profile **)PROFILE[1]))[1].type; ОГРОМНОЕ СПАСИБО!!!
|
|
|
|
|
Dec 26 2010, 21:18
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
скобок действительно не хватало и похоже, что на любом компиляторе, кроме AVR GCC мой код не компилился. Но я сделал вот так Код temp = ((sub_profile *)(*PROFILE))[0].type; //temp == 330 temp = ((sub_profile *)(*PROFILE))[1].type; //temp == 100 и дело пошло. Даже в микрософтовской визуал студии всё работает правильно. added кажется надо больше спать. ТС говорил о том, что массив содержит массив указателей на профили, да... понял. молчу. ))
--------------------
The truth is out there...
|
|
|
|
|
Dec 27 2010, 05:01
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (sigmaN @ Dec 27 2010, 02:18)  Но я сделал вот так CODE temp = ((sub_profile *)(*PROFILE))[0].type; //temp == 330 temp = ((sub_profile *)(*PROFILE))[1].type; //temp == 100 и дело пошло. Даже в микрософтовской визуал студии всё работает правильно. Что-то вас всех куда-то понесло в дебри CODE #define PROFILE ((sub_profile ***)(0x0801F000)) unsigned int temp;
temp = PROFILE[1][0]->type;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 27 2010, 07:39
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 14-03-10
Из: BELARUS
Пользователь №: 55 953

|
Цитата(Сергей Борщ @ Dec 27 2010, 10:01)  Что-то вас всех куда-то понесло в дебри Код #define PROFILE ((sub_profile ***)(0x0801F000)) unsigned int temp; temp = PROFILE[1][0]->type; Спасибо. Очень красивый вариант. Почти точно такой предложили сотрудники на работе. Еще раз спасибо!!!!
|
|
|
|
|
Dec 27 2010, 13:58
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Сергей Борщ @ Dec 27 2010, 11:01)  Что-то вас всех куда-то понесло в дебри Код #define PROFILE ((sub_profile ***)(0x0801F000)) unsigned int temp; temp = PROFILE[1][0]->type; Почти так, но не совсем. Последняя размерность - это массив, а не указатель. Должно быть как то так: Код #define PROFILE ((sub_profile **[])(0x0801F000)) unsigned int temp; temp = PROFILE[1][0]->type; Если компилятор не прожует, то так: Код typedef sub_profile **ProfileType[]; #define PROFILE ((ProfileType)(0x0801F000)) unsigned int temp; temp = PROFILE[1][0]->type;
|
|
|
|
|
Dec 27 2010, 18:58
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (XVR @ Dec 27 2010, 18:58)  Почти так, но не совсем. Последняя размерность - это массив, а не указатель. Должно быть как то так: В Си массивы и указатели почти эквивалентные понятия. Используется одна и та же адресная арифметика CODE int a[5]; int *b = a;
*(a + 3) = 5; b[3] = 5; 3[a] = 5;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|