Bonjour,
J'ai écris un programme qui déclare, initialise puis affiche un tableau à deux dimensions. Toutefois, je souhaiterais le moduler en plusieurs fonctions : une qui déclare, une qui initialise et une qui affiche.
Le code suivant est signalé sans erreur, est compilé et fonctionne :
int main()
{
char** tab=NULL;
int lignes=5;
int colonnes=5;
//déclare un tableau
tab = malloc(sizeof(char*)*lignes);
for (int i = 0; i<lignes ; i++)
{
tab[i]=malloc(colonnes*sizeof(char*));
}
//Remplit un tableau de char
for (int i = 0; i<5 ; i++)
{
for (int j=0; j<5; j++)
{
tab[i][j]='M';
}
}
//Imprime à l'écran un tableau de char
for (int i = 0; i<5 ; i++)
{
puts("\n");
for (int j=0; j<5; j++)
{
putchar(' ');
putchar(' ');
printf("%c",tab[i][j]);
}
}
free(tab);
return 0;
}
Toutefois, dès que j'essaye de transformer ceci en fonction, à savoir comme ceci :
void DeclarationTabChar(char** tab, int lignes, int colonnes)
{
//déclare un tableau
tab = malloc(sizeof(char*)*lignes);
for (int i = 0; i<lignes ; i++)
{
tab[i]=malloc(colonnes*sizeof(char*));
}
}
void UniRemplissageTabChar(char **Tab, char caractereunique)
{
for (int i = 0; i<5 ; i++)
{
printf("ok");
for (int j=0; j<5; j++)
{
printf("ok");
Tab[i][j]=caractereunique;
printf("ok");
}
}
}
void AffichageTabChar(char** tab)
{
for (int i = 0; i<5 ; i++)
{
for (int j=0; j<5; j++)
{
printf("%c",tab[i][j]);
}
}
}
int main()
{
tab = malloc(sizeof(char*)*lignes);
DeclarationTabChar(tab, 5,5);
UniRemplissageTabChar(tab,'M');
AffichageTabChar(tab);
free(tab);
}
Et là, plantage systématique, le code est signalé sans erreur et est compilé, mais il plante immédiatement.
Si des âmes charitables pouvaient m'éclairer, ça ne serait pas de refus.
N.
C'est tout simplement que tu fais passer "tab" dans DeclarationTabChar mais que tu affectes la copie et non le tableau en lui même. Tu ne récupères donc jamais la tableau initialisé, mais tu conserves ton pointeur non initialisé, d'où ton erreur. Il te faudrait faire un: DeclarationTabChar(&tab, 5,5); avec en déclaration: "void DeclarationTabChar(char*** tab, int lignes, int colonnes)
"
Je te propose une solution un peu plus élégante:
#include <stdio.h>
#include <stdlib.h>
char** declarationTabChar(int lignes, int colonnes)
{
char** tab = malloc(sizeof(char*) * lignes);
for (int i = 0; i < lignes ; ++i)
tab[i] = malloc(colonnes * sizeof(char*));
return tab;
}
void uniRemplissageTabChar(char **tab, char caractereunique,
int lignes, int colonnes)
{
for (int i = 0; i < lignes ; ++i)
for (int j = 0; j < colonnes; ++j)
tab[i][j] = caractereunique;
}
void affichageTabChar(char** tab,
int lignes, int colonnes)
{
for (int i = 0; i < lignes; ++i)
{
for (int j = 0; j < colonnes; ++j)
printf("%c ", tab[i][j]);
printf("\n");
}
}
int main(void)
{
int ligne = 7;
int colonne = 5;
char** tab = declarationTabChar(ligne, colonne);
uniRemplissageTabChar(tab,'M', ligne, colonne);
affichageTabChar(tab, ligne, colonne);
free(tab);
return 0;
}
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
J'avais envisagé cette solution mais je n'étais parvenu à rien! Je fais du C depuis un mois et sans doutes m'embrouillais-je avec les '&'...
Un grand merci à toi!