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

 
 
8 страниц V  « < 5 6 7 8 >  
Reply to this topicStart new topic
> модификатор const. Как правильно использовать в Си
ViKo
сообщение Jan 30 2018, 05:07
Сообщение #91


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Мудреные конструкции наподобие вышеприведенных разбираются в учебнике K&R "Язык C", там и метод описан. В жизни мне использовать нет необходимости.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 30 2018, 05:14
Сообщение #92


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Arlleex @ Jan 30 2018, 04:14) *
P.S. func - это функция, не принимающая аргументов и возвращающая указатель на массив указателей на функции, которые возвращают char и не принимают параметров.

func - не функция, а указатель на функцию.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Quasar
сообщение Jan 30 2018, 05:16
Сообщение #93


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(DASM @ Jan 29 2018, 18:04) *
+++! А какой у них при этом умный вид! Как правило это всякие КТН, с напускным видом умудренного опытом жирного кота. Если посмотреть потом их код - как правило это академическая муть с неочевидной перегрузкой операторов, неуклюжей попыткой засунуть ООП там, где оно вообще не надо итп. Реально полезного - ноль, собственно поэтому и ищут людей ))


Стоит заметить, что ваши личные комплексы не являются темой данного обсуждения. Если у вас есть какие-то жизненные упущения, как то неполученный статус КТН, например, можете завести отдельную тему, где поплачитесь, а мы вас подбодрим добрым словом.

biggrin.gif
Go to the top of the page
 
+Quote Post
DASM
сообщение Jan 30 2018, 06:04
Сообщение #94


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



"поплачИтесь" ,- непременно

Цитата(dxp @ Jan 30 2018, 08:14) *
func - не функция, а указатель на функцию.

Совсем ничего не соображаю, а почему такая запись возможно тогда?
CODE
char(*(*func(void))[3])(void)
{
char(*(*f)[3]) (void) = NULL;
return f;
}
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jan 30 2018, 06:37
Сообщение #95


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(dxp @ Jan 30 2018, 08:14) *
func - не функция, а указатель на функцию.

Вы не правы.

Цитата
Совсем ничего не соображаю, а почему такая запись возможно тогда?
CODE
char(*(*func(void))[3])(void)
{
char(*(*f)[3]) (void) = NULL;
return f;
}

Потому что func - это то, что я писал выше. А вот f - это указатель на массив указателей на функции. Записи логически и синтаксически корректны.

Сообщение отредактировал Arlleex - Jan 30 2018, 07:55
Go to the top of the page
 
+Quote Post
Quasar
сообщение Jan 30 2018, 07:49
Сообщение #96


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(DASM @ Jan 30 2018, 09:04) *
"поплачИтесь" ,- непременно


Ваше замечание притянуто за уши. Поскольку Я применяю это слово редко (или не применяю вовсе), могу делать в нем столько ошибок, сколько захочу. Я же не яйцеголовый КТН в самом деле! И если меня кто-то на собеседовании поправит, обязательно настучу по голове, как было предложено выше.
Go to the top of the page
 
+Quote Post
DASM
сообщение Jan 30 2018, 08:00
Сообщение #97


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Arlleex @ Jan 30 2018, 09:37) *
логически и синтаксически корректны.

жаль что совершенно нечитаемы (мне). Всегда удивляют (приятно) люди (на Хабре например) которые это щелкают как орехи. Не понимаю, как при обычном программировании можно получить опыт чтения такого.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 30 2018, 09:08
Сообщение #98


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Arlleex @ Jan 30 2018, 13:37) *
Вы не правы.

char (*(*func(void))[3])(void);

да, не указатель (проглядел скобки справа), но это и не функция. sm.gif Строго говоря, func - есть имя функции, которое семантически является её адресом, т.е. технически это указатель. Всё выражение да, не указатель, но, строго, и не функция.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Quasar
сообщение Jan 30 2018, 09:11
Сообщение #99


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(Arlleex @ Jan 30 2018, 00:14) *
P.S. func - это функция, не принимающая аргументов и возвращающая указатель на массив указателей на функции, которые возвращают char и не принимают параметров.


Припомнил у себя в проекте такой же код, правда только после того, как вы на русском дали разъяснение по своему примеру. Там все было сделано через typedef и по сути даже более сложная структура была.

Мое мнение, подобная бадяга (указатель, на указатель на функцию возвращающую массив указателей тра-ля-ля...) может применятся очень часто, вопрос только в том, как оно оформлено.

Код
typedef int32_t /*successful = 0*/ ( *callback_func_t ) ( uint32_t /*protocol status*/ );

typedef callback_func_t callback_tbl_t[LAST_CALLBACK_ID];

