Partage
  • Partager sur Facebook
  • Partager sur Twitter

code block VS DEV C++

Compilation differente

    26 avril 2019 à 15:05:13

    Bonjour j'ai écris le programme concernant le "pendu" et j'ai compilé avec DEV C++ qui a bien fonctionné.

    En voulant utiliser Code block, j'ai un résultat bizarre, 

    quelque pourrait m'expliquer?

    voici le programme ci dessous:

    le MAIN

    #include <stdio.h>
    
    #include <string.h>
    
    #include <stdlib.h>
    
    #include "mesFonction.h"
    
    int main(int argc, char * argv[])
    
    {
    
        int restessai = 10 ;
    
        char mot_secret[] = "MARRON", motTrouver[] = " ";
    
        printf("#### Bienvenue dans le Pendu ! ####\n\n\n");
    
        char tentative = ' ';
    
        int i = 0;
    
        for ( i = 0 ; i < strlen(mot_secret) ; i++ )
    
            motTrouver[i] = '*' ;
    
        while (restessai != 0 && strcmp(motTrouver, mot_secret))
    
        {
    
            printf("Il vous reste %d coups a jouer \n ", restessai);
    
            printf("Quel est le mot secret ? %s\n Proposez une lettre : ", motTrouver) ;
    
            tentative = lireCaractere() ;
    
            verifierMot(tentative, mot_secret, motTrouver) ;
    
            restessai = restessai - 1;
    
        }
    
        printf("\n\nGagne ! Le mot secret etait bien : %s\n\n", motTrouver) ;
    
        return 0 ;
    
    }



    les fonction:

    # include<stdio.h>
    
    # include<ctype.h>
    
    # include<string.h>
    
     char lireCaractere()
    
     {
    
        char caractere = 0 ;
    
        caractere = getchar() ; // On lit le premier caractère
    
        caractere = toupper(caractere) ; /* On met la lettre en majuscule si elle ne l'est pas déjàOn lit les autres caractères mémorisés un à un jusqu'au \n (pour les effacer)*/
    
        while (getchar() != '\n');
    
        return caractere ; // On retourne le premier caractère qu'on a lu
    
     }
    
    void verifierMot(char c , char *motreferant, char *mot)/*cette fonction sert à verifier si le caractere entré figure dans le mot secret elle affecte egalement le caractere dans le mot partiellement trouvé*/
    
     {
    
        int i = 0 ;
    
        for (i = 0; i < strlen (motreferant); i++)
    
        {
    
            if (c == motreferant[i])
    
            {
    
                mot[i] = c ;
    
            }
    
        }
    
     }
    


    Cordialement,

    -
    Edité par AristideRanda 26 avril 2019 à 21:57:13

    • Partager sur Facebook
    • Partager sur Twitter
      26 avril 2019 à 15:06:49

      Salut,

      Qu'est ce qu'un "résultat bizarre" ?

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        26 avril 2019 à 15:10:18

        Salut,

        je voudrais dire le programme ne fonctionne pas comme je m'attendais sous Codeblock alors que c'est normal sous DEV C++

        • Partager sur Facebook
        • Partager sur Twitter
          26 avril 2019 à 15:11:44

          Je crois que je ne peux pas t'aider, car tu restes vague.

          Qu'est ce que tu attends du programme, et qu'est ce que ça fait concrètement ?

          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            26 avril 2019 à 16:52:09

            Hello,

            Peu importe le compilateur, ce programme ne peut pas fonctionner (sauf par [mal]chance):

            char motTrouver[] = " ";

            Cela ne réserve que 2 octets, il y aura fatalement écrasement de données dans le for ( i = 0 ; i < strlen(mot_secret) ; i++ ) si mot_secret a plus d'un caractère.

            Et, stp,

            Il peut également y avoir plantage lors du printf() de mot_trouve, car tu ne le termines pas par un \0. Et quoi qu'il arrive (que le joueur ait ou non trouvé le mot), tu affiches "gagné".

            -
            Edité par edgarjacobs 26 avril 2019 à 17:04:28

            • Partager sur Facebook
            • Partager sur Twitter

            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

              27 avril 2019 à 10:27:20

              Je vous remercie sincèrement EdgarJacobs pour m'avoir aider.

              peut-être qu'il y a encore des incorrection bien que le code est déjà bien compilé.

              code principale

              #include <stdio.h>
              #include <string.h>
              #include <stdlib.h>
              #include "mesFonction.h"
              #define N 23
              int main(int argc, char * argv[])
              {
                  int restessai = 10, i = 0;
                  char mot_secret[N] = "MARRON",tentative = ' ', motTrouver[7] = "";
                  printf("#### Bienvenue dans le Pendu ! ####\n\n\n");
                  for ( i = 0 ; i < strlen(mot_secret) ; i++ )
                      motTrouver[i] = '*' ;
                  while (restessai != 0 && strcmp(motTrouver, mot_secret))
                  {
                      printf("Il vous reste %d coups a jouer \n ", restessai);
                      printf("Quel est le mot secret ? %s\n Proposez une lettre : ", motTrouver) ;
                      tentative = lireCaractere() ;
                      verifierMot(tentative, mot_secret, motTrouver) ;
                      if (strchr(mot_secret, tentative) == NULL)
                          restessai = restessai - 1;
                      else
                          restessai = restessai;
                  }
                  if (!strcmp(motTrouver, mot_secret))
                  {
                      printf("\n\nGagne ! Le mot secret etait bien :") ;
                      int j = 0;//indice du tableau permettant d'afficher le mot secret
                      while (motTrouver[j] == '\0')
                      {
                          printf("%c", motTrouver[j]) ;
                          j++;
                      }
                  }
              
                  else
                      printf("\n\n Désolé!, vous n'avez pas trouvé le mot\n le mot etait %s\n\n", mot_secret) ;
                  return 0 ;
              }
              
              

              Code des fonctions:

              # include<stdio.h>
              
              # include<ctype.h>
              
              # include<string.h>
              
              char lireCaractere()
              
              {
              
                  char caractere = 0 ;
              
                  caractere = getchar() ; // On lit le premier caractère
              
                  caractere = toupper(caractere) ; /* On met la lettre en majuscule si elle ne l'est pas déjàOn lit les autres caractères mémorisés un à un jusqu'au \n (pour les effacer)*/
              
                  while (getchar() != '\n');
              
                  return caractere ; // On retourne le premier caractère qu'on a lu
              
              }
              
              void verifierMot(char c, char *motreferant, char *mot) /*cette fonction sert à verifier si le caractere entré figure dans le mot secret elle affecte egalement le caractere dans le mot partiellement trouvé*/
              
              {
              
                  int i = 0 ;
              
                  for (i = 0; i < strlen (motreferant); i++)
              
                  {
              
                      if (c == motreferant[i])
              
                      {
              
                          mot[i] = c ;
              
                      }
              
                  }
              
              }



              Merci encore,

              Cordialement,

              -
              Edité par AristideRanda 27 avril 2019 à 10:30:29

              • Partager sur Facebook
              • Partager sur Twitter
                27 avril 2019 à 11:54:04

                Conseil : s'enlever très vite de la tête l'idée que, si un code est accepté par le compilateur, c'est qu'il est "presque correct".

                PS: ce genre de boucle

                for (i = 0; i < strlen (mot); i++) {
                  ...
                }
                
                

                est extrèmement inefficace, parce que strlen(mot) est recalculé à chaque tour de boucle. Et comment est-il recalculé ? En parcourant mot pour chercher le caractère sentinelle '\0' qui marque la fin de la chaine.  Ce qui fait que le nombre d'opérations est proportionnel au carré de la taille de le chaine.

                La longueur du mot ne changeant pas dans la boucle, il est préférable de calculer la taille avant :

                int taille = strlen(mot);
                for (i = 0; i < taille; i++) {
                   ...
                }
                

                Ou mieux, en se décidant pour  une version de C qui ne date pas de la préhistoire

                for (int i = 0, taille = strlen(mot);  i < taille;  i++) {
                   ...
                }
                

                (déclaration et initialisation de deux variables auxiliaires dans le for)


                -
                Edité par michelbillaud 27 avril 2019 à 11:55:14

                • Partager sur Facebook
                • Partager sur Twitter
                  27 avril 2019 à 15:42:24

                  salut,

                  Merci pour vos remarque michelbillaud,

                  Merci encore

                  cordialement,

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 avril 2019 à 15:49:12

                    Re,-

                    • pourquoi ne pas déclarer motTrouve avec la même taille que mot_secret ?
                    • les lignes 21 et 22 (main) ne servent à rien
                    • pourquoi une boucle (lignes 27 à 32) pour afficher motTrouver ?
                    • pourquoi deux conventions de nommage différentes ? motSecret et motTrouve ou mot_secret et mot_trouve
                    • verifierMot() devrait renvoyer une valeur, ça éviterait le test ligne 19. Exemple:
                      #include <stdbool.h>
                      
                      int main(void) {
                      	....
                      	
                      	if(!verifierMot(tentative, mot_secret, motTrouver))
                      		restessai = restessai - 1;		// ou --restessai;
                      	
                      	....
                      }
                      
                      
                      // fonction.c
                      
                      #include <stdbool.h>
                      
                      bool verifierMot(char c, char *mot_referant, char *mot) {
                      	bool found=false;
                      	
                      	for(int i=0, size=strlen(mot_referant); i < size; i++)
                      		if (c == mot_referant[i]) {
                      			mot[i]=c;
                      			found=true;
                      		}
                      	
                      	return(found);
                      }
                    • Partager sur Facebook
                    • Partager sur Twitter

                    On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                      27 avril 2019 à 17:56:35

                      Et verifierMot, si elle retourne un booléen, devrait porter un nom qui reflète le resultat.

                      La question à se poser :  ça retourne vrai quand ?  Quand on moins une lettre du mot référent est égale à c, et ça en profite pour dévoiler la lettre dans mot (ces noms sont mal choisis, et maintenant size et found en anglais...).

                      Elle fait deux choses à la fois. On va dire qu'elle essaie de dévoiler (les occurences d') une lettre, et retourne vrai si elle a réussi ?

                      bool devoiler_lettre(char lettre, 
                                           char *mot_cache,
                                           char *mot_visible)
                      {
                           bool lettre_presente = false;
                           for (int i = 0, taille = strlen(mot_cache); i < taille ; i++) {
                              if (lettre == mot_cache[i]) {
                                   mot_visible[i] = lettre;
                                   lettre_presente = true;
                              }
                           }
                           return lettre_presente;
                      }
                      
                                           



                      -
                      Edité par michelbillaud 27 avril 2019 à 17:58:04

                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 avril 2019 à 19:11:40

                        Salut michelbillaud, 

                        ce sera vraiment génial mais voici les erreurs qu'on affiche:


                        ||=== Build file: "no target" in "no project" (compiler: unknown) ===|

                        C:\Users\USER\Documents\C et C++\vieux pendu\mesFonction.h|12|error: unknown type name 'bool'|

                        C:\Users\USER\Documents\C et C++\vieux pendu\mesFonction.h||In function 'verifierMot':|

                        C:\Users\USER\Documents\C et C++\vieux pendu\mesFonction.h|14|error: unknown type name 'bool'|

                        C:\Users\USER\Documents\C et C++\vieux pendu\mesFonction.h|14|error: 'false' undeclared (first use in this function)|

                        C:\Users\USER\Documents\C et C++\vieux pendu\mesFonction.h|14|note: each undeclared identifier is reported only once for each function it appears in|

                        C:\Users\USER\Documents\C et C++\vieux pendu\mesFonction.h|20|error: 'true' undeclared (first use in this function)|

                        ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

                        Cordialement,

                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 avril 2019 à 19:36:03

                          Si tu avais lu mon post:
                          #include <stdbool.h>

                          Mais valable uniquement à partir du c99 (mais j'imagine que ton compilateur dois compiler avec la norme c11)

                          -
                          Edité par edgarjacobs 27 avril 2019 à 19:38:56

                          • Partager sur Facebook
                          • Partager sur Twitter

                          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                            27 avril 2019 à 20:17:17

                            On n'est jamais qu'en 2019 :-)

                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 avril 2019 à 5:55:53

                              Merci beaucoup edgarjacobs,

                              c'est parfait avec #include<stdbool.h>.

                              Bon Dimanche,

                              Cordialement,

                              • Partager sur Facebook
                              • Partager sur Twitter

                              code block VS DEV C++

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown