
Итак... вводная: пользую PIC24H, пишу на Си (без плюсов), компилятор - С30, уже скурил весь гугль, учебники по сям...
имею определение интерфейса (структуру указателей на функции):
Код
typedef struct
{
void (*FunctionPointer) (char Param);
int (*OtherFuncPointer) (int SomeParam);
....
} PWInterface, *pPWInterface, **ppPWInterface;
{
void (*FunctionPointer) (char Param);
int (*OtherFuncPointer) (int SomeParam);
....
} PWInterface, *pPWInterface, **ppPWInterface;
Далее имеется несколько модулей, реализующих некое поведение и предоставляющих указанный интерфейс:
Код
заголовочный файл:
extern const PWInterface const PWMonitor0;
extern const PWInterface const PWMonitor0;
Код
сишный файл с реализацией:
static void SomeFunc1 (char Param);
static void SomeFunc2 (int SomeParam);
const PWInterface const PWMonitor0 =
{
&SomeFunc1,
&SomeFunc2,
....
};
ну и далее реализация этих функций.
таких модулей несколько, все предоставляют означенный в начале интерфейс. Т.е. я сознательно выделяю память в памяти программ и пишу дважды const.static void SomeFunc1 (char Param);
static void SomeFunc2 (int SomeParam);
const PWInterface const PWMonitor0 =
{
&SomeFunc1,
&SomeFunc2,
....
};
ну и далее реализация этих функций.
Далее собираю интерфейсы в одну кучу:
Код
#include "PWMonitor0.h"
#include "PWMonitor1.h"
#include "PWMonitor2.h"
....................
const PWInterface *const PWMonMode1Arr[] = {&PWMonitor0, &PWMonitor0_c, &PWMonitor0_r};
const PWInterface *const PWMonMode2Arr[] = {&PWMonitor1, &PWMonitor1_r};
const PWInterface *const PWMonMode3Arr[] = {&PWMonitor2};
Т.е. массивы константных указателей на константные структуры заданного типа.#include "PWMonitor1.h"
#include "PWMonitor2.h"
....................
const PWInterface *const PWMonMode1Arr[] = {&PWMonitor0, &PWMonitor0_c, &PWMonitor0_r};
const PWInterface *const PWMonMode2Arr[] = {&PWMonitor1, &PWMonitor1_r};
const PWInterface *const PWMonMode3Arr[] = {&PWMonitor2};
конструкцию представленную выше компилятор поглощает без проблем, а если же пользую
Код
const pPWInterface const PWMonMode1Arr[] = ...
получаю warning: initialization discards qualifiers from pointer target typeВопрос первый: Что именно я недопонимаю? Хотел как лучше (чтоб через typedef... красившее. Вроде корректно определенный тип указателя при определении структуры)...
Продолжу...
далее имея массивы(константные) (константных)указателей на (константные)интерфейсы, собираю их в свою очередь в массив(тоже константный):
Код
const ppPWInterface const Pathways[] = {&PWMonMode1Arr, &PWMonMode2Arr, &PWMonMode3Arr};
чтоб можно было бы где-то в коде сказать нечто подобное:
result = Pathways[PowerMode][ID]->OtherFuncPointer(somecode);
Вот тут(при определении массива, а не на вызове метода интерфейса) уже имею трижды warning: initialization from incompatible pointer typeчтоб можно было бы где-то в коде сказать нечто подобное:
result = Pathways[PowerMode][ID]->OtherFuncPointer(somecode);
Пробовал разные вариации... но, видимо, не все...
Вопрос второй: как сделать правильно?
Компилятор, в общем-то, понимает что я от него хочу. Память распределяет правильно, инициализирует правильно, все компилируется... но этот варнинг... я ж из-за него невыспался.

Уфффф... спасибо за терпение дочитавшим сий опус
