|
|
  |
Обращение к элементу двухмерного массива используя адрес массива |
|
|
|
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
|
|
|