sigmaN 0 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба Топикстартер, а нам вообще точно нужен указатель на указатель? Предлагаю избавиться от этого изврата ещё в самом начале может быть пусть #define PROFILE будет void * а потом, где надо его можно будет преобразовать во что надо.. И вообще мне интересо, почему Ваш этот ИАР не хавает предложенный мною вариант... вроде там всё по Сишному правильно....какого он, извиняюсь, икса.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба И вообще мне интересо, почему Ваш этот ИАР не хавает предложенный мною вариант... вроде там всё по Сишному правильно....какого он, извиняюсь, икса....Дык там скобочек не хватает. Вот так не ругается temp = ((sub_profile *)(*PROFILE))[0].type; //temp == 330 правда и не работает как хотелось бы ТС :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба я то проверял и у меня реально работало же. могу хоть щас полный проект выложить(правда под авр). Но в эмуляторе всё проверил - работает как надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба я то проверял и у меня реально работало же. могу хоть щас полный проект выложить(правда под авр). Но в эмуляторе всё проверил - работает как надо.Если вас IAR не впечатляет, но быть может убедит авторитет Keil? Так вот Keil выдает такую же ошибку на вашу строку, что и IAR. В то время как мои 4-х и 1-но строчные варианты компилируются и работают без ошибок и там и там. Проверял в IAR EWARM 5.50.5 и Keil 4.12. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба тогда наверное дело в размере указателя.... щас найду кеил.. точно был Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LEVENVORF 0 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба компилируется и работает. Ну вот так точно уж должно работать #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; ОГРОМНОЕ СПАСИБО!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 26 декабря, 2010 Опубликовано 26 декабря, 2010 · Жалоба скобок действительно не хватало и похоже, что на любом компиляторе, кроме AVR GCC мой код не компилился. Но я сделал вот так temp = ((sub_profile *)(*PROFILE))[0].type; //temp == 330 temp = ((sub_profile *)(*PROFILE))[1].type; //temp == 100 и дело пошло. Даже в микрософтовской визуал студии всё работает правильно. added кажется надо больше спать. ТС говорил о том, что массив содержит массив указателей на профили, да... понял. молчу. )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 27 декабря, 2010 Опубликовано 27 декабря, 2010 · Жалоба Но я сделал вот так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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LEVENVORF 0 27 декабря, 2010 Опубликовано 27 декабря, 2010 · Жалоба Что-то вас всех куда-то понесло в дебри #define PROFILE ((sub_profile ***)(0x0801F000)) unsigned int temp; temp = PROFILE[1][0]->type; Спасибо. Очень красивый вариант. Почти точно такой предложили сотрудники на работе. Еще раз спасибо!!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 27 декабря, 2010 Опубликовано 27 декабря, 2010 · Жалоба temp = PROFILE[1][0]->type; даа, а ведь и правда так и должно было быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 27 декабря, 2010 Опубликовано 27 декабря, 2010 · Жалоба Почти точно такой предложили сотрудники на работе.Так он у вас и был изначально. Вы просто в #define забыли добавить еще один указатель, ведь ваш переопределенный PROFILE есть указатель на массив указателей на массивы указателей на субпрофили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 27 декабря, 2010 Опубликовано 27 декабря, 2010 · Жалоба Есть очень хорошее правило, прочитанное мной где-то давным-давно: "По возможности не использовать более 2 степеней вложенности указателей". Максимум - это указатель на указатель. И жизнь будет намного проще:-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 27 декабря, 2010 Опубликовано 27 декабря, 2010 · Жалоба Что-то вас всех куда-то понесло в дебри #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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 27 декабря, 2010 Опубликовано 27 декабря, 2010 · Жалоба Есть очень хорошее правило, прочитанное мной где-то давным-давно: "По возможности не использовать более 2 степеней вложенности указателей". Ну мне эта конструкция тоже сразу не очень понравилась... но раз уж там все эти профайлы так закручены by design - то не известно что проще...переделывать дизайн или такой вот "костыль"(конечно с натяжкой) вставить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 27 декабря, 2010 Опубликовано 27 декабря, 2010 · Жалоба Почти так, но не совсем. Последняя размерность - это массив, а не указатель. Должно быть как то так:В Си массивы и указатели почти эквивалентные понятия. Используется одна и та же адресная арифметикаint a[5]; int *b = a; *(a + 3) = 5; b[3] = 5; 3[a] = 5; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться