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 de dimension 2


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut Tableau de dimension 2
    Bonsoir, je voudrais essayer de comprendre pourquoi le code suivant me produit une erreur de segmentation au niveau de la fonction initPlateau

    affichage .c
    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
    36
    37
    38
    39
     
    #include "affichage.h"
    #include <stdio.h>
    #include <stdlib.h>
     
    Plateau** initPlateau()
    {
    	Plateau** P=NULL;
    	int k;
    	int k2;
    	for(k=0;k<TAILLE_PLATEAU_LARGEUR;k++)
    	{
    		for(k2=0;k2<TAILLE_PLATEAU_LONGUEUR;k2++)
    		{
    			**P[k][k2]=' ';
    		}
    	}
    	return P;
    }
     
    void afficheLigne()
    {
    	printf("\n_______________");
    }
     
    void affichagePlateau(Plateau** P)
    {
    	int k;
    	int k2;
    	for(k=0;k<TAILLE_PLATEAU_LARGEUR;k++)
    	{
    		afficheLigne();
    		for(k2=0;k2<TAILLE_PLATEAU_LONGUEUR;k2++)
    		{
    			printf("| %c  |",**P[k][k2]);
    		}
    	}
    	afficheLigne();
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    affichage.h
     
    #define TAILLE_PLATEAU_LARGEUR 5
    #define TAILLE_PLATEAU_LONGUEUR 5
     
    typedef char Plateau[TAILLE_PLATEAU_LARGEUR][TAILLE_PLATEAU_LONGUEUR];
     
    Plateau** initPlateau();
    void affichagePlateau(Plateau** P);
    void afficheLigne();

    main
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include "affichage.h"
     
    int main()
    {	
    	Plateau** P;
    	printf("OK\n"); // ==> S'affiche
    	P=initPlateau();
    	printf("OK2\n"); // ==> Ne s'affiche pas
    	affichagePlateau(P);
     
    	return 0;
    }

    Le but final est en fait un affichage au travers de Ncurses, mais j'aimerais d'abord comprendre ce qui cloche ici. Sachant que niveau syntaxique c'est correct, je dois faire quelque chose de travers dans initPlateau mais je ne vois pas où



    Merci pour votre aide !

    EDIT: Il est évident que l'erreur est sur la ligne d'affectation mais je ne comprends pas pourquoi !!!

    (Le tableau ne serait pas alloué ? Pourtant il a bien une taille fixe donné c'est un tableau statique donc ça devrait passer normalement non ?)

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Tu n'aurais pas quelques warnings à la compilation ? Tu actives bien les options pour que ton compilateur émette tous les warnings possibles (-Wall -Wextra avec gcc par exemple) ?

    Pourquoi faire un type plateau qui est un tableau 2D pour ensuite faire des plateau** ?

    Quand tu fais int *a = NULL;, as-tu alloué un tableau de int ?

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Bonsoir

    J'utilise simplement -Wall et non aucun warning.



    Oui, ta remarque est judicieuse...

    Finalement le mieux serait peut être une structure de type


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct unPlateau {
    int largeur;
    int longueur; 
    char valeur;
    }Plateau;

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Une structure sera sûrement plus pratique si tu as besoin de plusieurs tailles de plateau au cours du même programme. Si ce n'est pas le cas, une taille fixe avec un tableau à 2D est bien pratique.

    Mais quand je faisais cette remarque, ce n'était pas pour que tu remettes en question ton typedef, mais plutôt ta façon de s'en servir. Tu pourrais faire une fonction comme ceci (en pseudo code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Plateau* creer_plateau()
    {
        Plateau *p = malloc(sizeof plateau);
     
        for()
            for()
                (*p)[][]=x // à verifier, cette écriture
     
        return p; // tu peux le faire sans risque car la mémoire a été alloue dans le tas et non sur la pile
    }
    Au final, ce n'est pas très différent d'une fonction pour créer et initialiser un tableau 1D.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Moui, au final c'est pas très loin de ce que j'ai fait avec ma structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #define TAILLE_PLATEAU_LARGEUR 5
    #define TAILLE_PLATEAU_LONGUEUR 5
    #define NB_CASE (TAILLE_PLATEAU_LONGUEUR*TAILLE_PLATEAU_LARGEUR)
     
     
    typedef struct uneCase{
    	int posV;//position Verticale
    	int posH;//position Horizontale
    	char value;//valeur de la case
    }Case;
     
    typedef struct unPlateau{
    	Case cases[NB_CASE];
    }Plateau;
    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
    Plateau* initPlateau()
    {
    	Plateau *P=malloc(sizeof(char));
    	int k;
    	int k2;
    	int posCase=0;
    	for(k=0;k<TAILLE_PLATEAU_LONGUEUR;k++)
    	{
    		for(k2=0;k2<TAILLE_PLATEAU_LARGEUR;k2++)
    		{
    			P->cases[posCase].posV=k2;
    			P->cases[posCase].posH=k;
    			P->cases[posCase].value='.';
    			posCase++;
    		}
     
    	}
    	return P;
    }
    J'arrive pas à dessiner le plateau algorithmiquement avec des I et _ [...] è_é *Prend une matraque et se frappe --' *

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Si tu souhaites pouvoir aisément accéder aux cases avec l'indexage "classique" plateau[i][j] comme tu sembles vouloir le faire dans ton premier message, mieux vaut rester sur un tableau 2D plutôt qu'une structure comme celle-ci.

    Ce que tentait de te faire remarquer Bktero, c'est qu'en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef char Plateau[TAILLE_PLATEAU_LARGEUR][TAILLE_PLATEAU_LONGUEUR];
    Plateau p;
    p est directement un tableau 2D de char, et sans être question de pointeur ou allocation, tu peux d’ores et déjà accéder à p[i][j].
    C'est strictement équivalent à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char p[TAILLE_PLATEAU_LARGEUR][TAILLE_PLATEAU_LONGUEUR];
    Par contre lorsque tu fais Plateau **p, p est un pointeur de pointeur de tableau 2D. Autrement dit tu t'apprêtes à avoir M x N tableaux 2D (chacun de taille TAILLE_PLATEAU_LARGEUR x TAILLE_PLATEAU_LONGUEUR), Et non juste un tableau de TAILLE_PLATEAU_LARGEUR x TAILLE_PLATEAU_LONGUEUR char).

    Et ton programme plantait car tu initialisais ce tableau à NULL, adresse par définition invalide et non déférençable. Il t'aurais fallu d'abord initialiser tes pointeurs en les faisant pointer sur une zone mémoire fraichement allouée avec malloc(). Tu peux te faire une idée en regardant ce sujet de la FAQ.

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

Discussions similaires

  1. [Collections] lecture tableau 2 dimensions
    Par heloise dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 30/09/2004, 10h49
  2. [tableau à 2 dimensions] association String et float
    Par LoLoSS dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/07/2004, 10h53
  3. Tableau à n dimensions
    Par youb dans le forum MFC
    Réponses: 10
    Dernier message: 13/05/2004, 14h13
  4. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 14h50
  5. Réponses: 23
    Dernier message: 21/08/2003, 07h16

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