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 :

Crach lors de l'execution d'une boucle (a sa place)


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Crach lors de l'execution d'une boucle (a sa place)
    Bonjour à tous, je debute dans le C et jusqua present ma progression c'est passé sans trop de probleme mais là...je seche :s si vous pouviez m'aider

    Voici le code du main.c

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "main.h"
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "main.h"
     
     
     
    int main ()
    {
        int i = 0;
        int Maxi = 1;
     
        S_InfoJoueur Joueurs[i];
     
        for (i = 0 ;i <= Maxi;i++) {
     
            printf("Joueur %d", i+1);
     
            printf("\n\nEntrez votre pseudo : ");
            fgets(Joueurs[i].Pseudo, 100, stdin);
            *strchr(Joueurs[i].Pseudo, '\n') = '\0';
     
            printf("\nEntrez votre race : ");
            fgets(Joueurs[i].Race, 100, stdin);
            *strchr(Joueurs[i].Race, '\n') = '\0';
     
            printf("\nEntrez votre classe : ");
            fgets(Joueurs[i].Classe, 100, stdin);
            *strchr(Joueurs[i].Classe, '\n') = '\0';
        }
     
        for (i = 0 ;i <= Maxi;i++) {
        printf("\nInfo sur le joueur %d : %s %s %s", i, Joueurs[i].Pseudo, Joueurs[i].Race, Joueurs[i].Classe);
        }
     
        return 0;
    }
    et voici le code du main.h

    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
     
    #ifndef MAIN
    #define MAIN
     
    #define TAILLE 100
     
    typedef struct StrInfoJoueur S_InfoJoueur;
    struct StrInfoJoueur
    {
        char Pseudo [TAILLE];
        char Race   [TAILLE];
        char Classe [TAILLE];
    };
     
    #endif
    voila le problème numéro 1 ^^ :

    Lorsque je fini de remplir les info du Joueurs[i] (ou i = 0 puisque premier passage de la boucle) et bien comme demander il me demande de rentré le pseudo du joueur 2 puis : "le programme a cessé de fonctionner" !!!

    Je pensé à un problème du genre "Joueurs[1].Pseudo" réécrit sur le "Joueurs[0].Pseudo" mais si tel est le cas je ne comprend pas pourquoi :s
    D'après vous c'est ça ou il y a une bourde ailleurs ? Et si c'est sa comment puis-je y remédier svp ?

    Ensuite le problème numéro 2 :

    Bas en fait y en aura pas, en cherchant le nom de la commande (typedef) je me suis rendu compte de l'oubli de cette saleter de ";" ...surement CodeBlocks qui veu me faire comprendre qu'il est bon de faire un pause mdr.

    Voila merci d'avance de votre aide

    Desoler du multipost :s mais je pense qu'il est mieu ici

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 776
    Points
    23 776
    Par défaut
    Bonjour,

    Citation Envoyé par NatanielKrios Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main ()
    {
        int i = 0;
        int Maxi = 1;
     
        S_InfoJoueur Joueurs[i];
     
        …
    Tu voulais sans doute écrire « S_InfoJoueur Joueurs[Maxi]; ».

    Bon courage.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Alors tout d'abord merci ^^ effectivement il me suffisais d'ouvrir les yeux (même si là je peu plus vraiment ).

    Par contre maintenant le problème me viens de la deuxième boucle qui me fais bien 2 affichages mais ils sont identique (à savoir il m'affiche 2 foi les données du deuxième joueur). Y à t'il une valeur à réinitialiser ?

    Code corriger pour y voir plus clair :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "main.h"
     
     
     
    int main ()
    {
        int i = 0;
        int Maxi = 1;
     
        S_InfoJoueur Joueurs[Maxi];
     
        for (i = 0 ;i <= Maxi;i++) {
     
            printf("Joueur %d", i+1);
     
            printf("\n\nEntrez votre pseudo : ");
            fgets(Joueurs[Maxi].Pseudo, 100, stdin);
            *strchr(Joueurs[Maxi].Pseudo, '\n') = '\0';
     
            printf("\nEntrez votre race : ");
            fgets(Joueurs[Maxi].Race, 100, stdin);
            *strchr(Joueurs[Maxi].Race, '\n') = '\0';
     
            printf("\nEntrez votre classe : ");
            fgets(Joueurs[Maxi].Classe, 100, stdin);
            *strchr(Joueurs[Maxi].Classe, '\n') = '\0';
        }
     
        for (i = 0 ;i <= Maxi;i++) {
        printf("\nInfo sur le joueur %d : %s %s %s", i, Joueurs[Maxi].Pseudo, Joueurs[Maxi].Race, Joueurs[Maxi].Classe);
        }
     
        return 0;
    }

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation:
    Envoyé par NatanielKrios Voir le message
    Code :

    int main ()
    {
    int i = 0;
    int Maxi = 1;

    S_InfoJoueur Joueurs[i];




    Tu voulais sans doute écrire « S_InfoJoueur Joueurs[Maxi]; ».
    ou plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    S_InfoJoueur Joueurs[Maxi+1];

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Question bête mais pourquoi préférer Joueurs[Maxi+1] à Joueurs[Maxi] ?
    En tout cas le résultat est le même pour la seconde boucle : Il me renvoi bien 2 affichage mais 2 foi les info du joueur 2 :s Les données sont elles écrasées ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Quand vous dimensionnez un tableau à N vous réservez 10 positions qui seront numérotées de 0 à 9;
    Dans votre boucle, vous mettez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0; i<=Maxi; i++)
    Or Maxi=1, donc i va prendre les valeurs 0 et 1, il faut donc 2 entrées au tableau.
    Ce n'est pas une préférence c'est obligatoire.
    Je n'ai pas regardé le reste.

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Oki merci des précision. Par contre cela s'applique t'il à toute les boucles faisant référence à un tableau ?

    Pour le reste (le problème lors de la restitution des données), depuis tout à l'heure je me torture les méninge (ou ce qu'il en reste^^) sans trouver de solution. Je vais essayer sans boucle au moin je serai fixé

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 776
    Points
    23 776
    Par défaut
    Citation Envoyé par NatanielKrios Voir le message
    Par contre maintenant le problème me viens de la deuxième boucle qui me fais bien 2 affichages mais ils sont identique (à savoir il m'affiche 2 foi les données du deuxième joueur).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for (i = 0 ;i <= Maxi;i++) {
        printf("\nInfo sur le joueur %d : %s %s %s", i, Joueurs[Maxi].Pseudo, Joueurs[Maxi].Race, Joueurs[Maxi].Classe);
        }
    Tu voulais sans doute écrire « printf("\nInfo sur le joueur %d : %s %s %s", i, Joueurs[i].Pseudo, Joueurs[i].Race, Joueurs[i].Classe); ».

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Tu voulais sans doute écrire « printf("\nInfo sur le joueur %d : %s %s %s", i, Joueurs[i].Pseudo, Joueurs[i].Race, Joueurs[i].Classe); ».
    Ba en fait j'ai essayer mais alors la la première ligne m'affiche des truc sans queue ni tète (en tout cas rien de ce que j'ai entrer) et la deuxième quand a elle me renvoi bien les données du joueur 2 :s c'est pour sa je comprend rien là^^
    (v faire un sceen sa sera plus simple c'est asse ...déroutent)



    Uploaded with ImageShack.us

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 776
    Points
    23 776
    Par défaut
    Citation Envoyé par NatanielKrios Voir le message
    Ba en fait j'ai essayer mais alors la la première ligne m'affiche des truc sans queue ni tète (en tout cas rien de ce que j'ai entrer) et la deuxième quand a elle me renvoi bien les données du joueur 2 :s c'est pour sa je comprend rien là^^
    (v faire un sceen sa sera plus simple c'est asse ...déroutent)
    C'est parce qu'en fait, il faut faire la même chose dans ta première boucle aussi :

    Code C : 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
        for (i = 0 ;i <= Maxi;i++) {
     
            printf("Joueur %d", i+1);
     
            printf("\n\nEntrez votre pseudo : ");
            fgets(Joueurs[i].Pseudo, 100, stdin);
            *strchr(Joueurs[i].Pseudo, '\n') = '\0';
     
            printf("\nEntrez votre race : ");
            fgets(Joueurs[i].Race, 100, stdin);
            *strchr(Joueurs[i].Race, '\n') = '\0';
     
            printf("\nEntrez votre classe : ");
            fgets(Joueurs[i].Classe, 100, stdin);
            *strchr(Joueurs[i].Classe, '\n') = '\0';
        }

  11. #11
    Invité
    Invité(e)
    Par défaut
    Dans ces cas là, je crois que la bonne solution est d'éteindre la machine, prendre une feuille de papier et écrire :
    On va créer la liste des joueurs.
    Je prévois un nombre maxi de 5 joueurs.
    Pour chaque joueur, je demande
    - le nom
    - le prénom
    - l'année de naissance
    puis je stocke dans un tableau ces imformations
    Fin des insctiptions
    Je veux vérifier les renseignements.
    Pour chaque ligne du tableau
    J'imprime 1- son prénom 2- son nom 3 sa date de naissance

    Etc. Etc
    Vous verrez, ça marchera du premier coup.

  12. #12
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    En effet ... bon bon bon on va attendre pour attaquer le chapitre suivant ^^ je vais encore un peu m'attarder la dessu faut que sa rentre (et que j'aille dormir aussi tien...je suis dessu depuis hier et je voi plus rien mdr)
    En tout cas grand merci a vous pour vos conseille et la solution à mon probleme

  13. #13
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Dans ces cas là, je crois que la bonne solution est d'éteindre la machine, prendre une feuille de papier et écrire :
    On va créer la liste des joueurs.
    Je prévois un nombre maxi de 5 joueurs.
    Pour chaque joueur, je demande
    - le nom
    - le prénom
    - l'année de naissance
    puis je stocke dans un tableau ces imformations
    Fin des insctiptions
    Je veux vérifier les renseignements.
    Pour chaque ligne du tableau
    J'imprime 1- son prénom 2- son nom 3 sa date de naissance

    Etc. Etc
    Vous verrez, ça marchera du premier coup.
    Non je vais éteindre la machine et aller me coucher je crois que j'arriverai plus a rien avant 5h de sommeil ^^.
    Quoi qu'il en soi et plus sérieusement en effet je pense que me faire des brouillons me serra utile (ne serai-ce que pour en prendre l'habitude avant d'attaquer des programme plus volumineux).

    Encore une foi merci bcp à vous deux sa soulage de comprendre le pourquoi du "sa marche pas-_-" ^^

  14. #14
    Invité
    Invité(e)
    Par défaut
    Je n'ai jamais fait ça:
    fgets(Joueurs[i].Classe, 100, stdin);
    *strchr(Joueurs[i].Classe, '\n') = '\0';
    Naturellement, vous voulez remplacer le caractère '\n' par '\0'
    Le fin de ligne est est 0x0D 0x0A chez moi, donc 2 caractères. Je crois me souvenir que sous Linux c'est seulement 0x0D.
    Il est vrai que fgets met le carctère de fin de ligne, mais il met aussi un '\0'.
    Cela vous gène-t-il vraiment? Il sera temps de le supprimer après contrôles.

    Mais en fait, Il y a de fortes chances que dans le prototype de strchr, la chaine soit en const. Ce qui fait que cet appel ne fait rien, ou alors il faudrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (fgets(Joueurs[i].Classe, 100, stdin)
    {
      char *ptr=strchr(Joueurs[i].Classe, '\n');
      if (ptr) *ptr='\0'; 
    }
    else printf("Echec de la lecture\n");
    Si le caractère '\n' a été supprimé , ce n'est plus la peine de le refaire, et cela donnera (pointeur sur)NULL='\0'; forcément plantage.

    Pardon, j'ai dit une bêtise épouvantable en disant que si la chaine était const dans le prototype, il ne se passait rien. Ca n'a rien à voir.
    Dernière modification par Invité ; 11/07/2010 à 19h18.

  15. #15
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    @Pierre Dolez :
    Le fin de ligne est est 0x0D 0x0A chez moi, donc 2 caractères. Je crois me souvenir que sous Linux c'est seulement 0x0D.
    Lors de la lecture en mode texte, le ou les bytes marquant la fin de ligne sur le support physique sont convertis en un '\n'. Donc, il n'y a pas de problème.
    Mais en fait, Il y a de fortes chances que dans le prototype de strchr, la chaine soit en const. Ce qui fait que cet appel ne fait rien,
    Je suppose que tu parles de la valeur de retour qui est du type char *. Si elle était en const char *, le compilateur aurait protesté.

    Il est effectivement dangereux d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fgets(Joueurs[i].Classe, 100, stdin);
    *strchr(Joueurs[i].Classe, '\n') = '\0';
    parce que il n'est pas sûr que la chaine contienne un '\n' (même venant d'un fgets()) et que si elle n'en a pas, le programme plantera.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Pour mon erreur sur le const, j'ai demandé pardon.
    Pour le reste, merci de confirmer ce que j'ai dit.

  17. #17
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci pour la petite manip Donc du coup il me vaut mieux tester mon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(Joueurs[i].Pseudo, 100, stdin);
    si a l'intérieur il découvre "\n", il le remplace par "\0"; sinon il passe son chemin et continu a lire le code ?

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Oui, c'est à peu près ça.
    Un petit bout de code pour imprimer une chaine quand on est paumé.
    char Chaine[100]; // la chaine qu'un veut comprendre dimensionné à 100 omme vous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int len = min(strlen(Chaine),32);  // 32 c'est déjà pas mal 
    for (int i=0; i<len; i++)
    {
      printf("rang %d  caractère %c dec %d hexa %x  pointeur %p \n",
                i,Chaine[1],Chaine[1],Chaine[1],Chaine[1]); 
    }
    Cordialement

  19. #19
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Oki oki je vais tacher d'utiliser autant que possible

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

Discussions similaires

  1. Délai expiré lors de l'execution d'une requete sqlserver
    Par lc.soft dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 29/09/2015, 11h41
  2. Erreur lors de l'execution d'une boucle
    Par lily59 dans le forum Langage
    Réponses: 4
    Dernier message: 18/11/2011, 18h19
  3. Réponses: 3
    Dernier message: 09/04/2006, 13h04
  4. Erreur PLSQL lors de l'execution d'une fonction
    Par chicken92000 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 17/03/2006, 17h12
  5. [ADO] Probleme lors de l'execution d'une requete...
    Par NoisetteProd dans le forum Bases de données
    Réponses: 4
    Dernier message: 04/06/2004, 12h43

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