2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Где здесь функция?
Сообщение11.01.2013, 11:13 
Заблокирован


16/06/09

1547
Что-то я уже всю голову сломал :?
Есть конструкция C:
Используется синтаксис C
    while (*(uintptr_t *) _list.aa) {
        while (*(uintptr_t *) _list.aa) {        // иерархический дубль
            bbb = *(list_stg_pt *) _list.aa;     // list_stg_pt - указатель
            c += bbb(&_list);
        }
        _list.aa += sizeof(uintptr_t);
    }


_list.aa инициализируется как malloc
Вызывается функция. Не пойму где и не пойму механизм вызова.
Спасибо.

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 11:19 


10/04/12
705
Вызов функции это скобочки. Но скобочки это еще группировка операций и приведение типа.
Смотрим на скобочки:

Используется синтаксис C
   
while (*(uintptr_t *) _list.aa) // Тут скобочки это приведение типа
{
        while (*(uintptr_t *) _list.aa) {        // Тоже приведедение типа
            bbb = *(list_stg_pt *) _list.aa;     // Еще приведение типа
            c += bbb(&_list);                    // О! вызов функции! Нашли!!!
        }
        _list.aa += sizeof(uintptr_t);           // Группировка операций
    }
 

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 11:36 
Заблокирован


16/06/09

1547
Т.е. я правильно понимаю? while (*(uintptr_t *) _list.aa) - это _list.aa приводится к типу uintptr_t *? Далее bbb = *(list_stg_pt *) _list.aa - т.е. bbb есть _list.aa приведённый к типу на который указывает list_stg_pt *?

Далее
а где искать эту функцию? Это bbb?, _list? или всё вместе???
И ещё функции всё время разные в зависимости от bbb или это всё время одна функция?

Спасибо!

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 12:21 


10/04/12
705
bbb это указатель на функцию, который присваивается в предыдущей строке. Вполне можно было написать в один оператор:

Используется синтаксис C
  c +=
    (*(list_stg_pt *) _list.aa) /* Выражение определяющее адрес функции */  
    (&list) /* Вызов функции */
  ;    
 


list_stg_pt это скорее всего тип указателя на функцию, само значение указателя на функцию хранится в _list.aa.


Вообще это ручная реализация такого паттерна, как виртуальная функция. Знаете что это?

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 13:13 
Заслуженный участник


09/09/10
3729
temp03
У вас, похоже, какой-то затык в осознании случился. Это бывает. Поймите, _list.aa — это переменная-указатель. Куда она указывает — зависит от того, куда ей сказали указывать. Единственное отличие указателя на функцию от обычного указателя — его нельзя разыменовать, можно только по нему вызвать функцию на которую он указывает.

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

mustitz
Ну если очень хочется полиморфизму, а писать разрешено лишь на C89 универсальности для (например)?

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 13:55 
Заблокирован


16/06/09

1547
Спасибо! И вам и вам. Так как же мне отыскать эту злополучную функцию?
Joker_vD в сообщении #670240 писал(а):
Си — язык примитивный. Очень. Это практически ассемблер, тут ничего не прячется, все явно руками программиста делается.
Т.е. в _list.aa может храниться практически ассемблерное указание без имени функции??? :-(

-- Пт янв 11, 2013 14:57:02 --

ну должно же быть имя у неё!

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 14:40 
Заслуженный участник


28/04/09
1933
temp03 в сообщении #670256 писал(а):
ну должно же быть имя у неё!
Зачем оно там? Имена нужны для людей (программистов), программа работает с указателями (по крайней мере, в данном случае).

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 14:49 


10/04/12
705
Joker_vD в сообщении #670240 писал(а):
mustitz
Ну если очень хочется полиморфизму, а писать разрешено лишь на C89 универсальности для (например)?


Одно другому не мешает. Виртуальная функция это концепция. В С++ есть синтаксический сахар для упрощения реализации. В С его нет, поэтому приходится реализовывать ручками. В этом случае структуры содержат поля - указатели на функции, которые необходимо инициализировать при создании структуры.

Собственно говоря, понимание концепции виртуальная функция просто поможет лучше понимать этот код. Потому как это будет уже не запутанные операции с указателями и вызов функций, а код, объединенный некоторой идеей.

-- 11.01.2013, 13:55 --

temp03 в сообщении #670256 писал(а):
ну должно же быть имя у неё!


В общем случае необязательно. Вполне можно выделить память, прописать ей атрибуты, сформировать ассемблерный код ручками и сделать вызов. Но это экзотика.

Вообще, если функция вызывается по указателю, то в разные моменты прохождения кода этот указатель может указывать на разные функции. Ручная реализация концепции "виртуальная функция".

А так указатель на функцию хранится в _list.aa, значит надо искать код, который изменяет это поле. Очень может быть, что там могут хранится указатели на разные функции.

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 15:47 
Заслуженный участник


09/09/10
3729
mustitz в сообщении #670271 писал(а):
Одно другому не мешает.

Ну о том и речь. В конце концов, любой исходник все равно превращается в машинной код + данные :-) Кстати, случалось разбирать (диз)ассемблерный листинг машинного код с вызовами виртуальных функций? Они очень грустно выглядят, а уж на разбор того, какую же именно vtable мы используем, и где же и чем именно она заполняется уходит много времени...

