Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/50: Рейтинг темы: голосов - 50, средняя оценка - 4.62
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
1

Как правильно определить typedef? Решено

07.04.2014, 23:07. Просмотров 9067. Ответов 29
Метки нет (Все метки)

Кто подскажет как правильно определить следующую строку:

Код
typedef void (*VECTORS)();
Есть следующая конструкция:

*.h:

Код
//========================================================================
typedef void (*VECTORS)();
//========================================================================

//========================================================================
extern u08 _proc_eds_main;
//------------------------------------------------------------------------
typedef enum proc_eds_states
{
#define STATE(name) st_##name,
#include "_proc_eds_main.h"
#undef STATE

PROC_EDS_MAIN_STATES

} proc_eds_states;
//------------------------------------------------------------------------
extern __flash VECTORS_EDS proc_eds_func [PROC_EDS_MAIN_STATES];
//------------------------------------------------------------------------
*.c

Код
//========================================================================
__flash VECTORS_EDS proc_eds_func [PROC_EDS_MAIN_STATES] =
{
#define STATE(name) name,
#include "_proc_eds_main.h"
#undef STATE
};
//------------------------------------------------------------------------
void proc_eds (void)
{
if (_proc_eds_main < PROC_EDS_MAIN_STATES)
{
proc_keys_pu ();
check_keys_buf (keys_pu_buf, _proc_eds_main, tab_homdlers_keys_pu_main);
proc_eds_func [_proc_eds_main] ();
}
//
}
//------------------------------------------------------------------------
void Proc_Eds_Main_Init (void)
{
_proc_eds_main = st_Proc_Eds_Main_Set_Manual;
}
__proc_eds_main.h:

Код
//************************************************************************
//************************ Aeaaiue aaoiiao *******************************
//************************************************************************

//========================================================================
STATE (Proc_Eds_Main_Init)
STATE (Proc_Eds_Main_Set_Manual)
STATE (Proc_Eds_Main_Manual)
STATE (Proc_Eds_Main_Set_Automat)
STATE (Proc_Eds_Main_Automat)
STATE (Proc_Eds_Main_Stop)
//========================================================================
Проблема в том, что VECTORS видна только в пределах одного модуля. Куда бы я ни ставил
Код
typedef void (*VECTORS)();
ошибка компиляции.
Делаю VECTORS_1, VECTORS_2 - все нормально.
Есть способ определить так, чтобы распространялось на все модули?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2014, 23:07
Ответы с готовыми решениями:

Как правильно пользоваться typedef для декларации типа указателя на функцию?
Мне нужны будут функции, принимающие параметр-указатель на функции с одним и тем же списком...

Как правильно удалить строку (Rows.Delete) (Решено)
Самое интересное, что метод Delete объекта Rows удаляет не указанную строку, а только первую её...

Правильно ли все решено и как можно было упростить программу?
Напишите программу, которая в последовательности натуральных чисел находит среднее арифметическое...

[РЕШЕНО] STM. Как определить загрузку процессора?
Собираю проект для STM32F4. Среда Keil. Возник вопрос: Как определить загрузку процессора? Учитывая...

Typedef void F(); typedef для типа функции через идентификатор
Здравствуйте цитата из typedef MSDN в интернете мне удалось нарыть только один конкретный...

29
soxop
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
10.04.2014, 19:49 21
Ваш пример с таблицами, плиз.
Пример чего именно? В каждом случае нужно отдельно подходить, универсальных решений нет, надо просто включать мозги и решать данную конкретную задачу оптимальным образом. Кстати, не исключено, что "оптимальным образом" окажется switch-case. Я как-то в другой теме уже приводил пример (может даже вам) работы с очень простым КА со статическими связями через таблицу. Индексируете состояния числами 0,1,2..., а таблицу переходов храните в массиве. Переход на следущее состояние state = next[state], где next -- этот массив. Если переходов несколько в зависимости от события event, то можно сделать двумерный массив, так что переход к следующему состоянию: state = next[event][state]. Можно вместо двумерного массива взять массив указателей на массивы -- так в редких случаях можно получить выигрыш в размере таблиц. И так далее. Смысл -- заменить вызов функции next(event, state, ...) выборкой из статического массива: next[event][state][...].

Когда вручную уже составлять таблицы сложно, можно набросать, к примеру, human-readable файлик со строками типа "<состояние> <событие> <следующее состояние>", из которого автоматически сгенерить табллицы.

Кстати, С тут ни при чём.

Из примера того человека.
"Тому человеку" нужно запретить пользоваться макросами...
0
ftomdkir
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 97
10.04.2014, 20:30 22
Вы написали про запятую перед скобками в инклюде? Вы. ... Надеюсь сейчас насчет запятой разобрались?
Я знаю во что он разворачивается. И запятая перед закрывающим токеном(}) это по вашему нормально? Я написал что она приводит к ошибке, а не говорил вам её тупо бездумно удалять. Поэтому давайте ответственность за свои ошибки не перекладывать на других.

Чем он уродлив? Ответьте аргументированно. А пока я выскажусь. Если код непривычен, "не по канонам", то это никак не значит, что он уродлив. Не вопрос.
Во-первых, в первом куске кода который "был раньше" всё сразу видно что и как происходит. При этом второй кусок мало того что частично находится в .h файле, так ещё и используется макрос (STATE) который вы дважды(!) переопределяете. В итоге если другой человек, или вы через полгода залезете в этот код, вам мало того что нужно будет лазить по нескольким файлам, так ещё и смотреть во что же разворачиваются макросы. А то что макрос ещё и переопределяется так это вообще нонсенс.

А здесь что уродливого вы нашли? Не мое. Из примера того человека.
Вы сами не имеете опыта\знаний (заметьте, вы сами это написали) при этом мало того общаетесь надменным тоном (аки я дартаньян а все ...), так ещё и аргументируете свои ответы кусками кода:
1. Какого то левого человека.
2. Который здесь никто, потому что кто он такой, кто посчитал его квалифицированным - никто не знает, и результаты его трудов - никто не видел. Однако видели, как вы говорите, его куски кода, которые мягко говоря не блещут. Хотя не буду наговаривать на человека, может быть это ваша интерпретация его кода\слов, а он даже и не знает о том что вы его "цитируете".

По данному куску могу сказать только одно: вы явно круты показав макросы без дефайнов.
0
soxop
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
10.04.2014, 20:40 23
Хватит письками меряться. Пойдемте пивка попьем. Пятницо.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
10.04.2014, 20:57 24
Цитата Сообщение от flomdger
бла-бла
Покажите мне эту чертову запятую, которая стоит, по вашим словам, неправильно.
Если вы про "name,", то все правильно.
Код
enum
{
//name,
PROC_FSM_1,
};
Никто надменным тоном с вами не разговаривает. С этим человеком я общаюсь достаточно давно. Насчет квалификации могу сказать одно. Продукция их фирмы поставляется и в зарубежные медицинские центры. А вы "говнокод". Ессно, меня это зацепило.
По поводу "говнокод". Ну вот не пойму я сейчас вас никак. Складывается впечатление, что вы зашорены некими канонами и стереотипами. Между прочим, X-macro широко используются людьми, которые профессионально занимаются imbiddid.
Цитата Сообщение от soxop
Хватит письками меряться. Пойдемте пивка попьем. Пятницо.
Ага. Медленно вздохнули, выдохнули. И вперед, релаксировать. :)
А так же взглянуть на некоторые моменты нашей\го профессии\хобби под другим углом.
0
ftomdkir
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 97
10.04.2014, 21:16 25
Покажите мне эту чертову запятую, которая стоит, по вашим словам, неправильно.
Если вы про "name,", то все правильно.
Вот это:
enum
{
//name,
PROC_FSM_1 ЭТА ЗАПЯТАЯ>>>>>,<<<<<<<
};
Запятая после последнего члена разрешена только в C99 стандарте (как оказалась). В чистом си или с++ так запрещено писать и компилятор на этом месте выдаст ошибку.

Ну вот не пойму я сейчас вас никак. Складывается впечатление, что вы зашорены некими канонами и стереотипами.
Опыт. Если не ограничивать себя в переносе мыслей на бунигу, то потом проект превращается в нечто ужасное. При написании кода в какой то момент приходишь от проблем с кодированием к архитектурным проблемам. Когда накодить можешь практически что угодно, но вот накодить так чтобы потом не было сущего ада (без глобальных переменных, хитрых приёмов и хаков) - это уже проблема. Тогда и понимаешь важность всех этих рекомендаций, правил, начинаешь читать книжки уже не по программированию, а по архитектуре и проектированию.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
10.04.2014, 21:29 26
Цитата Сообщение от flomdger
Запятая после последнего члена разрешена только в C99 стандарте (как оказалась). В чистом си или с++ так запрещено писать и компилятор на этом месте выдаст ошибку.
Ну, компилер спокойно схавал и так:
Код
__flash VECTORS proc_eds_func [PROC_EDS_MAIN_STATES] =
{
#define STATE(name) name
#include "_proc_eds_main.h"
#undef STATE
};

