web-dev-qa-db-fra.com

Identifiant introuvable erreur lors de l'appel d'une fonction

J'ai un programme ici où j'inverse le cas d'une chaîne entrée. C'est le code dans mon fichier .cpp et j'utilise Visual Studio C++ IDE. Je ne suis pas sûr de ce dont j'ai besoin dans un fichier d'en-tête ou si j'en ai besoin d'un pour que cela fonctionne.

Erreur avec ma fonction d'appel swapCase. Main ne voit pas swapCase pour une raison inconnue.

#include <cctype>
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    char name[30];
    cout<<"Enter a name: ";
    cin.getline(name, 30);
    swapCase(name);
    cout<<"Changed case is: "<< name <<endl;
    _getch();
    return 0;
}

void swapCase (char* name)
{
    for(int i=0;name[i];i++)
    {
        if ( name[i] >= 'A' && name[i] <= 'Z' )
            name[i] += 32; //changing upper to lower
        else if( name[i] >= 'a' && name[i] <= 'z')
            name[i] -= 32; //changing lower to upper
    }
}

Toute autre astuce pour la syntaxe ou la sémantique est appréciée. 

44
KRB

Ajoutez cette ligne avant la fonction principale:

void swapCase (char* name);

int main()
{
   ...
   swapCase(name);    // swapCase prototype should be known at this point
   ...
}

Cela s'appelle une déclaration aval: le compilateur doit connaître le prototype de la fonction lorsque l'appel de la fonction est compilé.

72
Alex F

Contrairement aux autres langages auxquels vous pouvez être habitué, tout en C++ doit être déclaré avant de pouvoir être utilisé. Le compilateur lit votre fichier source de haut en bas. Ainsi, lorsqu'il appelle swapCase, il ne sait pas ce que c'est et vous obtenez une erreur. Vous pouvez déclarer votre fonction en avant de main avec une ligne comme celle-ci:

void swapCase(char *name);

ou vous pouvez simplement déplacer l'intégralité de cette fonction en avant du fichier principal. Ne vous inquiétez pas de la fonction (principale) apparemment la plus importante au bas du fichier. C'est très courant en C ou C++ de faire cela.

16
Michael Kristofik

Au moment où le compilateur rencontre l'appel de swapCase dans main (), il ne connaît pas la fonction swapCase et signale donc une erreur. Vous pouvez déplacer la definition de swapCase au-dessus de main ou declare swap au-dessus de main:

void swapCase(char* name);

De plus, la valeur 32 dans swapCase incite le lecteur à faire une pause et à s’émerveiller. Le commentaire aide! Dans ce contexte, il serait plus clair d'écrire

if ('A' <= name[i] && name[i] <= 'Z')
    name[i] += 'a' - 'A';
else if ('a' <= name[i] && name[i] <= 'z')
    name[i] += 'A' - 'a';

La construction de mes if-tests est une question de style personnel. Les vôtres étaient bien. L'essentiel est de modifier le nom [i] - utiliser la différence entre 'a' et 'A' rend plus évident ce qui se passe, et personne ne doit se demander si le '32' est réellement correct.

Bonne chance d'apprendre!

8
Kevin Hopps

Vous devez définir void swapCase avant la définition principale.

0
v01d