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 :

Tableau à double dimension


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut Tableau à double dimension
    Bonjour,

    J'ai un problème dans mon programme actuel et j'aurais souhaité que vous m'apportiez un peu d'aide.

    En fait, j'ai mon programme qui ressemble à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Declaration des variables
    (...)
    //Traitement du main
    (...)
    //Declaration d'un tableau
    char tableauMachine[compteurTableauMachine][256];
    //Reprise du traitement du main
    (...)
    Un problème de "conscience" que j'avais quant à déclarer une variable au beau milieu d'un code s'est transformé en erreur révélée par le compilateur GCC.

    main.c:179: erreur: «tableauMachine» undeclared (first use in this function)
    Alors que ma déclaration est en ligne 106.

    Alors je me suis dit que je pouvais peut être pallier à ce problème via un malloc puis realloc.

    Mais je ne sais pas du tout comment l'utiliser par rapport à un tableau à double dimension...
    void *malloc (size_t size);
    void *realloc (void *ptr, size_t size);

    En fait, pour être plus précise quant à mon problème et la solution que j'avais choisi, il se trouve que j'ai un fichier que je devrais constamment ouvrir et fermer si je devais le garder tel quel, chose coûteuse en temps.
    Alors j'ai décidé de lire une première fois ce fichier, compter le nombre de ligne puis créer ce tableau, avec pour nombre de ligne celui du fichier, un nombre de colonne fixe (256, arbitraire)

    Mais ça ne marche pas

    Une idée?
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  2. #2
    Membre du Club Avatar de Mayhem555
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Points : 46
    Points
    46
    Par défaut
    Salut.
    Pour faire une allocation dynamique d'un tableau en 2D, il faut faire une boucle avec des malloc.
    Un tableau à deux dimensions n'étant rien d'autre qu'un tableau de tableaux (ou un pointeur de pointeurs )

    Ça donne quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char **tableau ;
    tableau = (char**) malloc (nbLignes*sizeof(char*)) ;
     
     
    for (i = 0 ; i < nbLignes ; i++)
    {
         *(tableau+i) = (char*) malloc (nbColonnes * sizeof (char)) ;
    }

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Mayhem555 Voir le message
    Ça donne quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char **tableau ;
    tableau = (char**) malloc (nbLignes*sizeof(char*)) ;
     
     
    for (i = 0 ; i < nbLignes ; i++)
    {
         *(tableau+i) = (char*) malloc (nbColonnes * sizeof (char)) ;
    }
    A quoi servent tous ces casts ?

    En utilisant le principe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T *p = malloc (sizeof *p * n);
    ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char **tableau = malloc (nbLignes * sizeof *tableau);
     
    for (i = 0 ; i < nbLignes ; i++)
    {
         tableau[i] = malloc (nbColonnes * sizeof *tableau[i]);
    }
    tout simplement...
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char **tableau = malloc (nbLignes * sizeof *tableau);
     
    for (i = 0 ; i < nbLignes ; i++)
    {
         tableau[i] = malloc (nbColonnes * sizeof *tableau[i]);
    }
    hum... Le premier malloc gère le nombre de ligne et le second dans le for, le nombre de colonne par ligne?

    à quoi correspond le " char **tableau" ?
    zero ou plusieurs caractères et un pointeur vers le tableau?

    J'aimerai comprendre plutôt que de reprendre bêtement du code ^^'


    Par contre... Sauriez vous si la déclaration d'une variable (en l'occurrence le tableau à deux dimensions) dans le corps du programme n'est effectivement pas prise en compte où s'il s'agit d'une autre erreur?

    Ceci dit, merci à vous deux.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    hum... Le premier malloc gère le nombre de ligne et le second dans le for, le nombre de colonne par ligne?

    à quoi correspond le " char **tableau" ?
    zero ou plusieurs caractères et un pointeur vers le tableau?

    J'aimerai comprendre plutôt que de reprendre bêtement du code ^^'
    http://emmanuel-delahaye.developpez.....htm#tabdyn_2d
    Par contre... Sauriez vous si la déclaration d'une variable (en l'occurrence le tableau à deux dimensions) dans le corps du programme n'est effectivement pas prise en compte où s'il s'agit d'une autre erreur?
    B.A. BA du C : une variable doit être définie en début de bloc. On a le droit de définir un bloc où veut. La portée est définie par le bloc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    f()
    {
       /* instructions ... */
       {
           int x;
           /* instructions ... */
       }
       /* instructions ... */
    }
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    En effet, j'étais en dehors du bloc où j'ai déclaré la variable...

    Merci pour ce rappel du B.A. BA
    Je ne le savais pas et ne l'avait pas encor lu...

    Merci pour le lien.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. creation d'un tableau double dimension dynamiquement
    Par elmcherqui dans le forum C++
    Réponses: 3
    Dernier message: 09/07/2009, 20h05
  2. Tableau à double dimension
    Par 0635425 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 25/02/2008, 09h46
  3. Mettre un tableau à double dimension en session
    Par The Molo dans le forum ASP
    Réponses: 4
    Dernier message: 20/02/2008, 14h54
  4. Afficher un tableau à double dimension
    Par The Molo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/02/2008, 12h37
  5. [FLASH MX] Tableau à double dimension
    Par totoche dans le forum Flash
    Réponses: 4
    Dernier message: 11/10/2005, 22h04

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