Allocation dynamique dans un sous programme
Résolu
CherryBlondy
Messages postés
16
Statut
Membre
-
CherryBlondy Messages postés 16 Statut Membre -
CherryBlondy Messages postés 16 Statut Membre -
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 !
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:
- Allocation dynamique dans un sous programme
- Tableau croisé dynamique - Guide
- Programme demarrage windows - Guide
- Comment mettre en veille un programme sous windows 10 - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Exemple tableau croisé dynamique télécharger - Télécharger - Tableur
1 réponse
Salut,
J'ai pas tout lu mais il y a déjà une chose qui m'interpelle.
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 :
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,
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 :
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 :
Cdlt
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
et merci encore =)
bonne soirée