[C] Matrice sommet -> tableau sommet
Résolu
macmat
Messages postés
10
Date d'inscription
Statut
Membre
Dernière intervention
-
macmat Messages postés 10 Date d'inscription Statut Membre Dernière intervention -
macmat Messages postés 10 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je souhaiterais remplir un tableau de sommets, à partir d'une matrice d'arc. Le but étant d'éviter les doublons. J'aimerais comprendre pourquoi le code suivant ne fonctionne pas :
for(i=0;i<nbarc;i++){
for(j=0;j<2;j++){
for(k=0;k<nbarc;k++){
if (somtab[k]!=tab[i][j])
{
somtab = realloc (somtab,taille*sizeof(char));
somtab[k]=tab[i][j];
taille ++;
}
}
}
}
La matrice "tab" contient deux colonnes pour nbarc lignes, du type :
E a
E d
E f
a b
a c
...
Le but est de stocker uniquement les différents sommets, qui composent l'arc dans le tableau de caractère somtab, afin de ne pas gâcher d'espace mémoire, j'utilise la fonction realloc pour augmenter la taille, de somtab uniquement si le sommet n'est pas déjà présent dans celui-ci.
Il me semble qu'il s'agit ici d'un conflit mémoire, mais j'en suis pas sur, pourriez m'éclairer et m'expliquer d'où vient le problème s'il vous plaît.
Bien cordialement
Macmat
Je souhaiterais remplir un tableau de sommets, à partir d'une matrice d'arc. Le but étant d'éviter les doublons. J'aimerais comprendre pourquoi le code suivant ne fonctionne pas :
for(i=0;i<nbarc;i++){
for(j=0;j<2;j++){
for(k=0;k<nbarc;k++){
if (somtab[k]!=tab[i][j])
{
somtab = realloc (somtab,taille*sizeof(char));
somtab[k]=tab[i][j];
taille ++;
}
}
}
}
La matrice "tab" contient deux colonnes pour nbarc lignes, du type :
E a
E d
E f
a b
a c
...
Le but est de stocker uniquement les différents sommets, qui composent l'arc dans le tableau de caractère somtab, afin de ne pas gâcher d'espace mémoire, j'utilise la fonction realloc pour augmenter la taille, de somtab uniquement si le sommet n'est pas déjà présent dans celui-ci.
Il me semble qu'il s'agit ici d'un conflit mémoire, mais j'en suis pas sur, pourriez m'éclairer et m'expliquer d'où vient le problème s'il vous plaît.
Bien cordialement
Macmat
A voir également:
- [C] Matrice sommet -> tableau sommet
- Tableau word - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Tableau croisé dynamique - Guide
- Imprimer tableau excel sur une page - Guide
1 réponse
Salut! est-ce que tu peux poster le reste de ton code stp?
Voilà ce que je vois qui pourrait te poser problème:
- premièrement, pourquoi incrémentes-tu taille après la réallocation de mémoire? Si tu initialises somtab, par exemple, à taille = 1 alors ton realloc ne fera rien d'utile...
- ensuite, si tu parcoures somtab dans ta boucle for, et que tu ne réalloues pas, k va sauter une position mémoire et tu vas te retrouver en débordement.
Il faudrait aussi penser à incrémenter nbarc.
Voilà ce que je vois qui pourrait te poser problème:
- premièrement, pourquoi incrémentes-tu taille après la réallocation de mémoire? Si tu initialises somtab, par exemple, à taille = 1 alors ton realloc ne fera rien d'utile...
- ensuite, si tu parcoures somtab dans ta boucle for, et que tu ne réalloues pas, k va sauter une position mémoire et tu vas te retrouver en débordement.
Il faudrait aussi penser à incrémenter nbarc.
En fait je pensais incrémenter la taille après, afin d'augmenter au fur et à mesure la taille du tableau. L'incrémentation ne se réalise que si la consigne du if est respectée. Je pensais qu'il fallait parcourir somtab afin d'ajouter le sommet différent à la case suivant dans le tableau somtab.
Voici le reste du code :
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////Allocation dynamique tableau int////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
int *inttaballoc(int nbarc)
{
int *tabb;
tabb = calloc(nbarc, sizeof (int));
return tabb;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////Allocation dynamique tableau char////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
char *chartaballoc(int nbarc)
{
int nbl=2*nbarc;
char *tabb;
tabb = calloc(nbl, sizeof (char));
return tabb;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////Main/////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
int main(void){
int i,j,k, nbarc=0;
int taille;
int nbsommet=0;
int *tabl;
char *somtab;
char t[2],**tab,*ct;
FILE *f;
f=fopen("john.txt","r");
if(f){
nbarc=0;
/* compter nombre d'arc*/
while(fscanf(f,"%c %c %d\n",&t[0],&t[1],&j)!=EOF){
if(t[0]!=EOF) nbarc++;
printf("%c %c %d\n",t[0],t[1],j);
}
printf("\n");
tab=malloc(sizeof(char*)*nbarc);
if(tab) for(i=0;i<nbarc;i++) {
tab[i]=malloc(sizeof(char)*2);
if(!tab[i]) exit(1);
} else exit(1);
tabl = inttaballoc(nbarc);
rewind(f);
/* recup dans tab */
for(i=0;i<nbarc;i++){
fscanf(f,"%c %c %d\n",&tab[i][0],&tab[i][1],&tabl[i]);
}
/* affiche tab */
for(i=0;i<nbarc;i++)
printf("x:%c y:%c c:%d\n",tab[i][0],tab[i][1],tabl[i]);
printf("\n");
/*Compter le nombre de sommets*/
for(i=0;i<nbarc;i++){
for(j=0;j<2;j++){
for(k=0;k<nbarc;k++){
if (somtab[k]!=tab[i][j])
{
somtab = realloc (somtab,taille*sizeof(char));
somtab[k]=tab[i][j];
taille ++;
}
}
}
}
printf("%d\n", nbarc);
printf("%d\n", nbsommet);
/* free */
for(i=0;i<nbarc;i++)
free(tab[i]);
free(tab);
} else exit(1);
system("PAUSE");
return 0;
}
john.txt est un fichier de type :
E a 8
E d 10
E f 9
a b 4
a c 11
...
- comme j'ai déjà dis, taille n'est pas initialisé avant la première utilisation.
- nbarc est initialisé deux fois, ce n'est pas nécessaire.
- nbsommet ne change jamais, au moment du printf il est toujours à 0.
- il faut allouer somtab avant de l'appeler. Pour ça le compilateur devrait gueuler.
- lors de l'allocation de tab, attention avec la multiplication dans un malloc, il peut y avoir des overflows. Pour éviter cela, préférer calloc.
- le pointeur ct n'est jamais utilisé.
Mais en fait je pense que ta triple imbrication de boucles for est fausse, repense-la.