C - Problème paramètres tableau 2 dimensions

Fermé
Marie - 6 janv. 2008 à 00:43
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 - 6 janv. 2008 à 16:38
Bonjour,
Je cherche désespéremment de l'aide pour afficher un tableau à 2 dimensions ...
Je commence par le déclarer ds le main, ensuite je le remplis à partir d'un fichier (fct charge matrice), et je veux l'afficher (fct affiche matrice)
Ms je n'arrive pas à afficher le tableau ! Je pense que le problème vient de la fonction d'affichage ms je ne comprend pas pourquoi ...
Lorque j'affiche le tableau ds la fonction chargematrice (et que j'enlève affiche matrice) cela marche très bien ...
Si quelqu'un avait la solution ce serait génial ! Merci bcp !

int ChargeMatrice(FILE * fichier, int **T)
{
int nbSommets, i, j ;

/* Verifie que le fichier a bien ete ouvert */
if(fichier == NULL)
{
printf("Erreur lors de l'ouverture du fichier\n") ;
return -1;
}

/* Récupère le nombre de sommets */
fscanf(fichier, "%d\n", &nbSommets) ;

/* Reservation de la place pour le tableau
T = (int **) malloc (nbSommets * sizeof(int *)) ;
for(i=0; i<nbSommets*nbSommets; i++)
T[i] = (int *) malloc (nbSommets * sizeof(int *)) ;

/* Récupère les données à mettre ds le tableau */
for(i=0 ; i<nbSommets ; i++)
for(j=0 ; j<nbSommets ; j++)
{
fscanf(fichier, "%d ", &T[i][j]) ;
if(j == nbSommets -1)
fscanf(fichier, "\n") ;
}

fclose(fichier) ;
return 1;
}


void AfficheMatrice(int **Mat, int nbSommets)
{
int i, j ;
for(i=0 ; i<nbSommets ; i++)
{
for(j=0 ; j<nbSommets ; j++)
printf("%d ", Mat[i][j]) ;
printf("\n") ;
}
}

int main(int argc, char ** argv)
{
int **T ;

/* Ouvre le fichier qui contient les informations à mettre ds le tableau */
FILE * fichier = fopen("matrice.txt", "r") ;

ChargeMatrice(fichier, T) ;
AfficheMatrice(T, nbSommets) ;

return 0 ;
}
A voir également:

9 réponses

Désolée, j'ai voulu enlever quelques trucs pr que cela paraisse plus clair, mais j'en ai enlevé trop ...

int ChargeMatrice(FILE * fichier, int **T)
{
int nbSommets, i, j ;

/* Verifie que le fichier a bien ete ouvert */
if(fichier == NULL)
{
printf("Erreur lors de l'ouverture du fichier\n") ;
return -1;
}

/* Récupère le nombre de sommets */
fscanf(fichier, "%d\n", &nbSommets) ;

/* Reservation de la place pour le tableau
T = (int **) malloc (nbSommets * sizeof(int *)) ;
for(i=0; i<nbSommets*nbSommets; i++)
T[i] = (int *) malloc (nbSommets * sizeof(int *)) ;

/* Récupère les données à mettre ds le tableau */
for(i=0 ; i<nbSommets ; i++)
for(j=0 ; j<nbSommets ; j++)
{
fscanf(fichier, "%d ", &T[i][j]) ;
if(j == nbSommets -1)
fscanf(fichier, "\n") ;
}

fclose(fichier) ;
return 1;
}


void AfficheMatrice(int **Mat, int nbSommets)
{
int i, j ;
for(i=0 ; i<nbSommets ; i++)
{
for(j=0 ; j<nbSommets ; j++)
printf("%d ", Mat[i][j]) ;
printf("\n") ;
}
}

