powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на функцию, возвращающую указатель на int
12 сообщений из 12, страница 1 из 1
указатель на функцию, возвращающую указатель на int
    #39997232
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
функция, возвращающая указатель на int
Код: plaintext
1.
int *linear_search(int arr[], int arr_size, int val);


в функции код-таймер я хочу передать указатель на функцию linear_search, я сделала это так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
double code_timer( int *arr, int arr_size, int val, int nrun,
		int *(*search_algorithm)(int *arr, int arr_size, int val) )
{
	double interval = 0;
	clock_t start, end;

	start = clock();
	/* Code under Test */
	for (int j = 0; j < nrun; j++) {
		(*search_algorithm)(arr, arr_size, val);
	}
	/* End of Code under Test */
	end = clock();
	interval = (double)(end - start) / (double)(nrun) / (double) CLOCKS_PER_SEC * 1000000.0;
    return interval; // in microseconds (mcs)
}

int main(void) {
    ...
    // вызов code_timer с функцией linear_search в качестве параметра
    linear_result = code_timer(benchmark_data, SIZE, check_point, NRUN, (*linear_search) );
}


но засомневалась и решили спросить, правильно я это сделалала или нет. если неправильно, то как?
...
Рейтинг: 0 / 0
указатель на функцию, возвращающую указатель на int
    #39997282
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

я думаю, что main должен выглядеть так (хотя это никак не влияет на результат...)

Код: plaintext
1.
2.
3.
4.
5.
int main(void) {
    ...
    // вызов code_timer с функцией linear_search в качестве параметра
    linear_result = code_timer(benchmark_data, SIZE, check_point, NRUN, linear_search);
}
...
Рейтинг: 0 / 0
указатель на функцию, возвращающую указатель на int
    #39997349
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
но засомневалась и решили спросить, правильно я это сделалала или нет. если неправильно, то как?


Все правильно, но можно улучшить ))

1) Чтобы не мучаться с указателями на функцию, можно объявить отдельно тип функции и потом работать с простым синтаксисом указателя на тип.
Код: plaintext
1.
2.
3.
4.
5.
6.
 
typedef int *search_fn_t(int arr[], int arr_size, int val); // тут просто прототип функции после typedef

double code_timer( int *arr, int arr_size, int val, int nrun, search_fn_t* search_algorithm)
{
}



2)
Код: plaintext
1.
2.
3.
(*search_algorithm)(...);
// то же самое только без синтаксического мусора, т.е. более читаемо.
search_algorithm(...);
...
Рейтинг: 0 / 0
указатель на функцию, возвращающую указатель на int
    #39997355
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо :)
...
Рейтинг: 0 / 0
указатель на функцию, возвращающую указатель на int
    #39997457
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky

2)
Код: plaintext
1.
2.
3.
(*search_algorithm)(...);
// то же самое только без синтаксического мусора, т.е. более читаемо.
search_algorithm(...);


этот момент я не понимаю. на каком основании можно использовать (*search_algorithm)(...); вместо (search_algorithm)(...); ?
почему они эквивалентны?
Дейтел по этому поводу пишет: a pointer to a function is dereferenced to use the function.
...
Рейтинг: 0 / 0
указатель на функцию, возвращающую указатель на int
    #39997458
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-простому: имя функции это просто указатель на ее точку входа, адрес первого байта кода функции.
...
Рейтинг: 0 / 0
указатель на функцию, возвращающую указатель на int
    #39997477
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
у меня были подозрения, что функция в этой ситуации ведет себя также, как и массив.
...
Рейтинг: 0 / 0
указатель на функцию, возвращающую указатель на int
    #39997503
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
Dima T,
у меня были подозрения, что функция в этой ситуации ведет себя также, как и массив.

Умно, но в логическом отношении, я бы предложил перевернуть формулировку:
массив всегда ведет себя как функция с параметром, передаваемым по значению.

Разница возникает в интерпретации адреса для возвращаемого значения.
Для массива она гарантированно проще, и удачно приводит к понятию итератора в c++,
при рассмотрении этого вопроса с точки зрения абстрактных типов данных

Из этого, со временем, умеются много гитик.
Молодец, славно.
...
Рейтинг: 0 / 0
указатель на функцию, возвращающую указатель на int
    #39997552
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
этот момент я не понимаю. на каком основании можно использовать (*search_algorithm)(...); вместо (search_algorithm)(...); ?
почему они эквивалентны?

Они не эквивалентны.
(search_algorithm)(...) можно использовать вместо (*search_algorithm)(...) но не наоборот.

UPD: Упс, оказывается таки можно (*search_algorithm)(...) , если search_algorithm это функция а не указатель.
Ну, значит эквивалентны. ))
...
Рейтинг: 0 / 0
указатель на функцию, возвращающую указатель на int
    #39997812
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с указателями на функцию я пока что "на вы", я очень долго разбиралась, как их правильно разыменовывать. Кстати, про массивы и указатели на массивы написано почти в каждом учебнике, а про функцию и указатели на функцию практически нигде, и если написано, то очень поверхностно. Хотя с другой стороны, указатели на функцию это где-то близко к экзотике.
...
Рейтинг: 0 / 0
указатель на функцию, возвращающую указатель на int
    #39997831
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

вовсе нет, на них весь ооп норвежского посола стоит.
Таблица виртуальных методов - это массив указателей на функции.
...
Рейтинг: 0 / 0
указатель на функцию, возвращающую указатель на int
    #39997874
mini.weblab
Dima T,
у меня были подозрения, что функция в этой ситуации ведет себя также, как и массив.

в асме ф-я открывается отдельными инструкциями и закрывается инструкциями
а массив - это просто ячейки подряд
там указатель на первую ячейку + кол-во ячеек
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на функцию, возвращающую указатель на int
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]