2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 00:26 
Заслуженный участник


27/04/09
28128
temp03 в сообщении #669528 писал(а):
а pt тоже нигде нету
Цитата:
typedef int(*pt)(bb*, void*);

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 09:35 
Заслуженный участник


09/09/10
3729
temp03, я бы вам посоветовал взять какую-нибудь хорошую книгу по Си и прочитать раздел про структуры. У меня сложилось впечатление, что у вас какое-то особое представление о том, что они такое.

Вот вы мне писали в ЛС, что у вас на самом деле есть функция
Код:
int somefunction(bb *hc /* other params? */) {
  int aa;
  aa = hc->get(hc, hc->data);
  ...
}

Ну и? Она принимает указатель hc на структуру bb — т.е. указатель на переменную с типом bb. Что делает hc->get? Берет ваш указатель, смотрит на ту переменную, на которую он указывает — это переменная структурного типа, у нее есть поля, в т.ч. и поле get. Результатом выражения hc->get является значение поля get той структуры, на которую указывает hc. Далее, поскольку get — это указатель на функцию, мы можем сделать вызов функции, на которую он указывает. Это делается выражением вида pointer_to_func(parameters), где pointer_to_func — это не имя функции, а указатель на функцию. Результат вызова этой функции записывается в aa. Все.

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 10:20 
Заблокирован


16/06/09

1547
Joker_vD, спасибо. Это всё понятно. Но где-то же функция, на которую указывает get есть. Вот как найти эту функцию.

-- Чт янв 10, 2013 11:24:18 --

arseniiv в сообщении #669556 писал(а):
temp03 в сообщении #669528 писал(а):
а pt тоже нигде нету
Цитата:
typedef int(*pt)(bb*, void*);
Спасибо, понятно. Но нужен get, а не pt.

-- Чт янв 10, 2013 11:37:24 --

Или хотя бы в каком виде этот указатель/функцию искать?

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 10:37 
Заслуженный участник


09/09/10
3729
temp03 в сообщении #669641 писал(а):
Но где-то же функция, на которую указывает get есть. Вот как найти эту функцию.

Посмотреть на значение get и пройти по этому адресу в отладчике? :-) А если серьезно, то get может указывать на любую функцию, принимающую два указателя: на bb и на void; т.е. на функцию с сигнатурой int(bb*,void*). Если вы читаете исходники, то понятно, что внутри вон той somefunc вы ничего про то, откуда взялось значение get, не узнаете — оно пришло извне. Однако я уверен (особенно после взгляда на настоящий исходник), что есть некая функция наподобие bb* allocate_bb() или init_bb(bb*), с помощью которой положено создавать/инициализировать вашу структуру; и именно в ней и задается значение поля get для новосозданной структуры. Впрочем, это может быть и не так, хотя я и сомневаюсь.

Кроме того, подобная функция в том заголовочном файле, который вы мне прислали, объявлена: в самом-самом низу (уж где она на самом деле определена — вам видней). Значит, скорее всего где-то в коде есть строчка с "get = tpXXXXXX_get" или с ", tpXXXXXX_get ," (с произвольными пробелами). Грепайте.

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 11:09 
Заблокирован


16/06/09

1547
Joker_vD в сообщении #669646 писал(а):
Если вы читаете исходники, то понятно, что внутри вон той somefunc вы ничего про то, откуда взялось значение get, не узнаете — оно пришло извне.
но где-то же связь get - настоящая функция прописана? Где?
Joker_vD в сообщении #669646 писал(а):
Кроме того, подобная функция в том заголовочном файле, который вы мне прислали, объявлена: в самом-самом низу (уж где она на самом деле определена — вам видней). Значит, скорее всего где-то в коде есть строчка с "get = tpXXXXXX_get" или с ", tpXXXXXX_get ," (с произвольными пробелами). Грепайте.
Бинго! Найдена в том же модуле с названием .с
Вы молодец, Джокер, спасибо!
.............

вопрос но она же (функция внизу) имеет другое название (без _pt в конце), почему вы уверены что это она?
Кстати, а вот и найденная функция:
Используется синтаксис C
tpХХХ_int <имя функции>(tpХХХ_conn_t *dc, void *data)
{
    return _OK;
}