int main(int argc, char ** argv)
{
int **T ;
int nbSommets ;

/* Ouvre le fichier qui contient les informations à mettre ds le tableau */
FILE * fichier = fopen("matrice.txt", "r") ;

nbSommets = ChargeMatrice(fichier, T) ;
if(nbSommets == -1)
exit(0) ;
AfficheMatrice(T, nbSommets) ;

return 0 ;
}
1
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
6 janv. 2008 à 01:08
nbSommets = ChargeMatrice(fichier, T) ;
la tu donne a nbSommets la valeur 1 c'est normal apres que ta fonction AfficheMatrice ne marche pa
1
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
6 janv. 2008 à 00:57
dans ta fonction affichematrice tu as nbSommets en parametre alor qu'il n'est pas declaré dans le main...
0
Oups j'avais oublié ca aussi ... :S
J'ai remplacé ds Chargematrice le return 1 par return nbSommets, et ca ne marche pas non plus !
0

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

Posez votre question
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
6 janv. 2008 à 01:18
tu peux nous dire ce qui ne marche pas ?
erreur de compilation ? si oui... le message d'erreur et a quel niveau ?
erreur d'execution ?
le programme ne fait pas ce que tu veux il n'affiche pas de matrice ?
0
Je travaille sous dev c++.
Quand j'enlève l'appel à affichematrice, le "terminal" s'ouvre et affiche "appuyez sur une touche pour continuer" ce qui est normal.
Quand je le remet, le terminal s'ouvre et se referme tout de suite. (j'ai essayé sous linux, cela met une erreur de seg)
J'ai enlevé la fonction AfficheMatrice, et j'ai mis les 2boucles for ds la fonction chargematrice (pour que l'affichage se fasse dedans), et la ca affichait bien.
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
6 janv. 2008 à 05:31
le probleme c'est que tu fabrique ta matrice dans Chargematrice mais tu donne une autre matrice non allouee a afichematrice donc ça segfault...
tu pourrais recuperer ta matrice a partir de Chargematrice comme ça tu pourrais passer en parametre a affichematrice la bonne matrice et recupere le nombre de sommet dans le main
essaye ça
int **ChargeMatrice(FILE * fichier, int **T,int nbSommets)
{
int i, j ;

/* Verifie que le fichier a bien ete ouvert */
if(fichier == NULL)
{
printf("Erreur lors de l'ouverture du fichier\n") ;
return -1;
}


/* Reservation de la place pour le tableau*/
T = (int **) malloc (nbSommets * sizeof(int *)) ;
for(i=0; i<nbSommets; i++)
T[i] = (int *) malloc (nbSommets * sizeof(int)) ;

/* Récupère les données à mettre ds le tableau */
for(i=0 ; i<nbSommets ; i++)
for(j=0 ; j<nbSommets ; j++)
{
fscanf(fichier, "%d",&T[i][j]) ;
}

fclose(fichier) ;
return T;
}


void AfficheMatrice(int **Mat, int nbSommets)
{

int i, j ;

for(i=0 ; i<nbSommets ; i++)
{
for(j=0 ; j<nbSommets ; j++)
printf("%d ",Mat[i][j]) ;
printf("\n") ;
}
}

int main(int argc, char ** argv)
{
int **T ;
int nbSommets ;
/* Ouvre le fichier qui contient les informations à mettre ds le tableau */
FILE * fichier = fopen("matrice.txt", "r") ;
fscanf(fichier, "%d", &nbSommets) ;

T=ChargeMatrice(fichier,T,nbSommets) ;
if(nbSommets == -1)
exit(0) ;
AfficheMatrice(T, nbSommets) ;

return 0 ;
}
0
Je te remercie, j'ai essayé ce que tu m'as dit, ca ne fait plus d'erreur de seg, mais au lieu d'afficher ca :

0 1 0 0 1 0 0
1 0 1 0 0 0 0
0 1 0 1 0 3 0
0 0 1 0 0 0 10
1 0 0 0 0 10 0
0 0 10 0 5 0 5
0 0 0 5 0 3 0

ca me met ca :

4063608 4063608 0 0 0 0 0
4063608 4063608 0 0 0 0 0
4063608 4063608 0 0 0 0 0
4063608 4063608 0 0 0 0 0
4063608 4063608 0 0 0 0 0
4063608 4063608 0 0 0 0 0
4063608 4063608 0 0 0 0 0
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
6 janv. 2008 à 16:38
il est fait comment ton fichier texte ? tu recuperes ou le nbr de sommets ?
0