temp03 в сообщении #670256 писал(а):
Так как же мне отыскать эту злополучную функцию?

Какую функцию? _list.aa может указывать на любую функцию (подходящей сигнатуры).

Вообще, диалог очень странно строится: "— Вот указатель на int, как мне отыскать этот int? Должно же у него быть имя!" Ну, смотрите, где этому указателю присваивается его значение, что тут еще сделать?

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 15:56 
Заблокирован


16/06/09

1547
mustitz в сообщении #670271 писал(а):
Вообще, если функция вызывается по указателю, то в разные моменты прохождения кода этот указатель может указывать на разные функции. Ручная реализация концепции "виртуальная функция".
Спасибо. Но должна же быть какая-то система имён, которая позволяет увязывать программисту указатели с функциями? Программист же как-то их увязывал??? Тем более если речь не об ассемблерных функциях-5минутках, а о полноценных функциях имеющих простите конкретные функции.

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 16:07 


10/04/12
705
Посмотрите на этот пример, что тут непонятного?

код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>

typedef int func(int);

int test1(int value)
{
  return value + 1;
}

int test2(int value)
{
  return value - 1;
}

int main()
{
  func* f;

  f = &test1;
  printf("(1) %d\n", f(5));

  f = &test2;
  printf("(2) %d\n", f(5));

  return 0;
}
 


Код:
$ gcc test.c
$ ./a.out
(1) 6
(2) 4

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 16:11 
Заблокирован


16/06/09

1547
mustitz
А вот что непонятно! Строчки же f = &test1; у вас есть? Т.е. по f у вас можно узнать о test1
Вот то же самое нужно и мне.

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 16:13 
Заслуженный участник


09/09/10
3729

(Оффтоп)

mustitz
"&" перед именами функций необязательны; и обычно тайпдефят указатель, а не сигнатуру :-)


[b]temp03[/t]
Вот и ищите у себя похожие. Как правило, указатели на функцию инициализируют оч-чень далеко от того места, где их используют.

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 16:15 
Заблокирован


16/06/09

1547
Joker_vD, похожие на что? на _list.aa, на bbb или на _list?

-- Пт янв 11, 2013 17:17:18 --

с чего начать копать ??????? :shock:

 Профиль  
                  
 
 Re: Где здесь функция?
Сообщение11.01.2013, 16:17 


10/04/12
705
temp03 в сообщении #670296 писал(а):
mustitz
А вот что непонятно! Строчки же f = &test1; у вас есть? Т.е. по f у вас можно узнать о test1
Вот то же самое нужно и мне.


Ну так вы привели только строчки, которые аналогичны
Используется синтаксис C
printf("(1) %d\n", f(5));
printf("(2) %d\n", f(5));
 

Откуда нам знать, где у вас присваивается значение указателя?

Копать можно в двух направлениях:
  • Найти в коде, где полю aa присваивается некоторое значение. Одна из этих функций доберется до вашего кода
  • Зайти в отладчике в функцию и увидеть, какая вызвалась


-- 11.01.2013, 15:21 --

(Оффтоп)

Joker_vD в сообщении #670298 писал(а):
mustitz
"&" перед именами функций необязательны; и обычно тайпдефят указатель, а не сигнатуру :-)

Мне так нагляднее, а видел я по всякому :)

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

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



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

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


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

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