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

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, если не трудно.

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


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

Со вторым уровнем всё проще. Имя массива является указателем на первый его элемент, потому не надо писать & в
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;

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


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

Никакого мошенства. Я это сначала предварительно в VS проверил, прежде чем здесь писать. :smile3046:

 

Я имел в виду - проверить мой, исправленный вариант:)

 

Хотя теперь наши варианты практически совпадают:)

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


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

Я имел в виду - проверить мой, исправленный вариант:)

 

Хотя теперь наши варианты практически совпадают:)

Проверил - все OK. То что доктор прописал :) .

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


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

Проверил - все 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 за оказанную помощь в разрешении проблемы.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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