| imho.ws |
![]() |
|
|
|
# 1 |
|
Member
Регистрация: 26.09.2005
Адрес: Питер
Сообщения: 336
![]() ![]() |
Указатель на функцию и его использование в С++
Есть функция1 и функция2. Предлагается создать указатель на функцию1, что из функции2 можно было бы вызывать ее(фунцию1) обращаясь к элементу массива(для разных параметров). Язык: С/С++.
Спасибо. |
|
|
|
|
# 3 |
|
Junior Member
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180
![]() ![]() ![]() ![]() ![]() ![]() |
что-то так
Код:
// функция 1
double func1(float a) { return a*a; }
// указатель на функцию 1
typedef double (*pfunc1)(float a);
// функция 2
void func2();
int _tmain(int argc, _TCHAR* argv[])
{
func2();
return 0;
}
void func2()
{
pfunc1 func_vect[10];
for (int i = 0; i < 10; i++)
func_vect[i] = func1;
for (int i = 1; i <= 10; i++)
{
printf("%f ", func_vect[i-1](i));
}
}
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы! |
|
|
|
|
# 5 | |
|
Junior Member
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180
![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы! |
|
|
|
|
|
# 7 |
|
Junior Member
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180
![]() ![]() ![]() ![]() ![]() ![]() |
да, конструкция имеет смысл, если мы хотим организовать доступ к различным функциям по индексу, например, выбор элемента меню.
гдето в программе: Код:
void cut();
void copy();
void paste();
typedef void (*paction)(void);
void main()
{
paction actions[3];
actions[0] = cut;
actions[1] = copy;
actions[2] = paste;
//..... выполняем какие-то действия
// при которых пользователь выбрал в меню какой-то пункт
// и получаем
actions[menuitem];
}
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы! |
|
|
|
|
# 10 |
|
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
В MFC по другому
http://rsdn.ru/article/wtl/wtl-1.xml#ERPAE
__________________
Best Regards |
|
|
|
|
# 11 |
|
Junior Member
Регистрация: 18.04.2005
Сообщения: 157
![]() ![]() ![]() ![]() |
ситуация такая, решил замутить себе либу с функцией split (стандартные не предлагать
).сама функция: Код:
char ** _ARRAY;
char ** split(char _SPLITTER, char * _STRING_TO_SPLIT) {
int _STRING_SIZE=0;
int _LINES_QUANTITY=0;
int _CHARS_IN_LINE=0;
int _MOST_LONG_LINE=0;
while(_STRING_TO_SPLIT[_STRING_SIZE]!='\0') {
_CHARS_IN_LINE++;
if(_STRING_TO_SPLIT[_STRING_SIZE]==_SPLITTER) {
_CHARS_IN_LINE=0;
_LINES_QUANTITY++;
}
if(_MOST_LONG_LINE<_CHARS_IN_LINE) {
_MOST_LONG_LINE=_CHARS_IN_LINE;
}
_STRING_SIZE++;
}
int _CURRENT_LINE_NUM;
_ARRAY=new char * [_LINES_QUANTITY];
for(_CURRENT_LINE_NUM=0;_CURRENT_LINE_NUM<_LINES_QUANTITY;_CURRENT_LINE_NUM++) {
_ARRAY[_CURRENT_LINE_NUM]=new char [_MOST_LONG_LINE];
}
int _CURRENT_CHAR_IN_LINE;
int _CURRENT_CHAR_IN_STRING=0;
for(_CURRENT_LINE_NUM=0;_CURRENT_LINE_NUM<_LINES_QUANTITY;_CURRENT_LINE_NUM++) {
for(_CURRENT_CHAR_IN_LINE=0;_CURRENT_CHAR_IN_LINE<_MOST_LONG_LINE;_CURRENT_CHAR_IN_LINE++) {
_ARRAY[_CURRENT_LINE_NUM][_CURRENT_CHAR_IN_LINE]=0x00;
}
}
for(_CURRENT_LINE_NUM=0;_CURRENT_LINE_NUM<_LINES_QUANTITY;_CURRENT_LINE_NUM++) {
for(_CURRENT_CHAR_IN_LINE=0;_CURRENT_CHAR_IN_LINE<_MOST_LONG_LINE;_CURRENT_CHAR_IN_LINE++) {
if(_STRING_TO_SPLIT[_CURRENT_CHAR_IN_STRING]==_SPLITTER) {
_CURRENT_CHAR_IN_STRING++;
break;
}
_ARRAY[_CURRENT_LINE_NUM][_CURRENT_CHAR_IN_LINE]=_STRING_TO_SPLIT[_CURRENT_CHAR_IN_STRING];
_CURRENT_CHAR_IN_STRING++;
}
}
}
Код:
char ** db;
db=split('\n', buffer);
не могу понять почему не работает. если функция возвращает return ** _ARRAY; то вообще ругается invalid conversion from `char' to `char**' компилятор g++ под винду. буду признателен всем за помощь ![]() зы: не строго судите, если не там разместил, имхо, как раз про указатели тема
__________________
Последний раз редактировалось VanHelsing; 07.02.2007 в 12:01. |
|
|
|
|
# 12 |
|
Newbie
Регистрация: 17.06.2002
Сообщения: 30
![]() |
В код сильно не вчитывался, но зачем две звездочки в return ** _ARRAY;?
Указатель дважды разименовывается и получается char. Функция возвращает char** и _ARRAY имет тип char**, вот и возвращаться нужно прямо _ARRAY, т.е. return _ARRAY; и все. Вообще писать в глобальные перемынные, мягко говоря, не хорошо ![]() По поводу самой функции - не знаю ваши конкретные требования к этой функии, но не проще ли собрать указатели на начала строк (т.е. db[0] - будет указывать на первый символ исходной строки, db[1] на символ следующий за первым символом перевода строки) и заменить переводы строки нулями? |
|
|
|
|
# 13 |
|
Junior Member
Регистрация: 18.04.2005
Сообщения: 157
![]() ![]() ![]() ![]() |
видимо надо еще почитать про функции возвращающие значения. я считал, что переменная, в которую возвращается значение (и которую функция вовзращает) должна быть того же типа, что и возвращаемое значение. все заработало, спасибо
по поводу самой функции, честно сказать, я еще не очень догоняю сам С с его "привычками", мне ближе асм, но нынче на нем писать жутко долго. если db[0] это первый символ строки, то как мне обратиться ко второму? db[0][1]? в моем случае мне понятно, что db[0][0] это первый символ первой строки. зы: я на спектруме начинал, а там только асм, и я к нему привык так, что мне даже PCшный асм не очень понятен под винду
__________________
|
|
|
|
|
# 14 |
|
Newbie
Регистрация: 17.06.2002
Сообщения: 30
![]() |
Если db определено как
char **db; то db[0] - указатель на первый симовл первой строки (он имеет тип char*), db[0][0] - сам символ (тип char), и тд - db[0][1] - второй символ первой строки, db[1][0] - первый символ второй строки... Кстати, есть стандартная функция strtok, которая по сути выполняет то, что я описал. а я на спектруме хоть и начинал, но на асм так и не сподвигся
|
|
|
|
|
# 15 | |
|
Junior Member
Регистрация: 18.04.2005
Сообщения: 157
![]() ![]() ![]() ![]() |
Цитата:
![]() мой вопрос исчерпан. спасибо за помощь! (с занесением) и спасибо за совет по поводу глобальных переменных, убрал ее в функцию. я ее изначально туда вынес, так как немного иным путем реализовал вначале, т.е. я потом и работал с массивом _ARRAY
__________________
Последний раз редактировалось VanHelsing; 08.02.2007 в 12:45. |
|
|
|