2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3  След.
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 00:26 
temp03 в сообщении #669528 писал(а):
а pt тоже нигде нету
Цитата:
typedef int(*pt)(bb*, void*);

 
 
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 09:35 
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 
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 
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 
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 
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 
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 
Ох... пускай меня кто-нибудь сменит :-(

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

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

 
 
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 13:53 
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 
Спасибо! Так что же делает функция
Используется синтаксис C
hc->get(hc, hc->data);
?

 
 
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 14:44 
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 
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 
temp03 в сообщении #669771 писал(а):
Идея такая: в общем модулей много, так что не всё так просто отмотать.
Воспользуйтесь поиском (нажмите Ctrl+F, введите get= с добавлением между get и = нужного для успешного поиска числа пробелов, выберите "Current Project" или "Entire Solution", если проектов несколько, и нажмите "Find Next").

 
 
 
 Re: Подскажите по С, что означает запись
Сообщение10.01.2013, 15:33 
понял. Попробую сейчас

-- Чт янв 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  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group