:shock:
Это вам о чем-то говорит? Или это не она? Меня это в ступор загнало.

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 11:33 
Заслуженный участник


09/09/10
3729
temp03
Вам все-таки стоит выучить различие между типом и значением. И почему при вызове функций надо всегда писать круглые скобки.

Пусть у вас есть функции int f(void) { return 42; } и char g(char c) { return c - 5; }.

Выражение f() имеет тип int и его значение равно 42. Выражение f имеет тип int(*)(void) и его значение (этого выражения) — это указатель на функцию int f(void). Выражение g('5') имеет тип char и его значение равно '0'. Выражение g имеет тип char(*)(char) и его значение — это указатель на функцию char g(char).

temp03 в сообщении #669655 писал(а):
но где-то же связь get - настоящая функция прописана? Где?

Где-то там, где написано smth.get = tpXXXXXX_get или smthptr->get = tpXXXXXX_get или нечто подобное. Поймите, get — это поле структуры. Если вы создадите двадцать ваших структур bb, у них будет двадцать различных полей get, которые могут иметь двадцать различных значений, т.е. указывать на двадцать различных функций подходящей сигнатуры. Хотя в данном случае, я уверен, эти поля всегда инициализируются указателем на tpXXXXXX_get и дальше никогда не изменяются.

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 12:01 
Заблокирован


16/06/09

1547
Joker_vD в сообщении #669663 писал(а):
Выражение f() имеет тип int и его значение равно 42. Выражение f имеет тип int(*)(void) и его значение (этого выражения) — это указатель на функцию int f(void). Выражение g('5') имеет тип char и его значение равно '0'. Выражение g имеет тип char(*)(char) и его значение — это указатель на функцию char g(char).
ничего не понял. Т.е. _OK - это целое число? Ну это понятно. Или это опять указатель на какую-то функцию? В чём смысл
Используется синтаксис C
tpХХХ_int <имя функции>(tpХХХ_conn_t *dc, void *data)
{
    return _OK;
}

разве не в возврате целого числа? Для чего тогда 2 аргумента tpХХХ_conn_t *dc и void *data?
Joker_vD в сообщении #669663 писал(а):
Где-то там, где написано smth.get = tpXXXXXX_get или smthptr->get = tpXXXXXX_get
т.е. smth или smthptr и будут нужными структурами? Или найденная функция уже нужная структура, но просто есть указатели на неё

-- Чт янв 10, 2013 13:32:29 --

Joker_vD в сообщении #669663 писал(а):
И почему при вызове функций надо всегда писать круглые скобки.
но у нас же вызов get идёт со скобками:
Используется синтаксис C
aa = hc->get(hc, hc->data);

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 12:46 
Заслуженный участник


