Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Bêta ON] Chaines de caractères à taille variable

Dans la catégorie "Cours" par informaticienzero

    4 août 2011 à 13:44:57

    Lire le tutoriel
    Tuto ouvert aux bêta-tests
    Réservé aux membres

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      4 août 2011 à 13:44:57

      On m'a déjà dit que le chapitre IX de ma bio pourrait être adpaté en tutoriel, vu qu'il en existe déjà un mais en C++ (TP : La POO en pratique avec ZString).

      Etant donné que je ne suis pas sur qu'il passe en validation, je le met en bêta-test, en espérant recevoir des conseils, des appréciations, critiques, et aussi d'avoir l'avis des validateurs.

      En fait, il me parrait un peu court...
      • Partager sur Facebook
      • Partager sur Twitter
        4 août 2011 à 15:00:04

        Salut ! :)

        Le tutoriel en lui-même est bien écrit, même si il y a pas mal de fautes d'orthographe, de typographe, de syntaxe, etc. Lis le tuto sur les conseils des validateurs, ce sera expliqué mieux que je ne le ferais.
        Sinon, évite de citer la biographie d'uknow. Bien qu'elle soit bien mieux écrite que certains tutos du sdz (les miens y-compris), une biographie reste quelque chose de pas vraiment officiel, je doute un peu. Ce n'est que mon avis, cela n'engagent que moi...
        Relis-toi aussi : il y a des références à ta biographie...

        Bonne journée et bonne chance ! ;)
        Lucas-84
        • Partager sur Facebook
        • Partager sur Twitter
        Staff désormais retraité.
        Anonyme
          4 août 2011 à 18:53:09

          Salut,

          Merci des encouragements, j'ai "caché" la référence à la bio de uknow et j'ai supprimé celle à la mienne. J'ai aussi corrigé un peu l'orthographe. Mais qu'entend tu par typographe et syntaxe ?
          • Partager sur Facebook
          • Partager sur Twitter
            4 août 2011 à 18:58:01

            Typographie = ponctuation, notamment dans les listes. Encore une fois, cF les conseils des validos. ;)
            Oublie la syntaxe, en fait c'est bon.
            Juste une dernière petite chose : tu as une liste à puce avec des tirets.


            • Partager sur Facebook
            • Partager sur Twitter
            Staff désormais retraité.
            Anonyme
              4 août 2011 à 19:29:51

              J'ai essayé de corriger. J'ai aussi rajouté deux-trois éléments.
              • Partager sur Facebook
              • Partager sur Twitter
                14 août 2011 à 2:05:42

                Je suis pas sûr de saisir l'utilité du truc. o_O
                Quel est l'intérêt de ce truc ? à part être assez lourd à utiliser. :-°
                • Partager sur Facebook
                • Partager sur Twitter
                  14 août 2011 à 13:14:05

                  Salut,

                  Je ne sais pas si cet exemple à bien sa place comme tutoriel... Je le verrais plutôt comme exercice sur le forum C (ou dans une bio comme c'est le cas maintenant, mais dans ce cas il est moins visible).

                  Sinon, j'aurais plusieurs remarques à faire sur le fond:

                  - Du côté des allocations, tu utilises des fonctions dédiées qui appel exit en cas d'échec de l'allocation. Bon, c'est nettement moins barbare qu'appeler abort, mais pour moi cela reste assez violent. La meilleure solution à mes yeux est que le constructeur retourne un pointeur nul en cas d'échec, que la fonction d'ajout retourne un code d'erreur en cas d'échec de la réallocation et que la fonction de suppression vérifie la validité du pointeur qu'elle reçoit (comme la fonction free). Cela permet des écritures du type:

                  Tableau *s1;
                  Tableau *s2;
                  
                  s1 = tableau_Constructeur();
                  s2 = tableau_Constructeur();
                  
                  if (s1 == NULL || s2 == NULL) {
                  	tableau_Destructeur(s1);
                  	tableau_Destructeur(s2);
                  	return EXIT_FAILURE;
                  }
                  


                  peu importe que un seul ou les deux pointeurs soient nuls, cela ne pose pas de problème, car la fonction de libération ne fait rien si elle reçoit un pointeur nul.

                  - Dans le constructeur, tu fait appel à calloc pour l'allocation du tableau. C'est un bon réflexe, mais mettre simplement le premier caractère à zéro suffirait;

                  - Tu n'utilise pas de TAD dans ton exemple (ce n'est pas un reproche, au contraire), mais tu n'utilises pas les possibilités que cela t'ouvre. Je m'explique. Sans TAD, l'utilisateur connaît les champs de ta structure, il peut donc en profiter pour, par exemple, obtenir directement la taille de la chaîne, mais aussi la chaîne elle-même. Or, pour le moment, tu utilises une fonction pour retourner la chaîne stockée (tab_to_str). Pire, tu crées une copie alloué avec malloc, c'est franchement lourd comme système comparé à un simple s1->tab_char ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 août 2011 à 14:06:01

                    Bonjour,

                    J'ai pas mal de choses à signaler mais beaucoup ont déjà été dites ici ou sur les commentaires de la version en ligne.

                    1) bien préciser au début que dans ta structure il n'y aura pas de '\0' à la fin de la chaîne.

                    2) Ça a déjà été dit, mais l'utilisation de calloc est un peu lourde car inutile, vu que justement il n'y a pas de '\0' à la fin. malloc suffit.

                    3) Dans la fonction tableau_Ajout :
                    void tableau_Ajout(Tableau * tab, char c)
                    {
                    
                        while (tab->nb_actuel >= tab->nb_max)
                        {
                            tab->nb_max *= 2;
                            tab->tab_inter = realloc(tab->tab_char, tab->nb_max * sizeof(*tab->tab_char));
                            
                            if (tab->tab_inter == NULL)
                            {
                                free(tab->tab_char);
                                fprintf(stderr, "Erreur lors d'un realloc dans le fichier %s a la ligne %d", __FILE__, __LINE__);
                                exit(EXIT_FAILURE);
                            } 
                    
                            else
                            {
                                tab->tab_char = tab->inter;
                            }
                        }
                    
                        tab->tab_char[tab->nb_actuel] = c;
                            tab->nb_actuel++;
                    }
                    
                    Je peux me tromper mis il me semble qu'un if(tab->nb_actuel==tab->nb_max) suffit à la place du while (de plus, on ne répète plus le calloc pas beau en boucle). On agrandit l'espace alloué si on utilise déjà tout l'espace disponible avant de rajouter le caractère.

                    (en plus vous avez écrit tab->tab_inter ligne 7 alors que le membre s'appelle inter)

                    4) J'avais lu le tuto à sa parution et je n'ai lu la 2è version que rapidement, mais j'ai l'impression que le membre inter de la structure est un peu superflu, et qu'il pourrait être remplacé par des variables locales aux fonctions qui le manipulent.
                    Et pourquoi vous allouez un espace pour inter dans le constructeur ? o_O
                    D'ailleurs, vous parlez de « tableau intermédiaire », j'aurais plutôt dit « pointeur intermédiaire » (dans « tableau intermédiaire » il y a l'idée qu'on va recopier tout le tableau dans un nouveau pour obtenir l'objet définitif, alors qu'on se contente de récupérer son adresse dans une variable temporaire).

                    5) Dans la fonction tableau_Ajout_Chaine, ce serait bien de marquer l'argument char* str comme constant (remarque similaire pour d'autres fonctions, comme tab_to_str). ;)

                    6) Pour tab_to_str, je vois mal l'intérêt de mettre 2 fois un code pratiquement identique.

                    7) Que votre tutoriel soit un peu court comme ça a été signalé n'est pas très grave je pense, car son sujet n'en reste pas moins important, mais je pense que vous auriez pu aller un peu plus loin en codant davantage de fonctions (fonctions de comparaison, de copie, de concaténation…). Sans compter que vous avez codé une fonction permettant de vider le tableau, mais pas une permettant de n'enlever qu'un seul élément (ce qui est tout aussi simple à coder).

                    8) Vos identificateurs manquent d'uniformité. Je les cite (les fonctions) :
                    • tableau_Constructeur
                    • tableau_Destructeur
                    • tableau_Ajout
                    • tableau_Ajout_Chaine (jusque là, ça va)
                    • viderTableau (sans underscore '_' et c'est un verbe suivi de "Tableau" et non "Tableau_" suivi de l'action)
                    • tab_to_str (là, vous passez à l'anglais, tout en minuscules et avec des abréviations)
                    • stdin_to_tab
                    • stdin_to_str


                    J'espère vous avoir aidé, et je trouve que votre tuto est une excellente initiative. :)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [Bêta ON] Chaines de caractères à taille variable

                    × 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