Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

tableau dynamique


Sujet :

C

  1. #1
    Nouveau membre du Club
    tableau dynamique
    Dans le main , lors de ma declaration de mon tableau tab , je suis obligé de rentrer une valeur entre crochet ? La j'ai mis un maximum de 20 valeurs par l'intermediaire de MAX mais le nombre de valeur rentrée dépendra du nombre d'article demandé . Je suis pas sur d'avoir été clair dans ma question
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 20
     
    int nb_article(){
     int nb;
     do{
       printf("Nombre d'article voulu:\n");
       scanf("%d",&nb);
       }while(nb<5);
    return nb;
    }
     
     
    void taille(int t,int tab[]){
     int i;
     for(i=0;i<t;i++){
      printf("Entrez une taille:");
      scanf("%d",&tab[i]);}
    }
     
    int main(){
     int tab[MAX];
     int nombre,i;
     
     nombre=nb_article();
     taille(nombre,tab);
     
     printf("Le nombre d'article choisi est de:%d\n",nombre);
     printf("Les tailles choisis sont:\n");
     for(i=0;i<nombre;i++)
      printf("%d\n",tab[i]);
      puts("\n");
     return 0;
    }

  2. #2
    Responsable 2D/3D/Jeux

    Bonjour,

    En C, pour obtenir un tableau dynamique (dont la taille n'est connue que lors de l'exécution), il faut utiliser la fonction malloc (et free). malloc demande à votre système d'exploitation d'attribuer de la mémoire pour votre programme. free permet de lui rendre (pour qu'il puisse la réutiliser pour d'autres programmes/choses).

    Du coup, ça donnerait :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int* tab = malloc(MAX * sizeof(*tab));
    if(tab == NULL)
    {
        printf("Erreur d'allocation\n");
        return -1;
    }
    // ...
    // exemple d'utilisation :
    // tab[1] = 10
    free(tab);
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Expert éminent sénior
    Citation Envoyé par chris7522 Voir le message
    Dans le main ,
    Bonjour à toi aussi
    Citation Envoyé par chris7522 Voir le message
    lors de ma declaration de mon tableau tab , je suis obligé de rentrer une valeur entre crochet ?
    Tu as trois façons de programmer ce genre d'algo

    La plus sécurisée: tu fais comme l'a dit LittleWhite: tu récupères la taille nécessaire puis tu alloues de la mémoire en quantité suffisante pour stocker un tableau de cette taille. Tu dois obligatoirement prévoir le cas où cette allocation ne peut pas se faire (enfin pas pour un simple TP mais je parle d'un vrai programme industriel) et donc coder une solution alternative (généralement on arrête le traitement et on remonte une info pour prévenir l'appelant comme le montre LittleWhite) et aussi coder la libération du tableau.
    Là encore ça le fait assez facilement car le tableau est en une dimension mais quand tu commences à entrer dans la 2D (par exemple un tableau de chaines) ça devient vite coton à programmer (surtout la partie où tu veux allouer 50 chaines et où l'allocation plante à la 49°)...

    La plus simple: tu considères que dans un traitement normal, il n'y aura pas plus de "MAX" éléments et tu définis ce "MAX" de façon arbitraire (comme tu l'as fait). Tu peux aussi renforcer la fonction qui saisit le nombre d'articles pour que l'utilisateur ne puisse pas mettre plus que "MAX". Et si demain "MAX" change, tu n'as qu'une modif à faire et recompiler pour que tout ton code s'adapte à la nouvelle valeur.

    Une 3° qui se veut comme la première en simplifié: les VLA (Variable Length Array). C'est un truc assez récent du C où tu as le droit d'écrire par exemple n=nb_article(); int tab[n]. Le souci de cette 3° méthode c'est que si la réservation de place ne peut pas se faire, tu n'as aucun moyen de le savoir et ton programme explose en vol. Bref ce n'est pas un truc que je recommande mais bien entendu tout dépend toujours de la criticité de ton programme. Si c'est une démo style "TP école" ok mais si ça doit gérer le calculateur d'un MCAS...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  4. #4
    Nouveau membre du Club
    Bien compris . Merci a tous d' avoir pris le temps pour toutes ces explications