Partage
  • Partager sur Facebook
  • Partager sur Twitter

Chaîne de caractère dans un tableau

Sujet résolu
    14 mai 2019 à 21:47:08

    Bonjour à tous,

    Dans l'intérêt de mon programme j'ai besoin de créer un tableau dynamiquement : aucun problème.

    A chaque fois que je crée une case dans ce tableau, je lui affecte une chaîne de caractères contenu dans une variable, en faisant comme suit :

    tableau[id] = var;

    Mais l'intérêt du truc c'est que var est différent à chaque fois. Donc je modifie ma variable var sans problème pour répondre à mon besoin. Mais lorsque j'explore tableau, je me rend compte que toute les cases on la même valeur (à savoir la dernière valeur de var).

    Je me dis au final, c'est logique : var n'est qu'un pointeur vers une chaîne de caractères. Donc quand je modifie var, je modifie la chaîne de caractères sans toucher au pointeur. Et ma case du tableau lui retient ce pointeur, donc un espace unique dans la mémoire qui change quand je change var.

    La question est donc comment faire pour quetableau[id] vaut la chaîne pointé parvar ? J'ai essayé en faisanttableau[id] = *var mais le programme plante...

    Merci par avance :D

    • Partager sur Facebook
    • Partager sur Twitter
      14 mai 2019 à 23:30:49

      Hello,

      Il faut faire une copie de ce qui est pointé par var. Par exemple,

      tableau[id]=strdup(var);

      Attention: strdup() n'est pas standard. L'équivalent est (sans controle) 

      tableau[id]=malloc(strlen(var)+1);
      strcpy(tableau[id],var);

      Ne pas oublier, lorsque tableau[] n'est plus nécessaire, de faire un free pour tous les tableau[id].

      -
      Edité par edgarjacobs 14 mai 2019 à 23:31:39

      • 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

        15 mai 2019 à 14:14:35

        Bonjour,

        J'avais déjà essayé avec strcpy. Mais c'est pareil, le programme plante.

        if ( (tableau = malloc(tableau, n*(lstrlen(path)+1))) == NULL ) {
                error("Impossible d'allouer de la mémoire.", __ERR_INFOS__);
                return -1;
        }
        strcpy(tableau[0], path);
        tableau[lstrlen(path)] = '\0';
        
        printf("1ere case : %s\n", tableau[0]);
        • Grosso modo je crée mon tableau (en vrai j'utilise en realloc pour redimensionner le tableau en fonction de mes besoins).
        • Ce tableau fais n cases du longueur égale à la longueur de la chaîne de caractères path +1 pour le caractère nul.
        • J'affecte le contenu depath à la case 0 (pour l'instant je fais simple)
        • Je rajoute le caractère nul
        • J'affiche

        Mais ça plante quand même...

        Des idées ? Peut-être un truc qui m'échappe ?

        Au fait j'ai un pitit soucis mais en soi c'est pas génant. Je travaille sous windows avec code::blocks. Quand le programme plante il ne peut pas recréer un exe, il n'a pas la permission (il est déjà utilisé...). Je suis à chaque fois obligé de spécifier un nouveau nom de fichier exe pour qu'il compile (il ne veut pas, quelque soit le moyen, fermer l'exe alors qu'il n'est plus lancé)... vous savez à quoi c'est dû ? Avant ça ne me le faisait pas (je parlais d'il y a longtemps :q)

        -
        Edité par Max La Menace 44 15 mai 2019 à 14:16:23

        • Partager sur Facebook
        • Partager sur Twitter
          15 mai 2019 à 14:23:26

          J'ai l'impression que tu mélanges tableau de char et tableau de pointeur sur char !

          Il semblerait que tu veuilles créer un tableau de pointeur sur char, mais dans ce cas ton allocation n'est pas correcte !

          Quel est le type de tableau ?

          Edit : malloc n'attend qu'un seul paramètre.

          -
          Edité par rouloude 15 mai 2019 à 14:26:15

          • Partager sur Facebook
          • Partager sur Twitter
            15 mai 2019 à 14:41:52

            Oui désolé ! Comme je disais j'utilise realloc à la base, et j'ai mal rectifié en copiant/collant.

            En fait je fais un éditeur. J'ai donc une fonction qui est appelé à chaque fois que je crée un fichier (nouveau fichier ou ouvrir un existant). Pour gérer les multiples fichiers j'utilise les onglets. A chaque onglet j'associe un fichier dans le répertoire temporaire. Ainsi quand je change d'onglet je n'ai plus qu'à enregistrer le contenu de l'éditeur dans ce fichier temporaire, et quand je reviens sur cet onglet je n'ai plus qu'à lire ce même fichier.

            Mon tableau sert donc à enregistrer le chemin de chacun des fichiers à chaque fois que je crée un onglet. Donc quand j'ouvre un fichier j'appelle une fonction. Cette fonction crée une chaîne de caractères contenant le chemin vers ce fichier temporaire (la variable path). Ensuite elle ajoute une case à mon tableau. Et enfin elle est censé donner la valeur de path à la case correspondant du tableau (chaque case correspondant à 1 onglet).

            Seulement, je ne peux pas associer la case n à la variable path. Sinon quand je change path la valeur de toute les cases de mon tableau change avec elle (vu qu'elles pointent toutes vers la même chaîne au final). Donc je me suis dis je fais un tableau ou chacun des cases contiendra une chaine de caractères...

            Je ne sais pas si je suis très clair...

            -
            Edité par Max La Menace 44 15 mai 2019 à 14:43:40

            • Partager sur Facebook
            • Partager sur Twitter
              15 mai 2019 à 16:45:50

              Il te faut donc un tableau de pointeur sur char. (donc la taille de ce tableau sera n fois la taille d'un pointeur sur char ou n est le nombre de chaîne à mémoriser).

              tableau[0] pointera sur la première chaîne, tableau[1] sur la deuxième et ainsi de suite.

              A toi de voir ou tu stocke tes chaînes.

              • Partager sur Facebook
              • Partager sur Twitter
                16 mai 2019 à 9:06:48

                Bonjour,

                Alors j'ai résolu mon problème mais je ne sais pas si c'est de la façon la plus propre.

                Quand j'appelle ma fonction je crée une variable path grâce à malloc. Cette dernière contiendra la chaîne de caractères. Après je rajoute une case à mon tableau et je dis :

                tableau[id] = path;

                Je n'ai du coup pour l'instant pas de problème mais est-ce bien de faire comme ça ? Sachant que quand je fermerais un onglet je libère path et je refais le tableau avec la case en moins.

                Cordialement,

                GICQUEL Maxime

                • Partager sur Facebook
                • Partager sur Twitter
                  16 mai 2019 à 10:52:27

                  > strdup n'est pas standard

                  ça dépend de quel standard on parle, parce qu'on le voit bien dans POSIX depuis 10 ans, rubrique extensions POSIX du standard C ISO.

                  http://pubs.opengroup.org/onlinepubs/9699919799/

                  [CX][Option Start] Extension to the ISO C standard [Option End]
                  The functionality described is an extension to the ISO C standard. Application developers may make use of an extension as it is supported on all POSIX.1-2017-conforming systems.

                  La page de manuel dit

                         strdup():
                             _XOPEN_SOURCE >= 500
                                 || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
                                 || /* Glibc versions <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
                         strndup():
                             Since glibc 2.10:
                                 _POSIX_C_SOURCE >= 200809L
                             Before glibc 2.10:
                                 _GNU_SOURCE

                  En pratique, mettre  -D_XOPEN_SOURCE=700  dans les options de compilation.

                  https://stackoverflow.com/questions/5378778/what-does-d-xopen-source-do-mean

                  -
                  Edité par michelbillaud 16 mai 2019 à 10:52:42

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Chaîne de caractère dans un tableau

                  × 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