IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

l' allocation d'un tableau statique avec une taille donnée par l'utilisateur


Sujet :

C

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 1
    Points : 2
    Points
    2
    Par défaut l' allocation d'un tableau statique avec une taille donnée par l'utilisateur
    bonjour , je suis en charge de réaliser un programme de simulation de tri en utilisant différents structures de données, mais le problème que je doit utiliser un tableau d'allocation statique en demandant sa taille à l'utilisateur , comment je doit déclarer ce tableau et merci d'avance.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 558
    Points : 1 430
    Points
    1 430
    Par défaut
    Bonjour,

    Alors je ne suis pas sur de bien comprendre ton histoire, il y a deux possibilités:

    Par définition la taille d'un tableau déclaré static doit être connue à la compilation. Donc ce que tu peux faire c'est déclarer une taille maximum, et contraindre l'utilisateur à cette taille maximum. Puis à toi de gérer le nombre d'éléments dans le tableau.

    Sinon rien ne t’empêche de faire du malloc et du free sur un pointeur déclaré static. Mais je ne suis pas sur que c'est ce que tu voulais dire par tableau....

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Points : 342
    Points
    342
    Par défaut
    Hello.
    Pour utiliser un tableau dont la dimension n'est pas connue à l'avance, on utilise souvent un pointeur. Dans l'exemple, j'utilise un tableau de int. Vous pouvez utiliser le type de vos structures.
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char** argv) {
        int *p = NULL;
        int n;
     
        // Récuperer le nbre d'éléments su tableau
        scanf("%d", & n);    
     
        // Allouer le tableau
        p = malloc(n * sizeof(int));
        if (p != NULL) { // Il faut contrôler que le tableau est bien alloué
            // A partir d'ici, utiliser le pointeur comme un tableau ordinaire
            // p[0] pour le premier élément, p[n-1] pour le dernier
     
            // Libérer la mémoire, NE JAMAIS OUBLIER
            free(p);
        }
    }
    Pour plus d'infos, je vous recommande la lecture des cours de C.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par esired Voir le message
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char** argv) {
        int *p = NULL;
        int n;
     
        // Récuperer le nbre d'éléments su tableau
        scanf("%d", & n);    
     
        // Allouer le tableau
        p = malloc(n * sizeof(int));
        if (p != NULL) { // Il faut contrôler que le tableau est bien alloué
            // A partir d'ici, utiliser le pointeur comme un tableau ordinaire
            // p[0] pour le premier élément, p[n-1] pour le dernier
     
            // Libérer la mémoire, NE JAMAIS OUBLIER
            free(p);
        }
    }
    Salut
    Pas mal ton exemple (+1). Toutefois si tu as 3 malloc à faire en cascade, avec le décalage des blocs de test tu vas te retrouver complètement à droite de ton écran pour programmer ensuite...

    Regarde plutôt celui-là
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char** argv) {
        int *p = NULL;
        int n;
     
        // Récuperer le nbre d'éléments su tableau
        scanf("%d", & n);    
     
        // Allouer le tableau
        p = malloc(n * sizeof(int));
        if (p == NULL) { // Il vaut mieux plutôt vérifier le pb
            fprintf(stderr, "Erreur alloc(%d) - %s\n", n, strerror(errno));
     
            // La fonction ne peut plus continuer son travail
            return -1;
        }
     
        // A partir d'ici, utiliser le pointeur comme un tableau ordinaire
        // p[0] pour le premier élément, p[n-1] pour le dernier
     
        // Libérer la mémoire, NE JAMAIS OUBLIER
        free(p);
    }

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Points : 342
    Points
    342
    Par défaut
    @Sve@r :

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Le problème de l'exemple de Sve@r, c'est que quelqu'un peut alors être tenté de faire ceci:
    Code incorrect : 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
    int main(int argc, char** argv) {
        int *p = NULL, *p2=NULL;
        int n;
     
        // Récuperer le nbre d'éléments su tableau
        scanf("%d", & n);    
     
        // Allouer le tableau
        p = malloc(n * sizeof(int));
        if (p == NULL) { // Il vaut mieux plutôt vérifier le pb
            fprintf(stderr, "Erreur alloc(%d) - %s\n", n, strerror(errno));
     
            // La fonction ne peut plus continuer son travail
            return -1;
        }
        p2 = malloc(n * sizeof(int));
        if (p2 == NULL) { // Il vaut mieux plutôt vérifier le pb
            fprintf(stderr, "Erreur alloc(%d) - %s\n", n, strerror(errno));
     
            // La fonction ne peut plus continuer son travail
            return -1; //Oups! fuite de mémoire!
        }
     
        // A partir d'ici, utiliser le pointeur comme un tableau ordinaire
        // p[0] pour le premier élément, p[n-1] pour le dernier
     
        // Libérer la mémoire, NE JAMAIS OUBLIER
        free(p);
        free(p2);
    }
    Et si tu ajoutes des allocations, il faut répéter dans chaque if(fail) le nettoyage de chaque allocation précédente...

    Les trois moyens les plus courants d'éviter ceci sont:
    • Le code initial, avec décalage à droite
    • S'arranger pour gérer une seule ressource par fonction
    • Un des rares usages "reconnus" du goto:
      Code incorrect : 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
      int main(int argc, char** argv) {
          int ret = -1;
          int *p = NULL, *p2=NULL;
          int n;
       
          // Récuperer le nbre d'éléments su tableau
          scanf("%d", & n);    
       
          // Allouer le tableau
          p = malloc(n * sizeof(int));
          if (p == NULL) { // Il vaut mieux plutôt vérifier le pb
              fprintf(stderr, "Erreur alloc(%d) - %s\n", n, strerror(errno));
       
              // La fonction ne peut plus continuer son travail
              goto cleanup;
          }
          p2 = malloc(n * sizeof(int));
          if (p2 == NULL) { // Il vaut mieux plutôt vérifier le pb
              fprintf(stderr, "Erreur alloc(%d) - %s\n", n, strerror(errno));
       
              // La fonction ne peut plus continuer son travail
              goto cleanup;
          }
       
          // A partir d'ici, utiliser le pointeur comme un tableau ordinaire
          // p[0] pour le premier élément, p[n-1] pour le dernier
       
         ret = 0;
       
          // Libérer la mémoire, NE JAMAIS OUBLIER
      cleanup:
          free(p);
          free(p2);
          return ret;
      }

Discussions similaires

  1. [MySQL] Remplir un tableau associatif avec une boucle while
    Par Palsajicoco dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/07/2009, 09h59
  2. [SQL] Faire un tableau comparatif avec une requete SQL
    Par AnGe7s dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/12/2007, 14h06
  3. [C# 2.0] Tableau statique dans une méthode
    Par margagn dans le forum Framework .NET
    Réponses: 4
    Dernier message: 21/05/2007, 12h46
  4. [MySQL] Tableau rempli avec une requête
    Par jolonghorn dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 02/01/2007, 19h39
  5. Réponses: 7
    Dernier message: 21/12/2005, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo