|
|
  |
модификатор const. Как правильно использовать в Си |
|
|
|
Jan 30 2018, 05:16
|

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

|
Цитата(DASM @ Jan 29 2018, 18:04)  +++! А какой у них при этом умный вид! Как правило это всякие КТН, с напускным видом умудренного опытом жирного кота. Если посмотреть потом их код - как правило это академическая муть с неочевидной перегрузкой операторов, неуклюжей попыткой засунуть ООП там, где оно вообще не надо итп. Реально полезного - ноль, собственно поэтому и ищут людей )) Стоит заметить, что ваши личные комплексы не являются темой данного обсуждения. Если у вас есть какие-то жизненные упущения, как то неполученный статус КТН, например, можете завести отдельную тему, где поплачитесь, а мы вас подбодрим добрым словом.
|
|
|
|
|
Jan 30 2018, 06:04
|
Гуру
     
Группа: Свой
Сообщений: 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; }
|
|
|
|
|
Jan 30 2018, 06:37
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 30 2018, 09:08
|

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

|
Цитата(Arlleex @ Jan 30 2018, 13:37)  Вы не правы. char (*(*func(void))[3])(void); да, не указатель (проглядел скобки справа), но это и не функция.  Строго говоря, func - есть имя функции, которое семантически является её адресом, т.е. технически это указатель. Всё выражение да, не указатель, но, строго, и не функция.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 30 2018, 09:11
|

Местный
  
Группа: Свой
Сообщений: 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; }
|
|
|
|
|
Jan 30 2018, 10:38
|

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

|
Цитата(dxp @ Jan 30 2018, 12:08)  char (*(*func(void))[3])(void); да, не указатель (проглядел скобки справа), но это и не функция.  Строго говоря, func - есть имя функции, которое семантически является её адресом, т.е. технически это указатель. Всё выражение да, не указатель, но, строго, и не функция. Технически любое имя функции - это есть указатель. Даже Код void f1(void); Согласно Вашей логике, f1 - не функция? Стандартописатели из комитета ANSI C ошиблись с терминологией? Все выражение, все-таки - функция... Вернее, ее прототип. Код 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-ами (иначе Вас потом будут проклинать  ).
|
|
|
|
|
Jan 30 2018, 12:45
|

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

|
Цитата(ViKo @ Jan 30 2018, 16:28)  char (*(*func(void))[3])(void); 1 : 1 копия примера из K&R, на трезвую голову такого не придумать. K&R прочел совсем немного, к сожалению, и не знал, что у них вообще затрагивается эта тема Пример действительно из головы. Ведь можно и еще больше усложнить... P.S. Посмотрел в K&R - действительно, есть такой пример
|
|
|
|
|
Feb 2 2018, 16:28
|
Участник

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

|
Если вам так нравится разбирать сложные декларации, cdecl существует уже лет как 20, даже веб интерфейс есть https://cdecl.org
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|