реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Обращение к элементу двухмерного массива используя адрес массива
sigmaN
сообщение Dec 26 2010, 18:36
Сообщение #16


I WANT TO BELIEVE
******

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



Топикстартер, а нам вообще точно нужен указатель на указатель?
Предлагаю избавиться от этого изврата ещё в самом начале
может быть пусть #define PROFILE будет void * а потом, где надо его можно будет преобразовать во что надо..

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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 26 2010, 18:52
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

правда и не работает как хотелось бы ТС rolleyes.gif
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 26 2010, 19:36
Сообщение #18


I WANT TO BELIEVE
******

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



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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 26 2010, 19:59
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(sigmaN @ Dec 27 2010, 03:36) *
я то проверял и у меня реально работало же. могу хоть щас полный проект выложить(правда под авр). Но в эмуляторе всё проверил - работает как надо.
Если вас IAR не впечатляет, но быть может убедит авторитет Keil? Так вот Keil выдает такую же ошибку на вашу строку, что и IAR. В то время как мои 4-х и 1-но строчные варианты компилируются и работают без ошибок и там и там. Проверял в IAR EWARM 5.50.5 и Keil 4.12.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 26 2010, 20:25
Сообщение #20


I WANT TO BELIEVE
******

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



тогда наверное дело в размере указателя.... щас найду кеил.. точно был


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
LEVENVORF
сообщение Dec 26 2010, 20:58
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 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) *
Вот так тоже работает, но лично меня сложность такой конструкции несколько угнетает sm.gif
Код
temp = ((sub_profile *)(*(sub_profile **)PROFILE[1]))[1].type;


ОГРОМНОЕ СПАСИБО!!!
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 26 2010, 21:18
Сообщение #22


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...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 27 2010, 05:01
Сообщение #23


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
LEVENVORF
сообщение Dec 27 2010, 07:39
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 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;

Спасибо. Очень красивый вариант. Почти точно такой предложили сотрудники на работе.
Еще раз спасибо!!!!
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 27 2010, 07:44
Сообщение #25


I WANT TO BELIEVE
******

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



temp = PROFILE[1][0]->type;
даа, а ведь и правда так и должно было быть.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 27 2010, 07:55
Сообщение #26


Гуру
******

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



QUOTE (LEVENVORF @ Dec 27 2010, 12:39) *
Почти точно такой предложили сотрудники на работе.
Так он у вас и был изначально. Вы просто в #define забыли добавить еще один указатель, ведь ваш переопределенный PROFILE есть указатель на массив указателей на массивы указателей на субпрофили.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 27 2010, 10:52
Сообщение #27


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Есть очень хорошее правило, прочитанное мной где-то давным-давно:
"По возможности не использовать более 2 степеней вложенности указателей".
Максимум - это указатель на указатель.
И жизнь будет намного проще:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 27 2010, 13:58
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 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;

Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 27 2010, 15:48
Сообщение #29


I WANT TO BELIEVE
******

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



Цитата
Есть очень хорошее правило, прочитанное мной где-то давным-давно:
"По возможности не использовать более 2 степеней вложенности указателей".
Ну мне эта конструкция тоже сразу не очень понравилась... но раз уж там все эти профайлы так закручены by design - то не известно что проще...переделывать дизайн или такой вот "костыль"(конечно с натяжкой) вставить.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 27 2010, 18:58
Сообщение #30


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 19:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.0156 секунд с 7
ELECTRONIX ©2004-2016