imho.ws |
|
18.05.2006, 01:41 | # 1 |
Member
Регистрация: 26.09.2005
Адрес: Питер
Сообщения: 336
|
Указатель на функцию и его использование в С++
Есть функция1 и функция2. Предлагается создать указатель на функцию1, что из функции2 можно было бы вызывать ее(фунцию1) обращаясь к элементу массива(для разных параметров). Язык: С/С++.
Спасибо. |
18.05.2006, 11:07 | # 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)); } }
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы! |
18.05.2006, 11:52 | # 5 | |
Junior Member
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180
|
Цитата:
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы! |
|
18.05.2006, 15:44 | # 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]; }
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы! |
26.05.2006, 01:14 | # 10 |
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
|
В MFC по другому
http://rsdn.ru/article/wtl/wtl-1.xml#ERPAE
__________________
Best Regards |
07.02.2007, 10:58 | # 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 в 11:01. |
07.02.2007, 16:24 | # 12 |
Newbie
Регистрация: 17.06.2002
Сообщения: 30
|
В код сильно не вчитывался, но зачем две звездочки в return ** _ARRAY;?
Указатель дважды разименовывается и получается char. Функция возвращает char** и _ARRAY имет тип char**, вот и возвращаться нужно прямо _ARRAY, т.е. return _ARRAY; и все. Вообще писать в глобальные перемынные, мягко говоря, не хорошо По поводу самой функции - не знаю ваши конкретные требования к этой функии, но не проще ли собрать указатели на начала строк (т.е. db[0] - будет указывать на первый символ исходной строки, db[1] на символ следующий за первым символом перевода строки) и заменить переводы строки нулями? |
07.02.2007, 17:27 | # 13 |
Junior Member
Регистрация: 18.04.2005
Сообщения: 157
|
видимо надо еще почитать про функции возвращающие значения. я считал, что переменная, в которую возвращается значение (и которую функция вовзращает) должна быть того же типа, что и возвращаемое значение. все заработало, спасибо
по поводу самой функции, честно сказать, я еще не очень догоняю сам С с его "привычками", мне ближе асм, но нынче на нем писать жутко долго. если db[0] это первый символ строки, то как мне обратиться ко второму? db[0][1]? в моем случае мне понятно, что db[0][0] это первый символ первой строки. зы: я на спектруме начинал, а там только асм, и я к нему привык так, что мне даже PCшный асм не очень понятен под винду
__________________
|
08.02.2007, 10:47 | # 14 |
Newbie
Регистрация: 17.06.2002
Сообщения: 30
|
Если db определено как
char **db; то db[0] - указатель на первый симовл первой строки (он имеет тип char*), db[0][0] - сам символ (тип char), и тд - db[0][1] - второй символ первой строки, db[1][0] - первый символ второй строки... Кстати, есть стандартная функция strtok, которая по сути выполняет то, что я описал. а я на спектруме хоть и начинал, но на асм так и не сподвигся |
08.02.2007, 11:35 | # 15 | |
Junior Member
Регистрация: 18.04.2005
Сообщения: 157
|
Цитата:
мой вопрос исчерпан. спасибо за помощь! (с занесением) и спасибо за совет по поводу глобальных переменных, убрал ее в функцию. я ее изначально туда вынес, так как немного иным путем реализовал вначале, т.е. я потом и работал с массивом _ARRAY
__________________
Последний раз редактировалось VanHelsing; 08.02.2007 в 11:45. |
|