Allocation dynamique dans un sous programme

Résolu/Fermé
CherryBlondy Messages postés 16 Date d'inscription samedi 6 décembre 2008 Statut Membre Dernière intervention 3 mars 2009 - 4 févr. 2009 à 10:49
CherryBlondy Messages postés 16 Date d'inscription samedi 6 décembre 2008 Statut Membre Dernière intervention 3 mars 2009 - 4 févr. 2009 à 21:30
Bonjour à tous !

Voili voilou mon problème :

Je souhaite allouer dynamiquement un tableau à deux dimansions dans un sous programme. (si possible aussi l'inbitialiser dans un autre et tout et tout ^^)

je vosu montre ce que j'ai fait pour le moment (que la partie interessante our ça) dans mon main :

int main()
{
//declaration des ressources
int i, j, hauteur, largeu;
char **terrain;

//Taille du terrain choisit par l'utilisateur
tailleterrain(&*terrain, &hauteur, &largeur);

//initialisation du terrain
initialterrain(&*terrain, hauteur, largeur);

[...]

et mes deux sous prog :

//l'initialisation

void initialterrain(char ***terrain,int hauteur,int largeur)
{
//declaration des variables
int i, j;

//initialisation du terrain
for (i=0 ; i<hauteur ; i++)
{
for(j=0 ; j<largeur ; j++)
{
*terrain[i][j]=' ';
}
}
}

//allocation dynamique du tableau
void tailleterrain(char ***table, int *hauteur, int *largeur)
{
//declaration des variables
int i, test, lig, col;

//initialisation des variables
test = 0;
lig = 0;
col = 0;

//interface IHM
printf(" Vous allez pouvoir choisir la taille de votre plateau de jeu.\n");
printf(" Vous pouvez choisir entre toutes les combinaisons possible entre un terrain de 6x6 et 12x12\n");
printf(" A rentrer sous la forme de \'hauteur\'X\'largeur\' : ");

//blindage de la saisit
do
{
fflush(stdin);
scanf("%dX%d", hauteur, largeur);

lig = *hauteur;
col = *largeur;

//testons si les tailles saisient sont conformes
if(((lig>=6)&& (lig<=12))&& ((col>=6) && (col<=12))) test = 1;
//texte signalent à l'utilisateur si il a reussit a entrer des coordonnées conformes
if (test==0) printf("\n Vous avez saisit une taille de terrain non conformes.\n Veuillez recommencer.\n");
}while(test==0);

printf(" Vous avez choisit un terrain de \n %d cases de hauteurs et %d case de largeurs.\n", lig, col);

//allocation de la taille du terrain
table=(char**)malloc((lig)*(sizeof(char*)));

for(i=0 ; i<lig ; i++)
{
table[i]=(char*)malloc((col)*(sizeof(char)));
}

//transmistion de la taille du tableau
*hauteur = lig;
*largeur = col;
}

Après ej sais pas combien de modificcation dans les pointures (un peu breaucoup au peetit bonheur la cahnce) mon programme a arrete de se bloquer à l'allocation mais il aime pas du tout l'initialisation !

Je me tourne donc vers vous pour recevoir votre aide *_*

d'avance merci à tous !
A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
4 févr. 2009 à 13:49
Salut,
J'ai pas tout lu mais il y a déjà une chose qui m'interpelle.
char **terrain; //déclaration de terrain
tailleterrain(&*terrain, &hauteur, &largeur);  //appel
void tailleterrain(char ***table, int *hauteur, int *largeur); //prototype

Si tu comptes modifier le pointeur terrain. Effectivement il faut passer par un pointeur sur la matrice donc ici, un triple pointeur. Par contre l'appel à la fonction est faux. Mets plutôt :
tailleterrain(&terrain, &hauteur, &largeur);

Ce qui signifie que tu envoies l'adresse du pointeur sur la matrice terrain. Et là tu pourras allouer le pointeur.

Pour la fonction d'initialisation,
void initialterrain(char **terrain,int hauteur,int largeur) 

suffira. Tu ne modifies pas le pointeur mais les cases de la matrice. Donc pas besoin d'un pointeur sur le pointeur de la matrice.
Et l'appel devient tout simplement :
initialterrain(terrain, hauteur, largeur); 


Sinon, je n'ai pas vu les free, dans ton code. N'oublie pas de le faire, sinon tu auras des fuites mémoires.
Et enfin je t'ai vu utiliser : fflush(stdin);, et bien, cela ne doit pas être utilisé. La fonction fflush() à un comportement indéfini sur les entrées. Il faut utiliser à la place :
int c; while((c=getchar())!='\n' && c!=EOF);


Cdlt
2
CherryBlondy Messages postés 16 Date d'inscription samedi 6 décembre 2008 Statut Membre Dernière intervention 3 mars 2009
4 févr. 2009 à 21:30
Merci beaucoup Pour cette réponse !

et merci encore =)

bonne soirée
0