Erreur code? (C)
Résolu
BreezyChaos
-
BreezyChaos -
BreezyChaos -
Bonjour,
Je suis sur un exercice de France IOI (énoncé: http://www.france-ioi.org/algo/task.php?idChapter=494&idTask=0&sTab=task&iOrder=12) et j'ai donc tapé mon programme que voici, et qui semble avoir une erreur.
_____________________________________________________________________
_____________________________________________________________________
Lors de la compilation et l'exécution j'ai le warning et le message d'erreur suivant:
"In function 'PosAlpha'::46: warning: control reaches end of non-void function
Test 1 Erreur
Votre programme a échoué à la suite d'un accès mémoire en dehors des zones réservées, ou d'un dépassement de la limite de mémoire.
Votre programme s'est terminé à la suite d'une erreur. Cela peut venir d'une des raisons suivantes :
Votre programme a dépassé la limite de mémoire autorisée pour ce problème, que ce soit sous la forme de variables statiques, d'allocations dynamiques, ou bien de la pile.
Votre programme a tenté de faire un accès mémoire en dehors des zones allouées."
Le warning si j'ai bien compris, laisse entendre que la fin de ma fonction PositionAlphabet a été atteinte sans return, ce qui ne devrait pas arriver. Après quelques tests, le message d'erreur suivant a l'air de découler de ce meme warning. Je pense que l'un des for a été parcouru sans rencontrer de return, ce qui a du faire sortir l'exécution du plus grand if de la fonction et l'amener directement à la fin. Ca n'était pas censé arriver non plus. J'ai essayé de placer le return -1 hors du else pour m'assurer d'avoir une valeur de retour mais j'obtiens que "La sortie du programme contient un caractère UTF8 invalide."
Quelqu'un saurait m'aiguiller s'il vous plait?
Je suis sur un exercice de France IOI (énoncé: http://www.france-ioi.org/algo/task.php?idChapter=494&idTask=0&sTab=task&iOrder=12) et j'ai donc tapé mon programme que voici, et qui semble avoir une erreur.
_____________________________________________________________________
#include <stdio.h> #include <ctype.h> void Decrypte(char grille[], char texte[], int longueur); int PositionAlphabet(char lettre); int main() { char grille[27], texte[201]; int longueur; scanf("%26s", grille); scanf("%d", &longueur); scanf("%200s", texte); Decrypte(grille, texte, longueur); printf("%s", texte); return 0; } void Decrypte(char grille[], char texte[], int longueur) { int position, posGrille; for (position = 0; position < longueur; position++) { posGrille = PositionAlphabet(texte[position]); if (isupper(texte[position]) != 0) texte[position] = grille[posGrille] + 'A' - 'a'; else if (islower(texte[position]) != 0) texte[position] = grille[posGrille]; } } int PositionAlphabet(char lettre) { int position; if (islower(lettre) != 0) for (position = 0; position < 26; position++) if (lettre == 'a' + position) return position; else if (isupper(lettre) != 0) for (position = 0; position < 26; position++) if (lettre == 'A' + position) return position; else return -1; }
_____________________________________________________________________
Lors de la compilation et l'exécution j'ai le warning et le message d'erreur suivant:
"In function 'PosAlpha'::46: warning: control reaches end of non-void function
Test 1 Erreur
Votre programme a échoué à la suite d'un accès mémoire en dehors des zones réservées, ou d'un dépassement de la limite de mémoire.
Votre programme s'est terminé à la suite d'une erreur. Cela peut venir d'une des raisons suivantes :
Votre programme a dépassé la limite de mémoire autorisée pour ce problème, que ce soit sous la forme de variables statiques, d'allocations dynamiques, ou bien de la pile.
Votre programme a tenté de faire un accès mémoire en dehors des zones allouées."
Le warning si j'ai bien compris, laisse entendre que la fin de ma fonction PositionAlphabet a été atteinte sans return, ce qui ne devrait pas arriver. Après quelques tests, le message d'erreur suivant a l'air de découler de ce meme warning. Je pense que l'un des for a été parcouru sans rencontrer de return, ce qui a du faire sortir l'exécution du plus grand if de la fonction et l'amener directement à la fin. Ca n'était pas censé arriver non plus. J'ai essayé de placer le return -1 hors du else pour m'assurer d'avoir une valeur de retour mais j'obtiens que "La sortie du programme contient un caractère UTF8 invalide."
Quelqu'un saurait m'aiguiller s'il vous plait?
A voir également:
- Erreur code? (C)
- Code ascii - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code blocks - Télécharger - Langages
4 réponses
Bonjour,
En C, le fait d'utiliser ou non les accolades pour identifier les blocs est optionnel si il n'y a qu'une seule instruction dans le bloc. Cependant, ils permettent aussi de définir les points d'applications des else. Ainsi dans ta fonction PositionAlphabet, ton
De la même façon, ton dernier else ne s'applique sans doutes pas sur le if auquel tu t'attendais.
Essayes de définir proprement tes blocs avec des accolades et normalement ça devrait marcher.
En C, le fait d'utiliser ou non les accolades pour identifier les blocs est optionnel si il n'y a qu'une seule instruction dans le bloc. Cependant, ils permettent aussi de définir les points d'applications des else. Ainsi dans ta fonction PositionAlphabet, ton
else if (isupper(lettre) != 0)ne s'applique pas sur le
if (islower(lettre) != 0)mais sur le
if (lettre == 'a' + position)
De la même façon, ton dernier else ne s'applique sans doutes pas sur le if auquel tu t'attendais.
Essayes de définir proprement tes blocs avec des accolades et normalement ça devrait marcher.
periplasme
Messages postés
391
Date d'inscription
Statut
Membre
Dernière intervention
53
remarque judicieuse. j'ai modifiée le code que je proposais en conséquence.
Et pourquoi ne pas afficher en debug ce qui rentre dans la fonction pour être sûr de ce qui est testé?
au lieu de faire des "return position" dans tes boucles,
je te conseille de stocké le résultat dans une variable, et de faire un seul return à la fin .
avec ça, tu est sur qu'il retournera une valeur quoi qu'il arrive.
je propose ça un peu à froid et après être rester quelques long mois sans pratiquer le C, mais ça devrait faire ce que tu souhaite.
je te conseille de stocké le résultat dans une variable, et de faire un seul return à la fin .
int PositionAlphabet(char lettre) { int position; int resultat = -1; // initialisé avec ton code d'erreur if (islower(lettre) != 0) { for (position = 0; position < 26; position++){ if (lettre == 'a' + position) { resultat = position; break; // on stop la boucle } } } else if (isupper(lettre) != 0) { for (position = 0; position < 26; position++) { if (lettre == 'A' + position) { resultat = position; break; // on stop la boucle } } } return resultat; }
avec ça, tu est sur qu'il retournera une valeur quoi qu'il arrive.
je propose ça un peu à froid et après être rester quelques long mois sans pratiquer le C, mais ça devrait faire ce que tu souhaite.
Après m'etre acharné pendant une heure avec des printf ( je ne sais pas vraiment me servir du debugger) j'ai découvert (en fait je me demande comment, j'aurais pu continuer à chercher longtemps avec des printf et des machins) que c'était une erreur de syntaxe par rapport aux if. C'est exactement ça Aoec.
Merci aussi à arth et à periplasme.
periplasme > Merci! Je le faisais par simplicité, mais c'est vrai que mettre des return partout c'est pas très classe. (d'ailleurs maintenant que j'y pense, meme si le break est mieux, on devrait pas plutot faire un while où on met le if en condition de sortie? Du genre while(position < 26 && lettre != 'A' + position ) ? On se contenterait d'incrémenter dans la boucle)
Merci aussi à arth et à periplasme.
periplasme > Merci! Je le faisais par simplicité, mais c'est vrai que mettre des return partout c'est pas très classe. (d'ailleurs maintenant que j'y pense, meme si le break est mieux, on devrait pas plutot faire un while où on met le if en condition de sortie? Du genre while(position < 26 && lettre != 'A' + position ) ? On se contenterait d'incrémenter dans la boucle)