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

 
 
 
Reply to this topicStart new topic
> указатель на функцию, непонятно
TigerSHARC
сообщение Aug 31 2012, 19:54
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



есть код

CODE
//! Command processing function
typedef tBool (* FuncCmd)( some_struct * p, char * pArg );


//! Command description
typedef struct tagPARSE_cmd {
const char * p; //!< command name
FuncCmd func; //!< command functions
} tPARSE_cmd;


затем происходит вызов

CODE
func(x,y);



Непонятно где тело функции func и что в ней происходит.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 31 2012, 20:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(TigerSHARC @ Aug 31 2012, 22:54) *
затем происходит вызов

CODE
func(x,y);

И что вызов действительно происходит?
Компилятор скомпилировал, линкер слинковал?


Цитата(TigerSHARC @ Aug 31 2012, 22:54) *
Непонятно где тело функции func и что в ней происходит.

Судя по тому что вы задаёте такой вопрос, мне кажется что тела функции нет - вы её не определили.
И вызвать так тоже не удастся.

Как-то так попробуте:
Код
tPARSE_cmd Parser;

tBool Cmd1( some_struct * p, char * pArg )
{
// парсинг команды 1
}

tBool Cmd2( some_struct * p, char * pArg )
{
// парсинг команды 2
}

int main()
{
/// bla bla bla - какой-то код
Parser.funk=Сmd1;
tBool parsing_result=Parser.funk(A, B);
if (parsing_result) {
  // bla bla bla - какой-то код
}
  /// bla bla bla - какой-то код
  Parser.funk=Сmd2;
parsing_result=Parser.funk(C, D);
if (parsing_result) {
  // bla bla bla - какой-то код
}
}


PS- Offtop - не пойму в чём сермяга, писать так
Код
typedef struct tagPARSE_cmd {
    const char       * p;    //!< command name
    FuncCmd    func;    //!< command functions
} tPARSE_cmd;

чем хуже писать так:
Код
struct tPARSE_cmd {
    const char       * p;    //!< command name
    FuncCmd    func;    //!< command functions
};

?
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Sep 1 2012, 05:05
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(_Артём_ @ Sep 1 2012, 00:38) *
PS- Offtop - не пойму в чём сермяга, писать так
Код
typedef struct tagPARSE_cmd {
    const char       * p;    //!< command name
    FuncCmd    func;    //!< command functions
} tPARSE_cmd;

чем хуже писать так:
Код
struct tPARSE_cmd {
    const char       * p;    //!< command name
    FuncCmd    func;    //!< command functions
};

?



смысл в том что такой код скомпилирует любой компилятор. Это сделано для переносимости. здесь где-то тема была....

P.S. по сабжу спасибо. Надо внимательнее код глянуть. Просто думал какие-то секретв есть, но, видимо тело где-то всё равно должно быть.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 1 2012, 07:08
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(_Артём_ @ Aug 31 2012, 23:38) *
PS- Offtop - не пойму в чём сермяга, писать так
Код
typedef struct tagPARSE_cmd { ... } tPARSE_cmd;
чем хуже писать так:
Код
struct tPARSE_cmd { ... };
Для C++ разницы нет, в обеих случаях потом можно писать для объявления/определения переменной
Код
tPARSE_cmd parse_cmd;
tPARSE_cmd * SomeFunc(tPARSE_cmd *arg);
Для C в первом случае можно писать так же, во втором придётся
Код
struct tPARSE_cmd parse_cmd;
struct tPARSE_cmd * SomeFunc(struct tPARSE_cmd *arg);
Просто надоедает.
Но все конструкции должны употребляться всеми компиляторами. Некоторые очень старые могут не понять
Код
typedef struct /* тут без имени вообще либо точно такое же имя, как внизу */ {
    const char       * p;    //!< command name
    FuncCmd    func;    //!< command functions
} tPARSE_cmd;
поэтому для совместимости пишут имя структуры с префиксом или суфиксом, кому лень — просто подчёркивание, кому не лень — слово «tag».
Я давно пишу просто typedef struct { /* ... */ } name; (и то только если исходник предназначен для компиляции в С-режиме).


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 1 2012, 19:05
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ReAl @ Sep 1 2012, 10:08) *
Для C++ разницы нет

Понятно. Я обычно создаю в ИАРе С++ проект даже не глядя нужен ли он там...

Цитата(ReAl @ Sep 1 2012, 10:08) *
Некоторые очень старые могут не понять

Может кому-то это и надо.

Цитата(ReAl @ Sep 1 2012, 10:08) *
(и то только если исходник предназначен для компиляции в С-режиме).

А в каких случаюх может возникнуть необходимость в С-режиме?
Бывает такое, что на С++ никак нельзя?
Go to the top of the page
 
+Quote Post

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

 


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


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