IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

problème au niveau de fonction


Sujet :

C

  1. #1
    Membre du Club Avatar de marguerite99
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 52
    Points
    52
    Par défaut problème au niveau de fonction
    Salut à toutes et à tous
    mon problème est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
     
    void main() {
    	char* inverse(char s[30]) {
    		char ch[30];
    		int i;
    		for(i=0; i<=strlen(s)-1; i++)
    			ch[i] = ch[strlen(s)-i-1];
    		return ch;
    	}
    	char s[30];
    	printf("Entrer un entier entre 0 et 99999 : ");
    	gets(s);
    	if(!(strcmp(inverse(s),s)))
    		puts("palindrome");
    	else
    		puts("n'est pas palindrome");
    	getch();
    }
    quand j'exécute ce petit bout de code, il m'affiche comme erreur :

    error C2601: 'inverse' : définitions de fonctions locales non conformes


    Merci de m'aider

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    1) Penser à utiliser l'icone CODE (le #) pour insérer du code.

    2) Bien mettre des tabulations afin de mieux lire le code des prototypes de fonctions:

    3) Ne pas déclarer de fonctions à l'intérieur de fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
     
     
    char* inverse(char s[30])
    {
      char ch[30];
      int i;
      for(i=0; i<=strlen(s)-1; i++)
      ch[i] = ch[strlen(s)-i-1];
      return ch;
    }
     
    void main(void)
    {
      char s[30];
      printf("Entrer un entier entre 0 et 99999 : ");
      gets(s);
      if(!(strcmp(inverse(s),s)))
      puts("palindrome");
      else
      puts("n'est pas palindrome");
      getch();
    }
    4) Ce warning n'est pas un warning mais bel est bien une erreur dans votre cas:
    return ch;
    main.c|13|warning: function returns address of local variable|
    Vous déclarez une variable sur la pile... et en suite vous la mettez à disposition.
    Je vous encourage à déclarer ch en dehors de la fonction.
    En variable globale (avec un static devant) ce serait bien.

    5) Ne déclarez pas de variables avec une ou 2 lettres, la lisibilité n'est pas une option.

    Bon courage et week-end.
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par marguerite99 Voir le message
    quand j'exécute ce petit bout de code, il m'affiche comme erreur :

    error C2601: 'inverse' : définitions de fonctions locales non conformes
    Le message d'erreur me semble pourtant assez explicite.

    En C, il n'existe pas de fonction locale. On ne peut donc pas définir de fonction à l'intérieur d'une autre fonction, il faut donc sortir la définition de la fonction inverse du main, ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
     
    char* inverse(char s[30]) {
    	char ch[30];
    	int i;
    	for(i=0; i<=strlen(s)-1; i++)
    		ch[i] = ch[strlen(s)-i-1];
    	return ch;
    }
     
    void main() {
    	char s[30];
    	printf("Entrer un entier entre 0 et 99999 : ");
    	gets(s);
    	if(!(strcmp(inverse(s),s)))
    		puts("palindrome");
    	else
    		puts("n'est pas palindrome");
    	getch();
    }
    Ceci, il existe d'autres problèmes dans ce code :
    • La fonction gets() ne vérifiant pas la taille de la saisie peut conduire à des débordement. IL ne faut pas l'utiliser et lui préférer fgets().
    • Dans la fonction inverse, tu retournes l'adresse d'une variable locale (ch), ce qui n'est pas correcte.
    • conio.h et getch() ne sont pas standard.
    • La norme prévoit deux formes pour main : int main(void) et int main(int argc, char* argv[]), void min() n'est pas une forme normalisée et n'est donc pas portable.
    • La fonction inverse est probablement fausse, puisque tu copies un élément de ch non initialisé dans ch, ne serait-ce pas plutôt ch[i] = s[strlen(s)-i-1];
    • En outre, d'un point de vue des performance, tu ne devrait appeler strlen() qu'une seule et unique fois et conserver le résultat.

  4. #4
    Membre du Club Avatar de marguerite99
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 52
    Points
    52
    Par défaut
    Merci Bayard

  5. #5
    Membre du Club Avatar de marguerite99
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 52
    Points
    52
    Par défaut
    Merci gl

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème au niveau de la fonction remove
    Par DesLife dans le forum C
    Réponses: 8
    Dernier message: 16/06/2011, 17h35
  2. problème au niveau de l'appel d'une fonction
    Par kawther dans le forum MATLAB
    Réponses: 2
    Dernier message: 16/06/2009, 20h15
  3. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  4. Réponses: 4
    Dernier message: 01/07/2004, 11h53
  5. Réponses: 4
    Dernier message: 19/04/2004, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo