Ir para conteúdo
Fórum Script Brasil
  • 0

Ponteiro de Funcao por referencia


CarlosJSL

Pergunta

Pessoal , sou meio novo no C++ e me deparei com um problema.  Eu tenho uma funcao:  int seleciona_busca(const char* opcao, int (*ptr) (int,int*,int)) , que vai receber a opção digitada pelo usuario e um ponteiro para funcao por referencia indicando a funcao que o usuario quer que seja executada. 

Main.cpp

int (*ptr) (int,int*,int);
const char* opcao = argv[1];
seleciona_busca(opcao, ptr);


Funcoes.cpp
int busca_sequencial_iterativa(int chave, int* vetor, int tamanho){
            ...
}
int seleciona_busca(const char* opcao, int (*ptr) (int,int*,int)){
         if (strcmp (opcao,"BSI") == 0 ){
             ptr = busca_sequencial_iterativa;
         }
}

Assim esta meu codigo. O problema é que o ptr não esta recebendo essa funcão por referencia não sei o motivo. Aonde é que estou errando?

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Em primeiro lugar você está passando um ponteiro a função, e não uma referencia a ponteiro a função, é algo confuso de entender más vamos pensar em simples ponteiros para entender o problema.

Se em main eu faço a declaração de um ponteiro tal que:
int* p = NULL;

E tenho uma função tipo:
void func( int* ptr ){....}

quando fizer a chamada a essa função dentro de main tipo:
func( p );

O que você acha que está enviando a func? Certamente você acha que está enviando a direção de 'p' mas não é assim, na realidade você esta enviando NULL, ou seja que você está enviando o que 'p' está guardando. Vamos esquecer por um momento funções, vamos pensar só em ponteiros e não vamos sair de main por enquanto...

Se em main eu tenho...
int* p = NULL;

E faço
int* ptr = p;

O que você acha que ptr ta guardando? Fácil! você está fazendo uma copia do valor de p a ptr, é como fazer:
int a = 0;
int b = a;

Entendeu? porque é a mesma coisa o que ta acontecendo quando você envia ptr a seleciona_busca(opcao, ptr);. Pior ainda é que ptr você nem deu um valor, ou seja que ptr é um ponteiro selvagem >_<, pode apontar qualquer coisa. Então resumindo... o que você quer na realidade é manipular o ptr que está dentro de main desde essa função seleciona_busca para que ele aponte a uma outra função, para isso você precisa passar a direção de ptr, e não o valor de ptr.

A forma correta de se fazer isso é trocando a declaração:
int seleciona_busca(const char* opcao, int (*ptr) (int,int*,int)) {...}

por
int seleciona_busca(const char* opcao, int (*&ptr) (int,int*,int)) {...}

Dessa forma sua função receberá o ponteiro por referencia, não o valor do ponteiro. Nessa hora lhe aconselharia usar um typedef para facilitar a coisas.

typedef int ( *ptr2fun ) ( int, int*, int );
int seleciona_busca ( const char* opcao, ptr2fun& ptr )

Ficou bem mais fácil de entender agora não? você está recebendo uma referencia de um ponteiro a função, ou seja, você está recebendo uma referencia de um ponteiro que aponta a função.

Veja o exemplo a continuação:

#include <iostream>
#include <string.h>
using namespace std;

typedef int ( *ptr2fun ) ( int, int*, int ); //typedef é mais facil ;)

int busca_sequencial_iterativa ( int chave, int* vetor, int tamanho ) {
    cout << "Hello =)" << endl;
    return 1;
}

int seleciona_busca ( const char* opcao, ptr2fun& ptr ) { 
    if ( strcmp ( opcao, "BSI" ) == 0 ) {
        ptr = busca_sequencial_iterativa;        
    }
    
    return 0;
}

int main () {
    ptr2fun ptr = NULL; 
    seleciona_busca ( "BSI", ptr );
    
    ptr(0, NULL, 0); //agora sim você recebeu a função busca_sequencial_iterativa, ptr aponta a busca_sequencial_iterativa. ;)

    
    
    
    cin.ignore();
    return 0;
}



Sem typedef:
 

#include <iostream>
#include <string.h>
using namespace std;



int busca_sequencial_iterativa ( int chave, int* vetor, int tamanho ) {
    cout << "Hello =)" << endl;
    return 1;
}

int seleciona_busca ( const char* opcao, int ( *&ptr ) ( int, int*, int ) ) { 
    if ( strcmp ( opcao, "BSI" ) == 0 ) {
        ptr = busca_sequencial_iterativa;        
    }
    
    return 0;
}

int main () {
    int ( *ptr ) ( int, int*, int ) = NULL; 
    seleciona_busca ( "BSI", ptr );
    
    ptr(0, NULL, 0); //agora sim você recebeu a função busca_sequencial_iterativa, ptr aponta a busca_sequencial_iterativa. ;)

    
    
    
    cin.ignore();
    return 0;
}

 

Falou?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...