-1
votes

Pourquoi le pointeur de fonction n'est-il pas vu comme point de fonctionner?

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. xxx

La ligne commentée provoque une erreur: appelé objet n'est pas un point de fonctionnement ou de fonction

Attendez-vous de ne pas jeter une erreur et travailler comme prévu.


10 commentaires

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 () 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 pour être sûr qu'il est en fait de -1 ou 1.


flotteur (* calcmethod) (flotteur, flotteur) = & calceu; } La variable cesse d'exister après } .


Vous déclarez et initialisez deux variables Calcmethod à l'intérieur de deux si 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 CalcMethod (au-dessus du premier si instruction) et assignez à la valeur conçue dans chaque si 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 déclarent un tableau de taille 2 pour la maintenir, et encore plus surtout, jamais utiliser obtient () 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 est pathologiquement dangereuse et a été supprimée de la norme de langage C et ne doit jamais être utilisée.


Float * Calcmethod; Ce n'est pas un pointeur de fonction.


3 Réponses :


0
votes

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);
    }


0 commentaires

2
votes

Le problème est que vous déclarez 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.

Le correctif est de le déclarer comme une fonction Pointeur en premier lieu: p> xxx pré>

puis lorsque vous décidez lequel utiliser, ne redéclairez pas, attribuez-le simplement: P>

BMIndex = calcMethod(massRow , heightColumn);


1 commentaires

Merci, ça aide beaucoup.



1
votes

Vous avez trois 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.

Si vous définissez Calcmethod code> une seule fois en tant que pointeur de la fonction, sans perte d'autres bugs dans votre code, qui fonctionnera. p>

Voici les trois modifications: 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;
}


0 commentaires