STATE (Proc_Eds_Main_Init),
STATE (Proc_Eds_Main_Set_Manual),
STATE (Proc_Eds_Main_Manual),
STATE (Proc_Eds_Main_Set_Automat),
STATE (Proc_Eds_Main_Automat),
STATE (Proc_Eds_Main_Stop),
Цитата Сообщение от flomdger
Опыт. Если не ограничивать себя в переносе мыслей на бунигу, то потом проект превращается в нечто ужасное. При написании кода в какой то момент приходишь от проблем с кодированием к архитектурным проблемам. Когда накодить можешь практически что угодно, но вот накодить так чтобы потом не было сущего ада (без глобальных переменных, хитрых приёмов и хаков) - это уже проблема. Тогда и понимаешь важность всех этих рекомендаций, правил, начинаешь читать книжки уже не по программированию, а по архитектуре и проектированию.
Ну да, это тема немаленькая...
0
soxop
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
10.04.2014, 21:35 27
Цитата Сообщение от flomdger
Запятая после последнего члена разрешена только в C99 стандарте (как оказалась). В чистом си или с++ так запрещено писать и компилятор на этом месте выдаст ошибку.
Нету такого понятия "чистый С(++)". Есть понятие стандарта. В C89 и C++03 например, действительно, эта злощастная запятаю вызвет фатальную ошибку при компиляции. Но нет абсолютно никаких причин намерено использовать старые стандарты (если только не писать под старый компилятор). Стандарты эволюционируют, компиляторы под них адаптируются. Мейнстримовые компиляторы делают это довольно быстро, и даже заблаговременно (ISO постоянно выпускает драфты). С99, правда, был тяжелый в некоторых местах (например, VLA), поэтому "официальный" ввод был длительный (а для некоторых не завершился, даже для GCC и конечно, для мелкомягкого вижуала), но простые фичи типа //-комментариев, разрешение запятой перед скобкой и пр. ввели сразу и нет причин ими пренебрегать. С++ тоже разрешает запятую перед скобкой, вроде с С++11.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
17.04.2014, 20:15 28
Да ну вас в баню, критиков! "Код не читабелен" видите ли. "Говнокод!". А простыня свитчей не говнокод, спрашивается? Я после этой темы (пошел у вас на поводу, блин!) переделал кусок проекта, саепси в простынях ковыряться. Переделал обратно на индексный переход и код вполне читабелен. По программе и по функциям вполне видно где что делается. А то, что макросы кому-то когда-то разворачивать, повышайте квалификацию!
Так что, каждому свой инструмент. Вполне все читабельно, а если кому-то не по феншую, то это его проблемы.
Код
//************************************************************************
//************************ Главный автомат *******************************
//************************************************************************

//========================================================================
/*
typedef enum
{
TUI_SERVICE_MAIN_INIT = 0,
TUI_SERVICE_MAIN_OUT_MODE,
TUI_SERVICE_MAIN_T_OUT_SENS,
TUI_SERVICE_MAIN_EMERG_MODE,
} tui_service_main_states;
*/
//------------------------------------------------------------------------
typedef enum tui_service_main_states
{
#define STATE(name, func) name,
//#include "_tui_service_main.h"
/*
// Для критиков

//========================================================================
STATE (TUI_SERVICE_MAIN_INIT,       Tui_Service_Main_Init)
STATE (TUI_SERVICE_MAIN_OUT_MODE,   Tui_Service_Main_Out_Mode)
STATE (TUI_SERVICE_MAIN_T_OUT_SENS, Tui_Service_Main_T_Out_Sens)
STATE (TUI_SERVICE_MAIN_EMERG_MODE, Tui_Service_Main_Emerg_Mode)
//========================================================================
*/

#undef STATE

TUI_SERVICE_MAIN_STATES

} tui_service_main_states;
//------------------------------------------------------------------------
extern __flash VECTORS tui_service_func [TUI_SERVICE_MAIN_STATES];
//------------------------------------------------------------------------
void tui_service (void);
//------------------------------------------------------------------------
void Tui_Service_Main_Init (void);
void Tui_Service_Main_Out_Mode (void);
void Tui_Service_Main_T_Out_Sens (void);
void Tui_Service_Main_Emerg_Mode (void);
//========================================================================

//========================================================================
__flash VECTORS tui_service_func [TUI_SERVICE_MAIN_STATES] =
{
#define STATE(name, func) func,
#include "_tui_service_main.h"
#undef STATE
};
0
ftomdkir
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 97
17.04.2014, 20:23 29
Привыкай к хардкору, Си это вообще грёбанная череда различных знаков препинания а не язык :D
0
soxop
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
17.04.2014, 20:25 30
Аминь.
0
17.04.2014, 20:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2014, 20:25

Правильно решено?
Танцевальная группа состоит из 15 человек. ДЛЯ НИХ ПОСТАВЛЕНЫ ПЛАТЬЯ 4 Х ЦВЕТОВ. СКОЛЬКО...

Правильно решено?
Program V19_N4; var A,D :arrayof real; S,b,S1,S2 :real; i:integer; BEGIN write('Введите B:...

Без использования typedef все работает. При добавлении typedef — более 100 ошибок
Есть программа, с описанием структуры и функций, работающими с ней. Без использования typedef все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru