Impossible d'arriver à fonctionner via le pointeur de la fonction.
J'écris un programme qui agit sur la base de la contribution (calculatrice d'indice de masse corporelle) pour les normes américaines et de l'UE.
Mon point est de calculer BMIndex en utilisant une fonction "Calcmethod", mais essayant d'attribuer un pointeur d'autre fonction à celui-ci, conduit à une erreur "L'objet appelé objet n'est pas un pointeur de fonction ou de fonction". Toute aide est appréciée. P> La ligne commentée provoque une erreur: appelé objet n'est pas un point de fonctionnement ou de fonction p> Attendez-vous de ne pas jeter une erreur et travailler comme prévu. p> p>
3 Réponses :
Le problème principal est que vous déclarez différentes variables de CalcMethod CODE> dans des blocs imbriqués et en changeant le mauvais. En outre, la variable externe CALCMETHOD code> que vous essayez d'appeler n'est même pas un pointeur de fonction:
float (*calcMethod)(float, float) = NULL; // default to not set
// ...
if (calcMethod == NULL)
{
/* ERROR: calcMethod hasn't been set. */
/* DO SOMETHING! */
}
else
{
BMIndex = (*calcMethod)(massRow , heightColumn);
}
Le problème est que vous déclarez Le correctif est de le déclarer comme une fonction Pointeur en premier lieu: p> puis lorsque vous décidez lequel utiliser, ne redéclairez pas, attribuez-le simplement: P> float * calcmethod; code> - un pointeur sur un flotteur, pas un pointeur sur une fonction. Vous redéclaré ensuite comme un pointeur de fonction dans vos blocs intérieurs, mais qui est juste dans ces blocs - où vous essayez de l'appeler, vous essayez d'appeler le pointeur de flotteur.
BMIndex = calcMethod(massRow , heightColumn);
Merci, ça aide beaucoup.
Vous avez trois Si vous définissez Voici les trois modifications: P> CALCMETHOD CODE> VARIABLES DANS LA FONCTION
MAIN () CODE>. Le Thsi premier est un pointeur à une variable flottante (qui n'est évidemment pas un pointeur de fonction). Les deux autres sont des pointeurs de la fonction, mais ils n'existent qu'à l'intérieur de leur bloc de code.
Calcmethod code> une seule fois en tant que pointeur de la fonction, sans perte d'autres bugs dans votre code, qui fonctionnera. p>
int main()
{
float BMIndex , inputMass , inputHeight;
float heightColumn, massRow;
float (*calcMethod)(float , float); // ****** CHANGE #1 HERE
int Mod = 0;
int countRow , countColumn;
char unitStandard[2] , metricUnitH[2] , metricUnitM[2];
printf("Your measure units? EU (kg, m) or US (lb, in) \n");
gets(unitStandard);
if(strcmp(unitStandard, "EU") == 0)
{
Mod = 1;
strcpy(metricUnitH, "me");
strcpy(metricUnitM, "kg");
calcMethod = &calcEU; // ****** CHANGE #2 HERE
}
else if (strcmp(unitStandard, "US") == 0)
{
Mod = -1;
strcpy(metricUnitH, "in");
strcpy(metricUnitM, "lb");
calcMethod = calcUS; // ****** CHANGE #3 HERE
}
else
{
printf("Wrong Input");
exit(-1);
}
printf("Introduce your body mass:\n");
scanf("%f", &inputMass);
printf("Introduce your height:\n");
scanf("%f", &inputHeight);
printf("\n");
for(countRow = 0; countRow <= 5; countRow++)
{
for(countColumn = 0; countColumn <= 5; countColumn++)
{
heightColumn = inputHeight - 0.1 * (3 - countRow);
massRow = inputMass - 1 * (3 - countColumn);
if(countRow == 0 && countColumn == 0) printf("H / M|");
if(countRow == 0 && countColumn != 0) printf("%.0f%s |", massRow , metricUnitM);
if(countColumn == 0 && countRow != 0) printf("%.1f%s |", heightColumn , metricUnitH);
if(countRow != 0 && countColumn !=0)
{
BMIndex = (*calcMethod)(massRow , heightColumn);
printf("%.2f |", BMIndex);
}
}
printf("\n");
}
return 0;
}
Bienvenue dans le débordement de pile. S'il vous plaît Modifier Votre question pour inclure l'intégralité du message d'erreur. Indiquez également quelle ligne provoque l'erreur.
Enfin, faites votre exemple de code afin que nous puissions la compiler et obtenir la même erreur. En particulier, ajoutez
principal () code> et toutes les déclarations de variable nécessaires.
Lire ERICLIPPERT.COM/2014/03/05/Commander- à déboguer-petits programmes pour des conseils sur le débogage de votre code. En particulier, vérifiez la valeur de
mod code> pour être sûr qu'il est en fait de -1 ou 1.
flotteur (* calcmethod) (flotteur, flotteur) = & calceu; } code> La variable cesse d'exister après
} code>.
Vous déclarez et initialisez deux variables code> Calcmethod COD> à l'intérieur de deux
si code> blocs. Aucune des deux déclarations n'est dans la portée lorsque vous l'appelez dans le code que vous avez montré. Si vous déclarez une seule variable CalcMethod Code> CalcMethod CODE> (au-dessus du premier
si code> instruction) et assignez à la valeur conçue dans chaque
si code> instruction, il devrait alors fonctionner .
@ Code-apprenti que j'ai posté le code complet.
@ Kamil Cuk Je viens de tenter dans d'autres fichiers que vous avez dit et de ne pas être reconnu à l'extérieur de l'instruction.
@Ian Abbott pourriez-vous aider à définir le pointeur de la fonction "Calcmethod"?
Sans rapport avec votre problème principal, mais: Si vous souhaitez une réponse de 2 lettres de l'utilisateur, do pas i> déclarent un tableau de taille 2 pour la maintenir, et encore plus surtout, jamais utiliser
obtient () code> pour le lire! (1) La taille nécessaire pour maintenir une chaîne de longueur 2 est 3. (2) à l'aide d'une matrice suffisante à peine suffisamment grosse pour maintenir la chaîne attendue est une erreur d'erreur et une inutile, car elle n'empêche pas l'utilisateur d'essayer de taper quelque chose de plus long. (3) La fonction
code> est pathologiquement dangereuse et a été supprimée de la norme de langage C et ne doit jamais être utilisée.
Float * Calcmethod; code> Ce n'est pas un pointeur de fonction.