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 :

Problème d'allocation d'un tableau à 3 dimensions


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Par défaut Problème d'allocation d'un tableau à 3 dimensions
    Bonjour !
    J'ai un Gros gros souci : je suis pas tres fort avec l'alloc dyn, et pas de po, j'ai besoin de 2 tableau dynamique a 3 dimension contenants :
    un pointeur sur un SDL_Surface
    un SDL_Rect

    et un tab a deux dimension contenant un nombre...
    Bien entendu, mon code y marche pas (le prog demarre et s'arrete aussitot...)
    voici moj code :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    /*FONCTION DE CONSTRUCTION*/
    void initialiser_decors(Decors *decors, int l_monde, int h_monde)
    {
    	int i = 0, j = 0, k = 0;
     
    	char nom_all_decors[150];
     
    	dictionary *all_decors = NULL;
     
    	int nb_decors_carte = 0;
     
    	char sk[10] = "";
     
    	decors->surf = malloc(sizeof(*decors->surf) * l_monde); /*1ere dim...*/
    	decors->pos = malloc(sizeof(*decors->pos) * l_monde);
    	decors->nb_decors = malloc(sizeof(*decors->nb_decors) * l_monde);
     
    	if(decors->surf != NULL && decors->pos != NULL && decors->nb_decors != NULL)
    	{
    		for(i = 0 ; i < l_monde ; i ++)/*parcourir la 1ere dim...*/
    		{
    			decors->surf[i] = malloc(sizeof(*decors->surf) * h_monde);/*2eme dim*/
    			decors->pos[i] = malloc(sizeof(*decors->pos) * h_monde);
    			decors->nb_decors[i] = malloc(sizeof(*decors->nb_decors) * h_monde);
     
    			if(decors->surf[i] != NULL && decors->pos[i] != NULL && decors->nb_decors != NULL)
    			{
    				for(j = 0 ; j < h_monde ; j ++)/*parcourir la 2eme dim...*/
    				{
    					sprintf(nom_all_decors, "quetes/Q1/monde/%d-%d/decors.map", i, j);
    					all_decors = iniparser_load(nom_all_decors);
     
    					nb_decors_carte = iniparser_getint(all_decors, "settings:nb", 0);
    					decors->nb_decors[i][j] = nb_decors_carte;
     
    					decors->surf[i][j] = malloc(sizeof(*decors->surf) * nb_decors_carte);
    					decors->pos[i][j] = malloc(sizeof(*decors->pos) * nb_decors_carte);
    					if(decors->surf[i][j] != NULL && decors->pos[i][j] != NULL)
    					{
    						for(k = 0 ; k < nb_decors_carte ; k ++)
    						{
    							sprintf(sk, "D%d:img", k);
    							decors->surf[i][j][k] = IMG_Load(iniparser_getstr(all_decors, sk));
    							sprintf(sk, "D%d:x", k);
    							decors->pos[i][j][k].x = iniparser_getint(all_decors, sk, 0);
    							sprintf(sk, "D%d:y", k);
    							decors->pos[i][j][k].y = iniparser_getint(all_decors, sk, 0);
    						}
    					}
     
    					iniparser_freedict(all_decors);
    				}
    			}
    		}
    	}
    }
     
    /*FONCTION DE DESTRUCTION*/
    void nettoyer_decors(Decors *decors, int l_monde, int h_monde)
    {
    	int i = 0, j = 0, k = 0;
     
    	for(i = 0 ; i < l_monde ; i ++)
    	{
    		for(j = 0 ; j < h_monde ; j ++)
    		{
    			for(k = 0 ; k < decors->nb_decors[i][j] ; k ++)
    			{
    				SDL_FreeSurface(decors->surf[j][i][k]);
    			}
    		}
    	}
     
    	free(*decors->surf);
    	free(*decors->pos);
    	free(*decors->nb_decors);
     
    	free(decors->surf);
    	free(decors->pos);
    	free(decors->nb_decors);
    }
     
    /*STRUCT DECORS*/
    typedef struct Decors Decors;
    struct Decors
    {
    	SDL_Surface ****surf;
    	SDL_Rect ***pos;
    	int **nb_decors
    };
    Si vous pouviez m'aider a resoudre ce pb, svp ...
    merci, @+

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par vivh349
    Bonjour !
    J'ai un Gros gros souci : je suis pas tres fort avec l'alloc dyn, et pas de po, j'ai besoin de 2 tableau dynamique a 3 dimension contenants :
    un pointeur sur un SDL_Surface
    un SDL_Rect

    et un tab a deux dimension contenant un nombre...
    Bien entendu, mon code y marche pas (le prog demarre et s'arrete aussitot...)
    voici moj code :
    Voilà comment on fait pour 2 dimensions :
    http://emmanuel-delahaye.developpez.....htm#tabdyn_2d
    Je te laisse extrapoler pour 3...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Par défaut
    merci...

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Déjà ceci me semble plus juste :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    /*STRUCT DECORS*/
    struct Decors
    {
    	SDL_Surface ****surf;
    	SDL_Rect ***pos;
    	int **nb_decors;
    };
    typedef struct Decors Decors;
     
    /*FONCTION DE DESTRUCTION*/
    void nettoyer_decors(Decors *decors, int l_monde, int h_monde)
    {
    	int i = 0, j = 0, k = 0;
     
    	for(i = 0 ; i < l_monde ; i ++)
    	{
    		for(j = 0 ; j < h_monde ; j ++)
    		{
    			for(k = 0 ; k < decors->nb_decors[i][j] ; k ++)
    			{
    				SDL_FreeSurface(decors->surf[i][j][k]);
    			}
    			free(decors->surf[i][j]);
    			free(decors->pos[i][j]);
    		}
    		free(decors->surf[i]);
    		free(decors->pos[i]);
    		free(decors->nb_decors[i]);
    	}
     
    	free(decors->surf);
    	free(decors->pos);
    	free(decors->nb_decors);
    }
     
     
     
    /*FONCTION DE CONSTRUCTION*/
    void initialiser_decors(Decors *decors, int l_monde, int h_monde)
    {
    	int i = 0, j = 0, k = 0;
     
    	char nom_all_decors[150];
     
    	dictionary *all_decors = NULL;
     
    	int nb_decors_carte = 0;
     
    	char sk[10] = "";
     
    	decors->surf = malloc(sizeof(*decors->surf) * l_monde); /*1ere dim...*/
    	decors->pos = malloc(sizeof(*decors->pos) * l_monde);
    	decors->nb_decors = malloc(sizeof(*decors->nb_decors) * l_monde);
     
    	if(decors->surf != NULL && decors->pos != NULL && decors->nb_decors != NULL)
    	{
    		for(i = 0 ; i < l_monde ; i ++)/*parcourir la 1ere dim...*/
    		{
    			decors->surf[i] = malloc(sizeof(**decors->surf) * h_monde);/*2eme dim*/
    			decors->pos[i] = malloc(sizeof(**decors->pos) * h_monde);
    			decors->nb_decors[i] = malloc(sizeof(**decors->nb_decors) * h_monde);
     
    			if(decors->surf[i] != NULL && decors->pos[i] != NULL && decors->nb_decors != NULL)
    			{
    				for(j = 0 ; j < h_monde ; j ++)/*parcourir la 2eme dim...*/
    				{
    					sprintf(nom_all_decors, "quetes/Q1/monde/%d-%d/decors.map", i, j);
    					all_decors = iniparser_load(nom_all_decors);
     
    					nb_decors_carte = iniparser_getint(all_decors, "settings:nb", 0);
    					decors->nb_decors[i][j] = nb_decors_carte;
     
    					decors->surf[i][j] = malloc(sizeof(***decors->surf) * nb_decors_carte);
    					decors->pos[i][j] = malloc(sizeof(***decors->pos) * nb_decors_carte);
    					if(decors->surf[i][j] != NULL && decors->pos[i][j] != NULL)
    					{
    						for(k = 0 ; k < nb_decors_carte ; k ++)
    						{
    							sprintf(sk, "D%d:img", k);
    							decors->surf[i][j][k] = IMG_Load(iniparser_getstr(all_decors, sk));
    							sprintf(sk, "D%d:x", k);
    							decors->pos[i][j][k].x = iniparser_getint(all_decors, sk, 0);
    							sprintf(sk, "D%d:y", k);
    							decors->pos[i][j][k].y = iniparser_getint(all_decors, sk, 0);
    						}
    					}
     
    					iniparser_freedict(all_decors);
    				}
    			}
    		}
    	}
    }
    Jc

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Par défaut
    pourquoi quand je creer un pointeur Decors *decors = NULL;, le prog plante ?????
    parce que bon, fearyourself, ton code, y marchait pas avec dans le main :
    Decors *decors = NULL;
    initialiser_decors(decors,....)

    et quand j'ai mis
    Decors decors;
    initialiser_decors(&decors,....)

    miracle sa marchait(enfin o moins le prog y se lance... )...

    enfin merci bocoup, je crois que c'est bon ^^

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par vivh349
    pourquoi quand je creer un pointeur Decors *decors = NULL;, le prog plante ?????
    parce que bon, fearyourself, ton code, y marchait pas avec dans le main :
    Decors *decors = NULL;
    initialiser_decors(decors,....)

    et quand j'ai mis
    Decors decors;
    initialiser_decors(&decors,....)

    miracle sa marchait(enfin o moins le prog y se lance... )...

    enfin merci bocoup, je crois que c'est bon ^^
    Il faudra que tu revois tes cours sur l'allocation dynamique car en passant un pointeur NULL à ta fonction initialiser_decors, tu arrives dans un mur à l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    decors->surf = malloc(sizeof(*decors->surf) * l_monde); /*1ere dim...*/
    Il faut allouer l'espace pour decors avant de s'en servir, ce qui n'est pas fait dans le cas d'un pointeur simple non initialisé ou mis à NULL.

    Jc

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/06/2008, 18h05
  2. [C]Allocation d'un tableau à deux dimensions
    Par Geoffrey49000 dans le forum Windows
    Réponses: 5
    Dernier message: 07/12/2007, 00h06
  3. Réponses: 9
    Dernier message: 12/06/2007, 14h15
  4. Réponses: 6
    Dernier message: 25/02/2007, 17h56
  5. Réponses: 2
    Dernier message: 14/12/2006, 15h34

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