09/09/10
3729
Ох... пускай меня кто-нибудь сменит :-(

temp03 в сообщении #669678 писал(а):
но у нас же вызов get идёт со скобками:

Это я про тот случай, когда функция не принимает аргументы: угадайте, что напечатает следующая программа:

Код:
#include <stdio.h>

int f(void) { return 42; }

int main(void) {
  printf( "%d\n", f() );
  printf( "%d\n", f );
  return 0;
}


Кстати, вы с ООП-языками работали?

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 13:38 
Заблокирован


16/06/09

1547
первая напечатает 42, вторая это указатель. Видимо адрес напечатает. Т.е. вы хотите сказать, что get = tpXXXXXX_get - это адрес функции get? Но где-то же он прописывается, где-то же его можно узнать?

Так я так и не понял что означает запись return _OK с двумя входящими параметрами: это тоже адрес функции?

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 13:53 
Заслуженный участник


09/09/10
3729
temp03 в сообщении #669732 писал(а):
Т.е. вы хотите сказать, что get = tpXXXXXX_get - это адрес функции get?

Я хочу сказать, что в get пишется адрес функции tpXXXXXX_get! Что тут сложного?

temp03 в сообщении #669732 писал(а):
Так я так и не понял что означает запись return _OK с двумя входящими параметрами: это тоже адрес функции?

:facepalm: Вы впервые в жизни видите функцию, которая возвращает одно и то же значение, невзирая на свои аргументы?

Используется синтаксис C
int isGoodString(const char *s, int len) {
    return 1;
}


OK_ — это возвращаемое значение функции tpXXXXXX_get, его тип написан прям перед именем функции — tpXXX_int. Я на 100% уверен, что это какой-нибудь enum из пары значений, т.е. обычный int, в сущности.

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 14:26 
Заблокирован


16/06/09

1547
Спасибо! Так что же делает функция
Используется синтаксис C
hc->get(hc, hc->data);
?

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 14:44 
Заслуженный участник


28/04/09
1933
temp03
temp03 в сообщении #669753 писал(а):
Так что же делает функция
Используется синтаксис C
hc->get(hc, hc->data);
?
Отмотайте программный код назад и посмотрите, где заполняются поля hc (конкретнее, поле get). Ведь совершенно справедливо было замечено, что
Joker_vD в сообщении #669646 писал(а):
где-то в коде есть строчка с "get = tpXXXXXX_get" или с ", tpXXXXXX_get ," (с произвольными пробелами)

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 15:06 
Заблокирован


16/06/09

1547
EtCetera здравствуйте!
Идея такая: в общем модулей много, так что не всё так просто отмотать. я уже посылал Джокеру в личку исходный вариант, но могу и вам, хотя сущность:

Используется синтаксис C
#include <malloc.h>

typedef struct xxx bb;
typedef int(*pt)(bb*, void*);

struct xxx {
  pt      get;
  void   *ccc;
};

int main() {
  bb *bb;
  return bb->get(bb, bb->ccc);
}

отображает смысл достаточно чётко. Есть структура и есть функция в формате си. Вот ссс это и есть data, а bb - это hc. Т.е. в исходном коде:
код: [ скачать ] [ спрятать ]
Используется синтаксис C
модуль .h
#include <malloc.h>

typedef struct tpXXX_x tpXXX_y;
typedef int(*_event_get_pt)(tpXXX_y* dc, void* data);

struct tpXXX_x {
  _event_get_pt      get;
  void              *data;
   .....
   еще всякий хлам
};
int _event_get(tpXXX_y *dc, void *data);
__________________

модуль .c

tpХХХ_int _event_get(tpXXX_y *dc, void *data)
{
    return _OK;
}
.......
int main() {
  tpXXX_y *hc;
  int rc = hc->get(hc, hc->data);
}


Т.е. смысл в том, что функция _event_get, которую я нашёл с помощью Джокера и функция _event_get_pt get, которая определяется в структуре tpXXX_x - разные. Т.е. должно быть определение. Оно пока не найдено. Да и функция get (если это она, а мы уверены, что это именно она) - возвращает _OK - малопонятна.

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 15:29 
Заслуженный участник


28/04/09
1933
temp03 в сообщении #669771 писал(а):
Идея такая: в общем модулей много, так что не всё так просто отмотать.
Воспользуйтесь поиском (нажмите Ctrl+F, введите get= с добавлением между get и = нужного для успешного поиска числа пробелов, выберите "Current Project" или "Entire Solution", если проектов несколько, и нажмите "Find Next").

 Профиль  
                  
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 15:33 
Заблокирован


16/06/09

1547
понял. Попробую сейчас

-- Чт янв 10, 2013 16:44:49 --

EtCetera в сообщении #669784 писал(а):
temp03 в сообщении #669771 писал(а):
Идея такая: в общем модулей много, так что не всё так просто отмотать.
Воспользуйтесь поиском (нажмите Ctrl+F, введите get= с добавлением между get и = нужного для успешного поиска числа пробелов, выберите "Current Project" или "Entire Solution", если проектов несколько, и нажмите "Find Next").
не совсем понял насчёт пробелов. Они-то зачем? я в TotalCommaned по Alt+F7 ищу

-- Чт янв 10, 2013 16:54:30 --

Значиццо, по шаблону "get =" найдено следующее:
Используется синтаксис C
v->entx.get = _event_get_tpf;
wx->entx.get = _event_get_tpf;
v->enty->pr.get = _event_get_tpf_rd;
v->enty->pr.get = _event_get_tpf_kl;
v->enty->pr.get = _event_get_tpf_ip;
v->enty->pr.get = _event_get_tpf_lc;


больше ничего нет

-- Чт янв 10, 2013 16:56:00 --

по шаблонам с другим количеством пробелов (2, 3, 4... 20) также ничего нет.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу Пред.  1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group