PDA

Visualizza la versione completa : [C++] Passare funzione come parametro di input


gaten
30-06-2011, 22:40
Salve ragazzi, ho il seguente codice:



/* sommo le chiavi */
int sumKey(tree *root, int sum){
if( root == NULL ){
return sum;
} else {
sumKey(root->left);
sum=sum+root->info;
sumKey(root->right);
sum=sum+root->info;
}
}


/* foo */
int Sum_After_Level_k(tree *root, int levels, int k, int sum){
if ( levels < k ){
Sum_After_Level_k(root->left, levels+1, k, sum);
Sum_After_Level_k(root->right, levels+1, k, sum);
} else {
SumKey(root, sum);
Sum_After_Level_k=SumKey(root, sum);
}
}


Non riesco a passare la funzione "SumKey" a "Sum_After_Level_k".

Il compilatore mi dà questi errori:


Compiling: C:\Users\Gaten\Desktop\Untitled1.cpp
C:\Users\Gaten\Desktop\Untitled1.cpp: In function 'int sumKey(tree*, int)':
C:\Users\Gaten\Desktop\Untitled1.cpp:92: error: too few arguments to function 'int sumKey(tree*, int)'
C:\Users\Gaten\Desktop\Untitled1.cpp:96: error: at this point in file
C:\Users\Gaten\Desktop\Untitled1.cpp:92: error: too few arguments to function 'int sumKey(tree*, int)'
C:\Users\Gaten\Desktop\Untitled1.cpp:98: error: at this point in file
C:\Users\Gaten\Desktop\Untitled1.cpp: In function 'int Sum_After_Level_k(tree*, int, int, int)':
C:\Users\Gaten\Desktop\Untitled1.cpp:110: error: 'SumKey' was not declared in this scope
Process terminated with status 1 (0 minutes, 0 seconds)
5 errors, 0 warnings


Come faccio a passare la function "SumKey" come parametro di input alla function "Sum_After_Level_k"???

Grazie anticipatamente.

oregon
30-06-2011, 22:49
Il problema non è chiaro ...

gaten
30-06-2011, 22:56
Ho provato a risolvere così:

Ho creato un puntatore a funzione:


typedef int (*treeInInt) (tree, int);


Ecco le functions:


/* sommo le chiavi */
int sumKey(tree *root, int sum){
if( root == NULL ){
return sum;
} else {
sumKey(root->left);
sum=sum+root->info;
sumKey(root->right);
sum=sum+root->info;
}
}


/* sumKey */
int Sum_After_Level_k(tree *root, int levels, int k, int sum, treeInInt sumKey){
if ( levels < k ){
Sum_After_Level_k(root->left, levels+1, k, sum, sumKey);
Sum_After_Level_k(root->right, levels+1, k, sum, sumKey);
} else {
sumKey(root, sum);
Sum_After_Level_k=sumKey(root, sum);
}
}


Questi sono i prototipi delle funzioni:


int sumKey(tree *root, int sum);
int Sum_After_Level_k(tree *root, int levels, int k, int sum, treeInInt sumKey);


Ma ho questi errori dal compilatore, che non riesco a risolvere:


Compiling: C:\Users\Gaten\Desktop\Untitled1.cpp
C:\Users\Gaten\Desktop\Untitled1.cpp: In function 'int main()':
C:\Users\Gaten\Desktop\Untitled1.cpp:47: error: invalid conversion from 'int (*)(tree*, int)' to 'int'
C:\Users\Gaten\Desktop\Untitled1.cpp:20: error: too few arguments to function 'int Sum_After_Level_k(tree*, int, int, int, int (*)(tree, int))'
C:\Users\Gaten\Desktop\Untitled1.cpp:47: error: at this point in file
C:\Users\Gaten\Desktop\Untitled1.cpp: In function 'int sumKey(tree*, int)':
C:\Users\Gaten\Desktop\Untitled1.cpp:96: error: too few arguments to function 'int sumKey(tree*, int)'
C:\Users\Gaten\Desktop\Untitled1.cpp:100: error: at this point in file
C:\Users\Gaten\Desktop\Untitled1.cpp:96: error: too few arguments to function 'int sumKey(tree*, int)'
C:\Users\Gaten\Desktop\Untitled1.cpp:102: error: at this point in file
C:\Users\Gaten\Desktop\Untitled1.cpp: In function 'int Sum_After_Level_k(tree*, int, int, int, int (*)(tree, int))':
C:\Users\Gaten\Desktop\Untitled1.cpp:114: error: conversion from 'tree*' to non-scalar type 'tree' requested
C:\Users\Gaten\Desktop\Untitled1.cpp:115: error: conversion from 'tree*' to non-scalar type 'tree' requested
Process terminated with status 1 (0 minutes, 0 seconds)
9 errors, 0 warnings

oregon
30-06-2011, 23:09
Mica ho ancora capito cosa vuoi fare ...

Vuoi passare un "puntatore alla funzione sumKey" come parametro della Sum_After_Level_k ?

E perché?

MItaly
30-06-2011, 23:16
In ogni caso, il typedef è sbagliato: hai scritto tree invece di tree *


typedef int (*treeInInt) (tree *, int);

oregon
30-06-2011, 23:28
Sì, ma poi con questo

Sum_After_Level_k=sumKey(root, sum);

cosa si vuole ottenere?

gaten
01-07-2011, 00:31
oregon, devo praticamente sommare gli elementi dell'albero a partire dal livello dopo k, esempio se k=2, devo sommare gli elementi che stanno dopo il livello 2.
La function sumKey, mi visita l'albero in symmetric order, e mi somma gli elementi.
Sum_After_Level_k scorre l'albero fino ad arrivare a k, per poi richiamare sumKey.
Il mio problema stà nel passare sumKey a Sum_After_Level_k.



Sum_After_Level_k=sumKey(root, sum);


Con questo voglio ottenere la somma degli elementi dopo il livello k.

Laikius91
01-07-2011, 09:26
Scusami ma gli errori che da il compilatore sono abbastanza chiari :confused:
Mi riferisco al codice del primo messaggio:

qui dichiari:



int sumKey(tree *root, int sum){
//ecc..
}


ma poi nella funzione stessa fai:



..
if( root == NULL ){
return sum;
} else {
sumKey(root->left);
sum=sum+root->info;
sumKey(root->right);
sum=sum+root->info;
}


Non ti sembra che manchi qualche argomento nelle chiamate di sumKey?

E infatti:



C:\Users\Gaten\Desktop\Untitled1.cpp:92: error: too few arguments to function 'int sumKey(tree*, int)'


L'altro errore è qua:


else {
SumKey(root, sum);
Sum_After_Level_k=SumKey(root, sum);
}


Usi "SumKey" mentre la funzione si chiame "sumKey"... La maiuscola!
Chiaramente il compilatore non trovava nessuna funzione chiamata "SumKey" e infatti:



C:\Users\Gaten\Desktop\Untitled1.cpp error: 'SumKey' was not declared in this scope

Loading