Partage
  • Partager sur Facebook
  • Partager sur Twitter

Affichage de lettres érroné

Sujet résolu
    20 janvier 2021 à 15:48:42

    Salut à tous !

    Je fais un programme en C visant a former un mot aléatoirement, mais je rencontre un petit soucis.

    J'ai fais dans un premier temps ce code ne python, mais le multi-threading étant bloqué par le GIL je me retrouve à le transposer en C.

     Le code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <string.h>
    #include <math.h>
    
    int max = 3;
    char a[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    
    int main()
    {
    
        int i = 0;
        int ii = 0;
        char m[] = "\n";
        int h = 0;
    
        for (i = 0 ; i < 1 ; i++)
        {
    
            for (ii = 1; ii <= max; ii++)
            {
                h = rand() % strlen(a) - 1;
                printf("h = %d", h);
                printf("%s\n", m);
                m[ii] = a[h];
    
            }
        }
    
    
    }

    Je fais donc prendre à ma case m[ii] la lettre qui se trouve à la case a[h].

    Problème : eh bien ca m'affiche un caractère étrange. Je suis au courant de la la table ascii, mais quand j'affiche ma variable a (contenant l'alphabet) lettres par lettres, elles s'affichent bien toutes.

    Resultat dans l'invite de commande :

    h = 40
    
    h = 6
    O
    h = 41
    O)
    
    Process returned 0 (0x0)   execution time : 0.018 s
    Press any key to continue.
    


    (l'espace entre h = 40 et h = 6 est du à "\n" contenu dans m[0]

    J'ai penser utiliser des pointeurs..

    Qu'en pensez vous ?

    Merci d'avance pour votre aide,

    Flavien

    • Partager sur Facebook
    • Partager sur Twitter
      20 janvier 2021 à 16:09:56

      Il y a plusieurs choses qui ne vont pas !

      1) ton tableau m a une taille de 2 (indice 0 et 1) et toi tu vas écrire dans les cases d'indice 2 et 3 ! Tu es donc hors tableau ! Là bonjour les dégâts !

      2) Les chaîne de caractère ont la particularité de ce terminer par un caractère de fin de chaîne le '\0' or toi tu ne le mets pas lors de la construction de ta chaîne.

      -
      Edité par rouloude 20 janvier 2021 à 16:10:22

      • Partager sur Facebook
      • Partager sur Twitter
        20 janvier 2021 à 16:36:35

        En effet !

        Pour le 1er cas, j'avais initiatiliser la taille de mon tableau via la constance max :

        --> char m[max] = "\n"

        Mais je reçois ce code d'erreur : "error: variable-sized object may not be initialized|"

        Pour la construction de la chaîne, je savais aps du tout qu'on devait mettre nous même le \0, il me semblait qu'il se mettait automatiquement, mais merci du coup !

        Tu saurais pourquoi j'obtiens ces signes bizarres ?

        De plus, j'ai essayé avec un pointeur, CA MARCHE !

        Mais seul problème, j'arrive pas à pointer vers une case précise (par exemple à pointer sur la 15 case de a[]), du coup j'obtient que des aaaaaaaa

        #include <stdio.h>
        #include <stdlib.h>
        #include <pthread.h>
        #include <string.h>
        #include <math.h>
        
        
        char a[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\0";
        
        
        int main()
        {
            int max = 3;
            int i = 0;
            int ii = 0;
            char m[3] = "\n";
            int h = 0;
            char *pointeur_alphabet = &a;
        
            for (i = 0 ; i < 1 ; i++)
            {
        
                for (ii = 1; ii <= max; ii++)
                {
                    h = rand() % strlen(a) - 1;
                    printf("h = %d", h);
                    m[ii] = *pointeur_alphabet;
                    printf("%s\n", m);
        
                }
            }
        
        
        }
        


        Le resultat en IC :

        h = 40
        a
        h = 6
        aa
        h = 41
        aaa @
        
        Process returned 0 (0x0)   execution time : 0.019 s
        Press any key to continue.
        

        On voit bien qu'il y a que des a qui ont été insérés...

        EDIT :

        Je viens de modifier la fin de la variable comme tu l'avais dis, avec \0 :

        char m[6] = "\n\0";

        Mais petite question : Si je souhaite un mot de 3 caracteres je dois donc créer un char de 6 cases ?

        [0, 1, 2] = les lettres du mot

        [3, 4, 5, 6] = \n et \0 ?


        -
        Edité par Bunnntyyy 20 janvier 2021 à 16:54:34

        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2021 à 16:57:04

          FunlY-Fla a écrit:

          Pour le 1er cas, j'avais initiatiliser la taille de mon tableau via la constance max :

          --> char m[max] = "\n"

          Ce n'est pas ce qu'il y a dans ton code :

              char m[] = "\n";

          Dans ton nouveau code : 

              char m[3] = "\n";

          Tableau de 3 cases donc avec les indices  0, 1, 2  or toi tu va toujours écrire dans la case d'indice 3 qui est hors tableau !

          Le '\0' ne se met pas automatiquement, il faut donc le mettre, ce que tu n'as toujours pas fait.

          Ça met toujours la première lettre car ton pointeur pointeur_alphabet pointe toujours sur la première lettre de ton tableau a. C'est ce que tu as demandé ligne 18, et que tu aurais du écrire sans l’esperluette devant le a soit :

              char *pointeur_alphabet = a;


          Edit : 3 caractères + le '\0' si tu souhaites en faire une chaîne de caractère, c'est au minimum 4 (le '\0' compte pour un caractère, et si tu veux le '\n' en plus il t'en faut un de plus.

          char m[6] = "\n\0";

          Le problème ici, c'est que tu va l'écraser le '\0' quand tu va écrire dans le tableau (le '\n' aussi d'ailleurs). Il faut qu'il soit à la fin le '\0'.

          -
          Edité par rouloude 20 janvier 2021 à 17:08:08

          • Partager sur Facebook
          • Partager sur Twitter
            20 janvier 2021 à 17:06:01

            Pour définir la taille maxi du tableau, plutôt que

            int max = 4;

            tu peux utiliser :

            #define max 4

            Là 'max' est vraiment une constante (c'est 4) donc tu peux déclarer correctement le tableau :

            char m[max] ;

            (Pas besoin de l'initialiser puisque ce sera fait dans la boucle qui suit.)

            Ensuite, comme les indices vont de 0 à max - 1, il me semble que la boucle devrait plutôt être :

                for (ii = 0; ii < max; ii++)
                {
                    h = rand() % strlen(a) ;    // ==> valeurs entre 0 et strlen(a) - 1
                    printf("h = %d", h);
                    printf("%s\n", m);
                    m[ii] = a[h];
                }

            Puis il faut remplacer m[max-1] par '\0' pour terminer la chaîne. (Du coup la condition de bouclage est même ii < max - 1 : pour un tableau de 4 caractères, on ira de 0 à 2.)

            -
            Edité par robun 20 janvier 2021 à 17:11:41

            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2021 à 17:17:07

              Hey !

              Merci de tes réponses, j'ai fait ce que t'as dis (normalement) :

              Déclaration du char et implémentation de \n et \0 :

                 char m[5];
                  m[3] = '\n';
                  m[4] = '\0';

              Et changement pour le pointeur :

              char *pointeur_alphabet = a;

              Mais ca m'affiche toujours que des a...

              IC :

              h = 40
              aÇ 
              
              h = 6
              aa 
              
              h = 41
              aaa
              
              aaa
              
              Process returned 0 (0x0)   execution time : 0.019 s
              Press any key to continue.


              EDIT:

              j'ai écris trop de messages, je peux pas reposter avant 24h...

              (Pour robun)

              Je peux pas utiliser #define. Pour l'instant max = 3 (nombre de lettres), mais par la suite, j'ajouterai 1 à chaque fois (max = 4, 5, 6...)

              Et merci beaucoup des conseils, ça marche !



              -
              Edité par Bunnntyyy 20 janvier 2021 à 17:26:47

              • Partager sur Facebook
              • Partager sur Twitter
                20 janvier 2021 à 17:31:34

                Ça affiche que des a car ton pointeur comme je t'ai dit pointe sur la première case de ton tableau et il n'en change jamais. (l'esperluette ne corrige pas ce problème, ça rend juste l'écriture correcte de ton affectation, je ne rentre pas dans les détails sur ce sujet, on va pas en rajouter). Mais vu que tu as beaucoup de difficultés avec les tableaux, tu n'aurais peut-être pas du mettre ce pointeur, qui ne fait que augmenter la difficulté et rester sur l'utilisation classique des tableaux.

                • Partager sur Facebook
                • Partager sur Twitter
                  20 janvier 2021 à 18:07:46

                  Hey à toi !

                  Je peux pas utiliser #define. Pour l'instant max = 3 (nombre de lettres), mais apr la suite, j'ajouterai 1 a chaque fois (max = 4, 5, 6...)

                  Et merci beaucoup des conseils, ca marche !

                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 janvier 2021 à 18:25:03

                    Pourquoi ne pas définir une variable qui recevrait le résultat de strlen() et que tu utiliserais avec rand().
                    C'est un petit détail sur l'efficacité, mais c'est facile à faire.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Le Tout est souvent plus grand que la somme de ses parties.

                      20 janvier 2021 à 19:08:09

                      Pourquoi pas, je vais faire ca !

                      Petite question, par rapoort au multi-processing(ou threading).

                      Le parallélisme permet de faire plusieurs taches en même temps, mais peut on attribuer plusieurs threads a une seule et même tache de manière a ce que ca aille plus vite ?

                      J'ai fais ca comme parallélisme... Mais pas très utile pour l'instant, je prefererais que plusieurs coeur bosses sur le même code, quelqu'un saurait quel bibli importer ?

                         pthread_t threads[NUM_THREADS];
                      
                          for (p = 0; p < NUM_THREADS; p++)
                          {
                              p1 = pthread_create(threads, NULL, coucou(), NULL);
                          }



                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 janvier 2021 à 19:19:35

                        FunlY-Fla a écrit:

                        Petite question, par rapoort au multi-processing(ou threading).

                        Le parallélisme permet de faire plusieurs taches en même temps, mais peut on attribuer plusieurs threads a une seule et même tache de manière a ce que ca aille plus vite ?

                        J'ai fais ca comme parallélisme... Mais pas très utile pour l'instant, je prefererais que plusieurs coeur bosses sur le même code, quelqu'un saurait quel bibli importer ?

                           pthread_t threads[NUM_THREADS];
                        
                            for (p = 0; p < NUM_THREADS; p++)
                            {
                                p1 = pthread_create(threads, NULL, coucou(), NULL);
                            }



                        Attends.... tu n'es pas capable d'écrire un code tout simple, et tu veux te lancer dans la programmation multi-thread ?

                        -
                        Edité par edgarjacobs 20 janvier 2021 à 19:27:29

                        • 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

                          20 janvier 2021 à 19:28:07

                          Tu as fini ton précédent code ? Parce qui il y avait pas mal de problèmes, et qui n'ont pas tous été énumérés pour pas t'en faire trop à la fois !

                          Et si ton sujet n'a rien à voir avec l'autre, il est préférable de créé un autre sujet !

                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 janvier 2021 à 19:44:29

                            edgarjacobs a écrit:

                            Attends.... tu n'es pas capable d'écrire un code tout simple, et tu veux te lancer dans la programmation multi-thread ?

                            -
                            Edité par edgarjacobs il y a 13 minutes


                            De base la programmation m'attire pas énormément, je m'y mets de temps en temps pour tester des trucs, je suis plutot réseau que programmation, d'où le fais que je sois une vraie quiche (notamment parce que je ne fais plus de C, j'utilise que python, et l'écriture est vraiment différente, notamment au niveau des tableaux).

                            J'avais prévenu que de base j'ai fais un code sur python et que je le tranpose en C pour pouvoir utiliser le multi-threading qui est bloqué par le GIL sous python

                            Mais du coup je vais créer un nouveau fil, Merci pour toute l'aide !

                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 janvier 2021 à 20:36:05

                              Bon courage ! Du coup on ne sait même pas si notre aide a été bénéfique ? Si c'est une partie d'un gros projet, Sache que le C ne pardonne pas, tu peux avoir des erreurs présentent que tu ne vois pas et qui vont surgir à un moment ou un autre et quand le projet sera gros deviendront difficile à cerner ! 

                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 janvier 2021 à 23:48:44

                                rouloude a écrit:

                                Bon courage ! Du coup on ne sait même pas si notre aide a été bénéfique ? Si c'est une partie d'un gros projet, Sache que le C ne pardonne pas, tu peux avoir des erreurs présentent que tu ne vois pas et qui vont surgir à un moment ou un autre et quand le projet sera gros deviendront difficile à cerner ! 


                                Ahah, je sais pas si on peut appeler ca un gros projet, mais c'est un projet !

                                Votre aide m'as été très utile, encore merci !

                                Passez tous une excellente année 2021 !!

                                Flavien

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  21 janvier 2021 à 2:00:53

                                  Voici ce que j'ai trouvé sur le sujet.
                                  https://wiki.python.org/moin/GlobalInterpreterLock
                                  Je n'ai pas fait de multi-threading en Python. Je ne peux pas commenter.
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Le Tout est souvent plus grand que la somme de ses parties.

                                  Affichage de lettres érroné

                                  × 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