Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de compréhension sur un code... (tableau)

Tableau dynamique

Sujet résolu
    6 janvier 2022 à 18:54:45

    Bonjour,

    En cours certaines choses ont été vu mais j'ai raté quelques cours, j'essaye alors de comprendre certains éléments de mon cours... Pouvez-vous m'aider je vous prie...

    On a définie en language c un type structuré dynarray contenant un pointeur content vers un tableau d'entier alloué dans le tas, un entier size representant le nombre d'éléments dans la structure et un entier alloc representant la taille allouée par le tableau content

    typedef struct dynarray {
    int* content;
    intsize;
    intalloc;
    }* dynarray;

    jusque là ok... Puis on voulait definir une fonction qui renvoie un tableau vide: le prof écrit

    dynarray empty() {
    dynarray rep = malloc(sizeof(struct dynarray));
    int* content = malloc(1*sizeof(int));
    rep->content = content;
    rep->size= 0;
    rep->alloc= 1;
    return rep;
    }

    Or je ne comprends pas d'une, que représente le malloc, quelle est le paramètre qui est mis au sein du malloc et que renvoie t-il ? Aussi pouvez vous je vous prie m'expliquer chaques lignes en détail, que se passe t-il à chaques étape ? Qu'est ce que la -> ? ...

    -
    Edité par EL_dano 6 janvier 2022 à 19:28:41

    • Partager sur Facebook
    • Partager sur Twitter
      6 janvier 2022 à 19:20:28

      Utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à droite du post).

      malloc

      Les structures. (ça explique la ->)

      -
      Edité par rouIoude 6 janvier 2022 à 19:28:46

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        6 janvier 2022 à 20:13:07

        Le "paramètre" qui est mis au sein de malloc dans la ligne dynarray rep = malloc(sizeof(struct dynarray)); est sizeof(struct dynarray)

        sizeofest un opérateur du langage C qui renvoie en bytes la taille occupée en mémoire d'un type ou d'une expression. Ici, c'est la taille occupée par le type struct dynarray qui est renvoyée, ce qui permet à malloc()de réserver la bonne quantité de mémoire pour un élément du type struct dynarray et à cette ligne d'affecter l'adresse mémoire ainsi réservée à un pointeur sur le type struct dynarray (note : voir mon edit ci-dessous)

        Une documentation de référence sur sizeof :

        https://en.cppreference.com/w/c/language/sizeof


        Edit :

        La déclaration typedef fait du "tout en un" particulièrement alambiqué et trompeur en définissant dynarray comme étant un alias du type struct dynarray * c'est à dire un pointeur sur struct. C'est le type de trucs parfait pour se tirer une balle dans le pied car le typedef masque la nature réelle de l'objet manipulé.

        C'est un machin qui ferait hurler Linus Tolvalds : https://www.kernel.org/doc/html/v4.10/process/coding-style.html#typedefs

        -
        Edité par Dlks 6 janvier 2022 à 20:30:20

        • Partager sur Facebook
        • Partager sur Twitter
          6 janvier 2022 à 20:35:19

          Bonjour,

          Le code que tu veux qu'on te commente est un code qui compile et qui fait son boulot, il retourne bien un pointeur sur un struct dynarray qui contient un tableau vide. Mais quelqu'un qui écrirait cela se ferait virer dans l'heure dans ma boite!
          Ton prof arrive à avoir un même nom (dynarray) qui désigne 2 types différents et dont un est un pointeur! Par exemple la première ligne dans la fonction utilise 2 fois ce mot, mais ce sont 2 choses distinctes.

          Je crains donc que ses explications sur les pointeurs soient insuffisantes. Tu devrais aussi lire sur le même site que t'a conseillé la section concernant les pointeurs.
          Et reviens pour des explications complémentaires.

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            7 janvier 2022 à 10:28:54

            La flèche permet de déréférencer un membre de la struct, c’est à dire que "a->foo" est équivalent à "(*a).foo".

            Mais ce que je ne comprends pas c’est pourquoi allouer un tableau vide ? Et qui plus est en réservant la place pour un entier ?? Donc c’est pas un tableau vide... Et en plus dynarray est un pointeur ? Doux Jesus

            Un tableau vide ça serait plutôt "struct dynarray tab = {0};"

            Et c’est en ajoutant des éléments (avec une fonction "push" par exemple) que ça ferait une allocation si besoin

            • Partager sur Facebook
            • Partager sur Twitter
              8 janvier 2022 à 6:47:16

              Si tu ne comprends pas *, ->, malloc c'est que tu n'as pas les connaissances de bases sur les pointeurs.

              Tu parles de ton prof, donc tu as des cours. Revois les, discutes-en avec ton prof. Il est payé pour ça et en plus il sera content de voir qu'il y en a au moins un qui essaie de s'intéresser.

              @jadesalina il n'alloue pas un tableau vide, mais de un élement (alloc) dont pour l'instant, zero (size) est utilisé.

              (En général c'est pas malin de commencer par un seul, parce qu'un malloc réserve en pratique une taille utile arrondie au multiple suivant de 32 ou  64. Et que la probabilité de n'avoir qu'un élément dans le tableau est très faible. Donc, des reallocs inutiles (et coûteux) ensuite. Mais c'est une autre histoire)

              -
              Edité par michelbillaud 8 janvier 2022 à 13:13:29

              • Partager sur Facebook
              • Partager sur Twitter

              Problème de compréhension sur un code... (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