Structures, pointeurs, malloc et realloc reunis !! :)

cs_mindark Messages postés 21 Date d'inscription vendredi 13 octobre 2000 Statut Membre Dernière intervention 27 janvier 2003 - 13 mai 2002 à 22:59
cs_mindark Messages postés 21 Date d'inscription vendredi 13 octobre 2000 Statut Membre Dernière intervention 27 janvier 2003 - 15 mai 2002 à 13:02
Alors la, je suis completement coulé !
Voila mon probleme :

J'ai une tableau "grid" qui est un tableau de structures "cell" :

struct cell {
bool bloquant;
int sol;
int decor;
bool decor_anime;
int frame;
};

Et je veux creer un tableau a 2 dimensions ke je peux redimensionner.

Le probleme, c ke je comprend bien les pointeurs pr les tableaux a 1 dimension, mais a 2 g du mal, et encore plus si je veux faire des realloc.. :-\

En gros, ma (plutot mes) question(s) :

Comment declarer grid[100][100] dans un 1er temps, puis comment utiliser realloc pr changer la taille.
Et enfin, comment j'accede a l'element x,y de mon tableau.

Merci d'avance

6 réponses

cs_THP Messages postés 13 Date d'inscription mardi 7 mai 2002 Statut Membre Dernière intervention 15 mai 2002 1
15 mai 2002 à 09:43
Le problême que l'on peut avoir avec les realloc()
vient du fait que l'adresse memoire du bloc risque de changer. C'est a dire que la séquence du type

cell* mycell = &tab.tab[i][j];

Realloc....

mycell réference alors probablement une adresse incorrecte.
Tout accès à mycell->xxx peut générer une erreur
"access violation"

Tu peux mettre les lignes de code
"autour" de l'appel à ReallocCellTAb()
sur le forum ??
1
cs_THP Messages postés 13 Date d'inscription mardi 7 mai 2002 Statut Membre Dernière intervention 15 mai 2002 1
14 mai 2002 à 10:38
Ci dessous exemple de code pour
gérer ce problême:

typedef struct {
int nbligne, nbcolonne;
struct cell **tab;
} cellTab ;

void InitCellTab( cellTab* tab )
{tab->nbligne tab->nbcolonne 0;
tab->tab = NULL;
}

int ReallocCellTab( cellTab* tab, int newligne, int newcolonne )
{
if ( tab->tab == NULL )
tab->tab = ( cell** )malloc( newligne*sizeof(cell*) );
else
tab->tab = ( cell** )realloc( tab->tab, newligne*sizeof(cell*) );

for ( int i = 0; i < newligne; i++ )
{
if ( tab->tab[i] == NULL )
tab->tab[i] = (cell*)malloc( newcolonne*sizeof(cell) );
else
tab->tab[i] = (cell*)realloc( tab->tab[i],newcolonne*sizeof(cell) );
}

tab->nbligne = newligne;
tab->nbcolonne = newcolonne;
return 0;

}

int main ()
{
cellTab tab;

InitCellTab( &tab );
ReallocCellTab( &tab, 100, 100 );

... tab.tab[ ma_ligne ][ ma_colonne ]....

ReallocCellTab( &tab, 400, 400 );

}
0
cs_mindark Messages postés 21 Date d'inscription vendredi 13 octobre 2000 Statut Membre Dernière intervention 27 janvier 2003
15 mai 2002 à 03:00
Merci de ton aide.
J'ai essaye le code que tu m'as donne, mais il semble qu'il y ait un probleme.

Tout d'abord, je dois expliquer une chose :
Les "cells" correspondent en fait a des cases pr un jeu en 3D iso (des tiles).

Le tableau correspond a l'ensemble de tt ces tiles.
Quand je sors du tableau avec mon perso, le jeu plante.

Avec tes sources, la 1ere utilisation de ReallocCellTab marche bien (c'ead utilisation de malloc)

Puis j'essaie de redimensionner mon tableau, il n'y a pas d'erreur, a part ke je plante qd j'essaie d'aller sur les cases nouvellement crees.

En gros, tt ca pr dire que ta fonction ne fait pas d'erreur, compile bien, et ne plante pas a l'utilisation, mais il semble qd meme k'il y ait un probleme...

Une idée du probleme ?
0
cs_mindark Messages postés 21 Date d'inscription vendredi 13 octobre 2000 Statut Membre Dernière intervention 27 janvier 2003
15 mai 2002 à 11:07
Ok, je vais essayer de faire simple :

//Declaration des structures

struct cell {
bool bloquant;
int sol;
int decor;
bool decor_anime;
int frame;
};

typedef struct {
int nbligne, nbcolonne;
struct cell **tab;
} cellTab ;

Map::Map ()
{
//Initialisation de notre gridgrid.nbligne grid.nbcolonne 100;

grid.tab = ( cell** )malloc( 100*sizeof(cell*) );
for ( int i = 0; i < 100; i++ )
{
grid.tab[i] = (cell*)malloc( 100*sizeof(cell) );
}

for (int i=0;i<100;i++)
for (int j=0;j<100;j++)
{
grid.tab[i][j].sol=0;
grid.tab[i][j].decor=0;
grid.tab[i][j].decor_anime=false;
grid.tab[i][j].frame=0;
grid.tab[i][j].bloquant=false;
}
}

void Map::redimensionne(int newligne, int newcolonne )
{
grid.tab = ( cell** )realloc( grid.tab, newligne*sizeof(cell*) );

for ( int i = 0; i < newligne; i++ )
{
grid.tab[i] = (cell*)realloc( grid.tab[i],newcolonne*sizeof(cell) );
}

grid.nbligne = newligne;
grid.nbcolonne = newcolonne;
}

Et ds le main.cpp :

Map mamap=new Map (); //Ca marche bien
mamap->redimensionne(200,200) // a l'air de marcher
mamap->grid.tab[150][150].sol=3; //plante ici

Cependant, a priori ca marche certaines fois, mais plante pr d'autres valeurs nbligne..

Merci pr ton aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_THP Messages postés 13 Date d'inscription mardi 7 mai 2002 Statut Membre Dernière intervention 15 mai 2002 1
15 mai 2002 à 11:21
Honte sur moi!!! j'ai effectivement oublié qq chose
Voici le code corrigé
(Reallocation n'initialise pas à NULL les nouvelles
colonnes, d'ou plantage "aléatoire" )

void Map::redimensionne(int newligne, int newcolonne )
{
grid.tab = ( cell** )realloc( grid.tab, newligne*sizeof(cell*) );

// Correction, NULL sur les nouvelles colonnes
for ( int k = grid.nbligne; k < newligne; k++ )
grid.tab[k] = NULL;

for ( int i = 0; i < newligne; i++ )
{
if ( grid.tab[i] == NULL )
grid.tab[i] = (cell*)malloc( newcolonne*sizeof(cell) );
else
grid.tab[i] = (cell*)realloc( grid.tab[i],newcolonne*sizeof(cell) );
}

grid.nbligne = newligne;
grid.nbcolonne = newcolonne;
}
0
cs_mindark Messages postés 21 Date d'inscription vendredi 13 octobre 2000 Statut Membre Dernière intervention 27 janvier 2003
15 mai 2002 à 13:02
Merci bcp, ca a l'air de fonctionner ;)

A+
0
Rejoignez-nous