|
Обращение к элементу двухмерного массива используя адрес массива |
|
|
|
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
|
|
|
|
|
 |
Ответов
|
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, 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)
|
|
|
|
|
Dec 28 2010, 14:43
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Сергей Борщ @ Dec 28 2010, 20:56)  Найдите мне теперь любое действие, которое я могу выполнить с ptr и не могу выполнить с array. Или наоборот. Если бы имя массива было эквивалентно адресу на его первый элемент, то компилятор не ругался бы на это Код u08 massiv[100]; u08 *ptr = massiv; однако компилятор ругается и требует так Код u08 massiv[100]; u08 *ptr = &massiv[0]; ======== upd Проверил, ИАР не ругается.
Сообщение отредактировал GetSmart - Dec 28 2010, 15:19
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
Сообщений в этой теме
LEVENVORF Обращение к элементу двухмерного массива используя адрес массива Dec 24 2010, 14:13 rezident Цитата(LEVENVORF @ Dec 24 2010, 22:13) IA... Dec 25 2010, 17:53 LEVENVORF int для stm32f 4-х байтный.
Так как же мне все-т... Dec 25 2010, 18:33 rezident Цитата(LEVENVORF @ Dec 26 2010, 02:33) Та... Dec 25 2010, 19:05 LEVENVORF Попробовал вот так:
Код#define PROFILE (... Dec 25 2010, 19:51 rezident На какую именно строку ругается? Dec 25 2010, 20:35 LEVENVORF Цитата(rezident @ Dec 26 2010, 01:35) На ... Dec 25 2010, 20:37 sigmaN ну так чтобы из указателя на указатель получить у... Dec 25 2010, 20:35 rezident А если так?
Кодtemp2 = temp[0].type;
temp[... Dec 25 2010, 21:06 LEVENVORF Цитата(rezident @ Dec 26 2010, 02:06) А е... Dec 25 2010, 21:30 sigmaN Разыменовывать, разыменовывать же)
вот это даже пр... Dec 26 2010, 01:11 LEVENVORF не компилируется. ругается на строку:
Цитата(sigma... Dec 26 2010, 16:05 rezident Ну вот так точно уж должно работать
Код#define PRO... Dec 26 2010, 17:38 sigmaN Цитатане компилируется. ругается на строку:компиля... Dec 26 2010, 17:54 rezident Вот так тоже работает, но лично меня сложность так... Dec 26 2010, 18:17 sigmaN Топикстартер, а нам вообще точно нужен указатель н... Dec 26 2010, 18:36 rezident Цитата(sigmaN @ Dec 27 2010, 02:36) И воо... Dec 26 2010, 18:52 sigmaN я то проверял и у меня реально работало же. могу ... Dec 26 2010, 19:36 rezident Цитата(sigmaN @ Dec 27 2010, 03:36) я то ... Dec 26 2010, 19:59 sigmaN тогда наверное дело в размере указателя.... щас на... Dec 26 2010, 20:25 LEVENVORF компилируется и работает.
Цитата(rezident @ D... Dec 26 2010, 20:58    ViKo Цитата(Сергей Борщ @ Dec 27 2010, 23:58) ... Dec 28 2010, 07:26     Сергей Борщ QUOTE (ViKo @ Dec 28 2010, 12:26) Только ... Dec 28 2010, 08:00      ViKo Цитата(Сергей Борщ @ Dec 28 2010, 13:00) ... Dec 28 2010, 08:47      rezident Цитата(Сергей Борщ @ Dec 28 2010, 20:56) ... Dec 28 2010, 13:10 LEVENVORF Цитата(Сергей Борщ @ Dec 27 2010, 10:01) ... Dec 27 2010, 07:39 Сергей Борщ QUOTE (LEVENVORF @ Dec 27 2010, 12:39) По... Dec 27 2010, 07:55  demiurg_spb Есть очень хорошее правило, прочитанное мной где-т... Dec 27 2010, 10:52 sigmaN temp = PROFILE[1][0]->type;
даа, а ведь и правд... Dec 27 2010, 07:44 sigmaN ЦитатаЕсть очень хорошее правило, прочитанное мной... Dec 27 2010, 15:48 GetSmart В книжках так же пишут, что детей находят в капуст... Dec 28 2010, 15:21 ViKo Цитата(GetSmart @ Dec 28 2010, 20:21) В к... Dec 28 2010, 16:26 XVR По поводу массив/указатель уже где то тут выясняли... Dec 28 2010, 16:51 Сергей Борщ QUOTE (rezident @ Dec 28 2010, 18:10) Раз... Dec 28 2010, 17:14 XVR Если подходить строго, то с массивом в С определен... Dec 28 2010, 17:23 Сергей Борщ QUOTE (XVR @ Dec 28 2010, 22:22) ВСЕ ОСТА... Dec 28 2010, 17:25 ViKo Решил сравнить адресную и индексную арифметику на ... Dec 28 2010, 17:55 XVR Цитата(ViKo @ Dec 28 2010, 23:55) Решил с... Dec 28 2010, 18:06  ViKo Цитата(XVR @ Dec 28 2010, 23:06) Включите... Dec 28 2010, 18:30 Сергей Борщ QUOTE (ViKo @ Dec 28 2010, 22:55) В любом... Dec 28 2010, 18:49  ViKo Цитата(Сергей Борщ @ Dec 28 2010, 23:49) ... Dec 28 2010, 18:58   singlskv Цитата(ViKo @ Dec 29 2010, 00:58) Похоже,... Dec 28 2010, 19:40   Сергей Борщ QUOTE (ViKo @ Dec 28 2010, 23:58) Это нич... Dec 29 2010, 05:26    XVR Цитата(Сергей Борщ @ Dec 29 2010, 11:26) ... Dec 29 2010, 05:50    ViKo Цитата(Сергей Борщ @ Dec 29 2010, 10:26) ... Dec 29 2010, 06:59     XVR Цитата(ViKo @ Dec 29 2010, 12:59) Должна ... Dec 29 2010, 16:54      ViKo Цитата(XVR @ Dec 29 2010, 21:54) Не должн... Dec 30 2010, 07:21       demiurg_spb В тему указатели-массивы (накидал примерчик за 5 м... Dec 30 2010, 08:09 GetSmart Цитата(ViKo @ Dec 29 2010, 01:55) Результ... Dec 28 2010, 19:03  ViKo Цитата(GetSmart @ Dec 29 2010, 00:03) Не ... Dec 28 2010, 19:11 sigmaN ага, только эти a b c тоже как-бээ массивы указате... Dec 30 2010, 07:58 ViKo Цитата(sigmaN @ Dec 30 2010, 12:58) ага, ... Dec 30 2010, 13:31 GetSmart 36? Dec 30 2010, 12:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|