AHTOXA 15 29 августа, 2009 Опубликовано 29 августа, 2009 · Жалоба warning: initialization discards qualifiers from pointer target type Вы прямо мой пример компилировали? На какую строчку ругается? То бишь без всяких const, т.к. момент с "константностью" уже определен в typedef. Не знаю точно почему, но ваш компилятор на лишние const не ругается, а вот Visual Studio выкидывает варнинг. Да и вообще считаю, что "добавлять лишние const для выразительности" - это попахивает нечистью какой-то :) . Да, наверное вы правы, в этом случае все const из объявлений переменных можно повыкидывать:) То есть, получается так: typedef struct { void (*FunctionPointer) (char Param); int (*OtherFuncPointer) (int SomeParam); }WInterface; typedef WInterface const PWInterface; typedef PWInterface* const pPWInterface; typedef pPWInterface* const ppPWInterface; PWInterface PWMonitor0 = {0, 0}; PWInterface PWMonitor2 = {0, 0}; pPWInterface PWMonMode1Arr1[] = {&PWMonitor0, &PWMonitor2}; pPWInterface PWMonMode1Arr2[] = {&PWMonitor0, &PWMonitor2, &PWMonitor0}; pPWInterface PWMonMode1Arr3[] = {&PWMonitor2, &PWMonitor0}; ppPWInterface final_array[] ={ PWMonMode1Arr1, PWMonMode1Arr2, PWMonMode1Arr3}; Проверил на gcc под винду и под АРМ, всё чётко попадает в .text. Проверьте на VS, если не трудно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Student Pupkin 0 29 августа, 2009 Опубликовано 29 августа, 2009 · Жалоба Со вторым уровнем всё проще. Имя массива является указателем на первый его элемент, потому не надо писать & в const ppPWInterface const Pathways[] = {&PWMonMode1Arr, &PWMonMode2Arr, &PWMonMode3Arr}; const ppPWInterface final_array[] ={ PWMonMode1Arr1, PWMonMode1Arr2, PWMonMode1Arr3}; warning: initialization discards qualifiers from pointer target type Кстати да :). Правильно писать ppPWInterface final_array[] ={ PWMonMode1Arr1, PWMonMode1Arr2, PWMonMode1Arr3}; или так ppPWInterface final_array[] ={ &PWMonMode1Arr1[0], &PWMonMode1Arr2[0], &PWMonMode1Arr3[0]}; Тоже самое касается и указателей на функцию. При инициализации структуры PWInterface надо писать просто имена функций, которые сами по себе являются указателями. PWInterface PWMonitor1 = {func1, func2,...} Хотя здесь, насколько я знаю, стандарт допускает и запись вида {&func1, &func2, ...} Проверьте на VS, если не трудно. Никакого мошенства. Я это сначала предварительно в VS проверил, прежде чем здесь писать. :smile3046: Правда объявлял не массивы, а переменные, но сути это не меняет. Главное варнингов нет :) . typedef const struct { void (*func1)(int); void (*func2)(int); } PWInterface; typedef PWInterface *const pPWInterface; typedef pPWInterface *const ppPWInterface; PWInterface PWMonitor1 = {func1, func2}; PWInterface PWMonitor2 = {func2, func1}; pPWInterface PWMonitorPtr1[] = {&PWMonitor1, &PWMonitor2}; ppPWInterface ptrPWMonitorPtr1 = PWMonitorPtr1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 29 августа, 2009 Опубликовано 29 августа, 2009 · Жалоба Никакого мошенства. Я это сначала предварительно в VS проверил, прежде чем здесь писать. :smile3046: Я имел в виду - проверить мой, исправленный вариант:) Хотя теперь наши варианты практически совпадают:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Student Pupkin 0 29 августа, 2009 Опубликовано 29 августа, 2009 · Жалоба Я имел в виду - проверить мой, исправленный вариант:) Хотя теперь наши варианты практически совпадают:) Проверил - все OK. То что доктор прописал :) . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cf7k 0 30 августа, 2009 Опубликовано 30 августа, 2009 · Жалоба Проверил - все OK. То что доктор прописал :) . Супер. Действительно медицина способна на многое :) Для себя взял на заметку возможность создания константного типа, хотя все же остановился на неконстанстном типе структуры и отдельном описании константной структуры. Позволю себе подвести резюме... так сказать решение для тех, кто потом будет искать: //по моим (стереотипам) убеждениям - тип - это некий "трафарет" для выделения блока памяти и он не должен зависеть от того, в какой памяти память выделяется. typedef struct { void (*FunctionPointer) (char Param); int (*OtherFuncPointer) (int SomeParam); }PWInterface; //я все же вернулся к имени PWInterfae от предложенного WInterface (оно у меня от PathWayInterface) typedef PWInterface const cPWInterface; //"трафарет" для выделения памяти под структуру в ПЗУ typedef cPWInterface *const pcPWInterface; typedef pcPWInterface *const ppcPWInterface; //выделение памяти в ПЗУ cPWInterface PWMonitor0 = { SomeFunc1, //допустимо через &SomeFunc1 SomeFunc2 }; //массивы указателей на структуры с адресами функций ("уровень 1") в ПЗУ pcPWInterface PWStartArr[] = {&PWMonitor0, &PWMonitor1, &PWMonitor2, &PWMonitor3}; //адрес структуры - с "&" pcPWInterface PWMonitorArr[] = {&PWMonitor4, &PWMonitor5}; pcPWInterface PWStopArr[] = {&PWMonitor6, &PWMonitor7, &PWMonitor8}; //массив указателей на массивы с указателями на структуры с адресами функций ("уровень 2") в ПЗУ ppcPWInterface Pathways[] = {PWStartArr, PWMonitorArr, PWStopArr}; //пример обращения к методу интерфейса result = Pathways[SomeMode][SomePWID]->OtherFuncPointer(SomeParamValue); под C30 все работает. Спасибо Student Pupkin и AHTOXA за оказанную помощь в разрешении проблемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться