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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> куча const..., элементарный вопрос по Си
AHTOXA
сообщение Aug 29 2009, 21:36
Сообщение #16


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(cf7k @ Aug 30 2009, 03:15) *
warning: initialization discards qualifiers from pointer target type


Вы прямо мой пример компилировали? На какую строчку ругается?

Цитата(Student Pupkin @ Aug 30 2009, 03:13) *
То бишь без всяких const, т.к. момент с "константностью" уже определен в typedef.
Не знаю точно почему, но ваш компилятор на лишние const не ругается, а вот Visual Studio выкидывает варнинг. Да и вообще считаю, что "добавлять лишние const для выразительности" - это попахивает нечистью какой-то smile.gif .


Да, наверное вы правы, в этом случае все const из объявлений переменных можно повыкидыватьsmile.gif

То есть, получается так:
Код
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, если не трудно.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Student Pupkin
сообщение Aug 29 2009, 21:43
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760



Цитата(cf7k @ Aug 30 2009, 01:15) *
Код
Со вторым уровнем всё проще. Имя массива является указателем на первый его элемент, потому не надо писать & в
const ppPWInterface const Pathways[] = {&PWMonMode1Arr, &PWMonMode2Arr, &PWMonMode3Arr};

const ppPWInterface final_array[] ={ PWMonMode1Arr1, PWMonMode1Arr2, PWMonMode1Arr3};

warning: initialization discards qualifiers from pointer target type

Кстати да smile.gif. Правильно писать
Код

ppPWInterface final_array[] ={ PWMonMode1Arr1, PWMonMode1Arr2, PWMonMode1Arr3};
или так
ppPWInterface final_array[] ={ &PWMonMode1Arr1[0], &PWMonMode1Arr2[0], &PWMonMode1Arr3[0]};

Тоже самое касается и указателей на функцию. При инициализации структуры PWInterface надо писать просто имена функций, которые сами по себе являются указателями.
Код

PWInterface PWMonitor1 = {func1, func2,...}

Хотя здесь, насколько я знаю, стандарт допускает и запись вида {&func1, &func2, ...}

Цитата(AHTOXA @ Aug 30 2009, 01:36) *
Проверьте на VS, если не трудно.

Никакого мошенства. Я это сначала предварительно в VS проверил, прежде чем здесь писать. smile3046.gif
Правда объявлял не массивы, а переменные, но сути это не меняет. Главное варнингов нет smile.gif .
CODE

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;
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 29 2009, 21:54
Сообщение #18


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Student Pupkin @ Aug 30 2009, 03:43) *
Никакого мошенства. Я это сначала предварительно в VS проверил, прежде чем здесь писать. smile3046.gif


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

Хотя теперь наши варианты практически совпадаютsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Student Pupkin
сообщение Aug 29 2009, 22:01
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760



Цитата(AHTOXA @ Aug 30 2009, 01:54) *
Я имел в виду - проверить мой, исправленный вариантsmile.gif

Хотя теперь наши варианты практически совпадаютsmile.gif

Проверил - все OK. То что доктор прописал smile.gif .
Go to the top of the page
 
+Quote Post
cf7k
сообщение Aug 30 2009, 17:46
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 14-03-06
Из: Санкт-Петербург
Пользователь №: 15 227



Цитата(Student Pupkin @ Aug 30 2009, 02:01) *
Проверил - все OK. То что доктор прописал smile.gif .

Супер. Действительно медицина способна на многое smile.gif

Для себя взял на заметку возможность создания константного типа, хотя все же остановился на неконстанстном типе структуры и отдельном описании константной структуры.
Позволю себе подвести резюме... так сказать решение для тех, кто потом будет искать:
Код
//по моим (стереотипам) убеждениям - тип - это некий "трафарет" для выделения блока памяти и он не должен зависеть от того, в какой памяти память выделяется.
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 за оказанную помощь в разрешении проблемы.
Go to the top of the page
 
+Quote Post

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

 


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


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