Перейти к содержанию
    

Обращение к элементу двухмерного массива используя адрес массива

Топикстартер, а нам вообще точно нужен указатель на указатель?

Предлагаю избавиться от этого изврата ещё в самом начале

может быть пусть #define PROFILE будет void * а потом, где надо его можно будет преобразовать во что надо..

 

И вообще мне интересо, почему Ваш этот ИАР не хавает предложенный мною вариант... вроде там всё по Сишному правильно....какого он, извиняюсь, икса....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И вообще мне интересо, почему Ваш этот ИАР не хавает предложенный мною вариант... вроде там всё по Сишному правильно....какого он, извиняюсь, икса....
Дык там скобочек не хватает. Вот так не ругается

temp = ((sub_profile *)(*PROFILE))[0].type; //temp == 330

правда и не работает как хотелось бы ТС :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я то проверял и у меня реально работало же. могу хоть щас полный проект выложить(правда под авр). Но в эмуляторе всё проверил - работает как надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я то проверял и у меня реально работало же. могу хоть щас полный проект выложить(правда под авр). Но в эмуляторе всё проверил - работает как надо.
Если вас IAR не впечатляет, но быть может убедит авторитет Keil? Так вот Keil выдает такую же ошибку на вашу строку, что и IAR. В то время как мои 4-х и 1-но строчные варианты компилируются и работают без ошибок и там и там. Проверял в IAR EWARM 5.50.5 и Keil 4.12.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

компилируется и работает.

Ну вот так точно уж должно работать

#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; //извлекаем элемент структуры

Тут все по-отдельности, но типизация соответствует.

 

компилируется и тоже работает.

Вот так тоже работает, но лично меня сложность такой конструкции несколько угнетает :)

temp = ((sub_profile *)(*(sub_profile **)PROFILE[1]))[1].type;

 

ОГРОМНОЕ СПАСИБО!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

скобок действительно не хватало и похоже, что на любом компиляторе, кроме AVR GCC мой код не компилился.

Но я сделал вот так

temp = ((sub_profile *)(*PROFILE))[0].type; //temp == 330
temp = ((sub_profile *)(*PROFILE))[1].type; //temp == 100

и дело пошло. Даже в микрософтовской визуал студии всё работает правильно.

 

added кажется надо больше спать. ТС говорил о том, что массив содержит массив указателей на профили, да... понял. молчу. ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но я сделал вот так
temp = ((sub_profile *)(*PROFILE))[0].type; //temp == 330
temp = ((sub_profile *)(*PROFILE))[1].type; //temp == 100

и дело пошло. Даже в микрософтовской визуал студии всё работает правильно.

Что-то вас всех куда-то понесло в дебри
    #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;

Спасибо. Очень красивый вариант. Почти точно такой предложили сотрудники на работе.

Еще раз спасибо!!!!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почти точно такой предложили сотрудники на работе.
Так он у вас и был изначально. Вы просто в #define забыли добавить еще один указатель, ведь ваш переопределенный PROFILE есть указатель на массив указателей на массивы указателей на субпрофили.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть очень хорошее правило, прочитанное мной где-то давным-давно:

"По возможности не использовать более 2 степеней вложенности указателей".

Максимум - это указатель на указатель.

И жизнь будет намного проще:-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то вас всех куда-то понесло в дебри
    #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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть очень хорошее правило, прочитанное мной где-то давным-давно:

"По возможности не использовать более 2 степеней вложенности указателей".

Ну мне эта конструкция тоже сразу не очень понравилась... но раз уж там все эти профайлы так закручены by design - то не известно что проще...переделывать дизайн или такой вот "костыль"(конечно с натяжкой) вставить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почти так, но не совсем. Последняя размерность - это массив, а не указатель. Должно быть как то так:
В Си массивы и указатели почти эквивалентные понятия. Используется одна и та же адресная арифметика
int a[5];
int *b = a;

*(a + 3) = 5;
b[3] = 5;
3[a] = 5;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...