Erreur code? (C)

Résolu/Fermé
BreezyChaos - 1 juin 2012 à 00:23
 BreezyChaos - 2 juin 2012 à 00:24
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.
_____________________________________________________________________
#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:

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

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.
1
periplasme Messages postés 391 Date d'inscription vendredi 22 avril 2011 Statut Membre Dernière intervention 5 février 2013 53
1 juin 2012 à 09:49
remarque judicieuse. j'ai modifiée le code que je proposais en conséquence.
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
1 juin 2012 à 02:42
Et pourquoi ne pas afficher en debug ce qui rentre dans la fonction pour être sûr de ce qui est testé?
0
periplasme Messages postés 391 Date d'inscription vendredi 22 avril 2011 Statut Membre Dernière intervention 5 février 2013 53
Modifié par periplasme le 1/06/2012 à 09:48
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 .

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.
0
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)
0