Использование двойного указателя на функцию.
От: Zh0rzh  
Дата: 07.10.04 22:55
Оценка:
#include "stdafx.h"
#include <iostream>

int summ(int a, int b);
int razn(int a, int b);
int mult(int a, int b);

int main()
{
    
    int (**func_p)(int a, int b);
            
    func_p[0] = &summ;
    func_p[1] = &razn;
    func_p[2] = &mult;

    std::cout << func_p[0](6, 5) << "\n";
    std::cout << func_p[1](6, 5) << "\n";
    std::cout << func_p[2](6, 5) << "\n";

    
    return 0;
}

int summ(int a, int b){    return a + b;}
int razn(int a, int b){    return a-b;}
int mult(int a, int b){    return a*b;}


После успешной компиляции и линкования, дебагер выдает ошибку на этот код The variable 'func_p' is being used without being defined.

В чем проблема?
Возможно я сам неправильно подхожу к делу?
Re: Использование двойного указателя на функцию.
От: Павел Кузнецов  
Дата: 07.10.04 23:23
Оценка: 1 (1)
Zh0rzh:

>
>     int (**func_p)(int a, int b);
>             
>     func_p[0] = &summ;
>     func_p[1] = &razn;
>     func_p[2] = &mult;
>

>
> дебагер выдает ошибку на этот код The variable 'func_p' is being used without being defined.
>
> В чем проблема?

В том, что для массива указателей на функции не выделена память.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Использование двойного указателя на функцию.
От: Zh0rzh  
Дата: 07.10.04 23:42
Оценка:
Так а почему тогда для обычного указателя не надо выделять память.
Рабочий код.
int (*func)(int, int);
func = &summ;
Re[3]: Использование двойного указателя на функцию.
От: Павел Кузнецов  
Дата: 07.10.04 23:52
Оценка:
Zh0rzh:

> Так а почему тогда для обычного указателя не надо выделять память.

> Рабочий код.
>
> int (*func)(int, int);
> func = &summ;
>


Потому что она уже выделена компилятором. В этом смысле указатель аналогичен, скажем, целому типу:
int i;
i = 10; // все хорошо, память выделять не надо


int* p;
p[0] = 10; // все плохо, запись в не выделенную память


Возможно, всё станет еще чуть-чуть яснее, если для указателя на функцию завести typedef:
typedef int (*Func)(int, int);


Func f;
f = &summ; // все хорошо


Func* f;
f[0] = &summ; // все плохо, индексирование неинициализированного указателя
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Использование двойного указателя на функцию.
От: ScorpZ Украина  
Дата: 12.10.04 15:17
Оценка:
Здравствуйте, Zh0rzh, Вы писали:

Z>
Z>#include "stdafx.h"
Z>#include <iostream>

Z>int summ(int a, int b);
Z>int razn(int a, int b);
Z>int mult(int a, int b);

Z>int main()
Z>{
    
Z>    int (**func_p)(int a, int b);
            
Z>    func_p[0] = &summ;
Z>    func_p[1] = &razn;
Z>    func_p[2] = &mult;

Z>    std::cout << func_p[0](6, 5) << "\n";
Z>    std::cout << func_p[1](6, 5) << "\n";
Z>    std::cout << func_p[2](6, 5) << "\n";

    
Z>    return 0;
Z>}

Z>int summ(int a, int b){    return a + b;}
Z>int razn(int a, int b){    return a-b;}
Z>int mult(int a, int b){    return a*b;}
Z>


Z>После успешной компиляции и линкования, дебагер выдает ошибку на этот код The variable 'func_p' is being used without being defined.


Z>В чем проблема?

Z>Возможно я сам неправильно подхожу к делу?

Это лечится так —
............................
int summ(int a, int b);
int razn(int a, int b);
int mult(int a, int b);

// объявляем тип — указатель на ф-цию
typedef int (* point)(int, int);

int main()
{

int (**func_p)(int a, int b);
func_p = new point[3]; // Выделяем память для 3х указателей ны ф-цию , func — указатель на начало этого
// массива

// тиеперь можно инициализировать
func_p[0] = &summ;
func_p[1] = &razn;
func_p[2] = &mult;

std::cout << func_p[0](6, 5) << "\n";
std::cout << func_p[1](6, 5) << "\n";
std::cout << func_p[2](6, 5) << "\n";


return 0;
}

int summ(int a, int b){ return a + b;}
int razn(int a, int b){ return a-b;}
int mult(int a, int b){ return a*b;}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.