typedef struct {
    uint32_t id;
    callback_tbl_t cl_tbl;  
} proto_impl_t;

static proto_impl_t impl[MAX_NOF_IMPLS] = { 0 };

callback_tbl_t *impl_get_callbacks ( uint32_t impl_id ) {

    for ( uint32_t i = 0; i < MAX_NOF_IMPLS; i++ ) {
        if ( impl[i].id == impl_id ) {
            return &impl[i].cl_tbl;
        }
    }

    int32_t ( *(*f)[32] ) (uint32_t) = NULL;    /* Это я уже сейчас добавил, проверить ругнется ли компилятор. Не ругается. */

    return f;
}
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jan 30 2018, 10:38
Сообщение #100


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(dxp @ Jan 30 2018, 12:08) *
char (*(*func(void))[3])(void);

да, не указатель (проглядел скобки справа), но это и не функция. sm.gif Строго говоря, func - есть имя функции, которое семантически является её адресом, т.е. технически это указатель. Всё выражение да, не указатель, но, строго, и не функция.

Технически любое имя функции - это есть указатель. Даже
Код
void f1(void);

Согласно Вашей логике, f1 - не функция? Стандартописатели из комитета ANSI C ошиблись с терминологией? rolleyes.gif
Все выражение, все-таки - функция... Вернее, ее прототип.
Код
char (*(*func(void))[3])(void)
{
  ...
}

Технически, синтаксически, логически, семантически (что там еще?) - это именно функция. Я могу ее вызвать, потому что это функция. Я не могу присвоить func ничего, потму что это не указатель, а идентификатор, связанный с выделенным участком кода.

Вот небольшой пример
Код
// ôóíêöèÿ, âîçâðàùàþùàÿ óêàçàòåëü íà ìàññèâ óêàçàòåëåé íà ôóíêöèè, âîçâðàùàþùèå char

#include <stdio.h>

char func1(void) {printf("I am func1\n"); return 1;}
char func2(void) {printf("I am func2\n"); return 2;}
char func3(void) {printf("I am func3\n"); return 3;}

char (*MassFunc[3])(void) = {func1, func2, func3};

char (*(*func(void))[3])(void)
{
    return &MassFunc;
}

int main(void)
{
    int *pFunc = (int *)func();
    
    for(int i = 0; i < 3; ++i)
       (*(char (*)())pFunc[i])(); // в С указатели на функции не индексируются, поэтому используется промежуточный указатель на int
    
    while(1);
}



Важное замечание №1: если все-таки придется использовать какую-то гибкую схему вызовов - лучше, как и было озвучено Quasar, через typedef.
Важное замечание №2: не пишите так никогда (как в примере выше у меня). Это всего лишь пример, но никак не побуждение к действиям. Если и хочется сделать что-то гибко и структурно - лучше тщательно продумать концепцию кода и оформить с typedef-ами (иначе Вас потом будут проклинать biggrin.gif ).
Go to the top of the page
 
+Quote Post
DASM
сообщение Jan 30 2018, 10:41
Сообщение #101


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



"в С указатели на функции не индексируются," - о как, даж не знал
А недавно узнал для чего были ссылки в ++ сделаны - именно потому, что иначе была бы невозможна перегрузка некоторых операторов для объектов без конфликта с семантикой С, она уже задействована под арифметикой указателей. А не всякие там пояснения что мол для безопасности, типа ссылку нельзя неинициализированной и все такое (кстати в гугл используют указатели в явном виде (ну когда на ++ пишут)).
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 30 2018, 12:28
Сообщение #102


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



char (*(*func(void))[3])(void);
1 : 1 копия примера из K&R, на трезвую голову такого не придумать.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jan 30 2018, 12:45
Сообщение #103


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(ViKo @ Jan 30 2018, 16:28) *
char (*(*func(void))[3])(void);
1 : 1 копия примера из K&R, на трезвую голову такого не придумать.

K&R прочел совсем немного, к сожалению, и не знал, что у них вообще затрагивается эта тема laughing.gif
Пример действительно из головы.
Ведь можно и еще больше усложнить...
P.S. Посмотрел в K&R - действительно, есть такой пример biggrin.gif
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 30 2018, 14:12
Сообщение #104


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Я тут подумал... Видимо придется и мне K&R прочесть на всякий случай biggrin.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
alx.bilous
сообщение Feb 2 2018, 16:28
Сообщение #105


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 18-03-12
Пользователь №: 70 865



Если вам так нравится разбирать сложные декларации, cdecl существует уже лет как 20, даже веб интерфейс есть https://cdecl.org
Go to the top of the page
 
+Quote Post

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

 


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


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