Local function definitions are illegal

Résolu
Bonjour,

J'essaie d'écrire une petite fonction pour afficher le contenu d'un registre et pour cela j'ai écrit ce code :

#include <stdio.h>
#include <stdlib.h>

void main()
{
  int ShowReg() // Déclarer la fonction ShowReg
  {
	  int registre = 0;
    scanf("%d", &registre);
	  printf("Contenu du registre %d", registre);
      
    return registre;
  }
}


Au moment de la compilation, j'ai eu cette erreur :
Exercice1.cpp(7) : error C2601: 'ShowReg' : local function definitions are illegal

Quelqu'un pourrait m'expliquer comment la corriger ?
Merci d'avance !

1 réponse

  1. Bonjour

    Comme l'indique le message, tu essayes de déclarer une fonction (ShowReg) à l'intérieur d'une autre (main).
    C'est interdit en C.
    Il suffit de la déclarer à l'extérieur de main, c'est aussi simple que ça.
    1. Merci beaucoup pour la réponse !
      J'ai déclaré la fonction à l'extérieur comme indiqué.
    2. Contributeur
      Salut BV91,

      Outre l'excellent réponse de le père, voilà d'autre commentaires utiles :

      - main devrait être déclarée "int main()" et retourner 0 en fin d'exécution avec un "return 0;" avant ta dernière accolade, indiquant à l'environnement que ton programme s'est terminé sans erreurs

      - ton erreur indique que ton fichier s'appelle "Exercice1.cpp" - si tu codes en C, il faut que ton projet soit compilé par un compilateur C, et non un compilateur C++

      - tu ne fais pas de contrôle d'erreur sur le résultat de scanf, mais je suppose que tu sais cela

      Dal
    3. J'ai corrigé la déclaration de la fonction "main", merci !

      Pour la compilation, j'ai remplacé le nom du projet "Exercice.cpp" par "Exercice.c". Est-ce suffisant ?

      Quant à scanf, j'ai écrit une autre fonction qui contrôle la saisie de l'utilisateur et vérifie que les valeurs entrées sont bien des chiffres (en utilisant "isdigit").

      P.S. J'utilise Visual C++ 6.0 comme IDE.
    4. Contributeur
      Je n'utilise pas Visual Studio, mais tu trouveras des indications là :

      https://stackoverflow.com/questions/3327199/how-can-i-use-visual-studio-2010-for-c-development

      Pour scanf, ma compréhension est que tu simules l'obtention d'un chiffre provenant d'un registre (cf. ta question précédente) dont tu connaitras a priori la taille dans l'implémentation réelle. Donc en sécuriser l'usage a un intérêt limité pour obtenir des chiffres, mais vois quand même https://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1043372399&id=1043284385 si tu veux comprendre pourquoi il est préférable de faire autrement si c'était une véritable saisie que tu attendais dans ton application.

      Dal
    5. J'ouvre une petite parenthèse
      Je vois sur un autre topic que ce code est destiné à tourner sur un microcontrôleur.
      Si c'est bien le cas, alors void main (void) sera certainement la bonne déclaration dans la version finale, et il ne devra pas y avoir de return dans le main car il n'y aura pas d'OS à qui rendre la main en fin d'exécution.