2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Где здесь функция?
Сообщение11.01.2013, 11:13 
Что-то я уже всю голову сломал :?
Есть конструкция 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 
Вызов функции это скобочки. Но скобочки это еще группировка операций и приведение типа.
Смотрим на скобочки:

Используется синтаксис 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 
Т.е. я правильно понимаю? 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 
bbb это указатель на функцию, который присваивается в предыдущей строке. Вполне можно было написать в один оператор:

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


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


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

 
 
 
 Re: Где здесь функция?
Сообщение11.01.2013, 13:13 
temp03
У вас, похоже, какой-то затык в осознании случился. Это бывает. Поймите, _list.aa — это переменная-указатель. Куда она указывает — зависит от того, куда ей сказали указывать. Единственное отличие указателя на функцию от обычного указателя — его нельзя разыменовать, можно только по нему вызвать функцию на которую он указывает.

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

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

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

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

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

 
 
 
 Re: Где здесь функция?
Сообщение11.01.2013, 14:40 
temp03 в сообщении #670256 писал(а):
ну должно же быть имя у неё!
Зачем оно там? Имена нужны для людей (программистов), программа работает с указателями (по крайней мере, в данном случае).

 
 
 
 Re: Где здесь функция?
Сообщение11.01.2013, 14:49 
Joker_vD в сообщении #670240 писал(а):
mustitz
Ну если очень хочется полиморфизму, а писать разрешено лишь на C89 универсальности для (например)?


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

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

-- 11.01.2013, 13:55 --

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


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

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

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

 
 
 
 Re: Где здесь функция?
Сообщение11.01.2013, 15:47 
mustitz в сообщении #670271 писал(а):
Одно другому не мешает.

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

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

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

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

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

 
 
 
 Re: Где здесь функция?
Сообщение11.01.2013, 16:07 
Посмотрите на этот пример, что тут непонятного?

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
mustitz
А вот что непонятно! Строчки же f = &test1; у вас есть? Т.е. по f у вас можно узнать о test1
Вот то же самое нужно и мне.

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

(Оффтоп)

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


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

 
 
 
 Re: Где здесь функция?
Сообщение11.01.2013, 16:15 
Joker_vD, похожие на что? на _list.aa, на bbb или на _list?

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

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

 
 
 
 Re: Где здесь функция?
Сообщение11.01.2013, 16:17 
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  След.


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