Use of uninitialised value of size 8
Résolu
rosate999
Messages postés
5
Statut
Membre
-
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Voici mon code, je ne sais pourquoi il donne un erreur de segmentation!!!
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int i;
int j;
double c;
}point;
typedef struct {
point *a;
}tableau_t;
int myfunc( char *fichier){
int i, i1,i2, ind1, ind2;
double c,val;
double calcul;
point **a;
FILE *matriceDistance;
matriceDistance = fopen("fichier.txt", "r");
for(i=0;i<6;i++) {
fscanf(matriceDistance,"%d %d %lf", &i1,&i2, &val);
((*a)[i]).i=i1;
((*a)[i]).j=i2;
((*a)[i]).c=val;
printf("%d %d %lf \n", i1, i2, ((*a)[i]).c);
}
tableau_t *tableau;
calcul=0;
a=tableau->a;
for(i=0;i<6;i++){
ind1=a[i]->i;
ind2=a[i]->j;
c=a[i]->c;
calcul=calcul+(*a)[i].c;
}
printf("%lf", calcul);
}
int main(int argc,char **argv){
char *distanceMatrice, tab;
tab=myfunc(distanceMatrice);
return 0;
}
l'erreur de segmentation est le suivant: Use of uninitialised value of size 8
j'espère que quelqu'un peut m'aider.
Merci par avance
rosate999
Voici mon code, je ne sais pourquoi il donne un erreur de segmentation!!!
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int i;
int j;
double c;
}point;
typedef struct {
point *a;
}tableau_t;
int myfunc( char *fichier){
int i, i1,i2, ind1, ind2;
double c,val;
double calcul;
point **a;
FILE *matriceDistance;
matriceDistance = fopen("fichier.txt", "r");
for(i=0;i<6;i++) {
fscanf(matriceDistance,"%d %d %lf", &i1,&i2, &val);
((*a)[i]).i=i1;
((*a)[i]).j=i2;
((*a)[i]).c=val;
printf("%d %d %lf \n", i1, i2, ((*a)[i]).c);
}
tableau_t *tableau;
calcul=0;
a=tableau->a;
for(i=0;i<6;i++){
ind1=a[i]->i;
ind2=a[i]->j;
c=a[i]->c;
calcul=calcul+(*a)[i].c;
}
printf("%lf", calcul);
}
int main(int argc,char **argv){
char *distanceMatrice, tab;
tab=myfunc(distanceMatrice);
return 0;
}
l'erreur de segmentation est le suivant: Use of uninitialised value of size 8
j'espère que quelqu'un peut m'aider.
Merci par avance
rosate999
3 réponses
-
Salut, soit dit en passant: utilise la balise
<code>
pour mettre du code dans tes messages, ça garde l'indentation et t'as des couleurs en plus.
Pour commencer, la première erreur que je vois est que tu cherches à accéder à un élément dea
sans avoir alloué de mémoire, donca
est un pointeur vide, donc c'est le crash assuré.
Sachant que ta boucle traite maxi 6 lignes, il faut allouer 6 pointeurs de points:... matriceDistance = fopen("fichier.txt", "r"); a = calloc(sizeof(point *), 6); ...Maintenant a pourra recevoir 6 pointeurs de structurepoint
.
Deuxièmement, ta manière d'accéder aux éléments de ta struct dans le tableau est on ne peut plus étrange, surtout que plus bas tu y accèdes correctement:((*a)[i]).i=i1; // WTF o_O? /* Devient */ a[i]->i=i1; // Là c'est propre
Mais une fois de plus tu accèdes à un pointeurNULL
, il faut allouer de la mémoire pour ton point:... fscanf(matriceDistance,"%d %d %lf", &i1,&i2, &val); a[i] = malloc(sizeof(point)); ...
Le dernier hic est que je ne vois pas à quoi sert tontableau_t *tableau;
vu que tu ne t'en sers pas, et que tu fais çaa=tableau->a;
et que c'est pas cool: tu vas perdre ton tableau de points, sans libérer la mémoire en plus... J'ai donc mis les 2 lignes citées en commentaire, et ça marche. -
Bonjour,
En plus des remarques de gravgun,
point **a;
a est un double pointeur. Vu comment tu l'utilises, tu dois faire :a=malloc(sizeof(point *)); *a=malloc(6*sizeof(point));
Ou alors déclarer "a" en point *a;
Et n'oublie pas les free() qui vont bien.
printf("%d %d %lf \n", i1, i2, ((*a)[i]).c);
printf("%lf", calcul);
Plutôt %f (et non %lf).
Et enfin, n'oublie pas de mettre un '\n' dans le dernier printf() pour forcer l'affichage, ou alors fflush(stdout); avant le return 0; du main.
Google is your friend-
'lut fiddy, en fait mon approche est différente de la tienne: tu fais de
a
un pointeur vers un autre unique pointeur d'une zone mémoire contigüe de 6point
s, moi c'était un pointeur vers un tableau de différents pointeurs depoint
(répartition non contigüe donc), ce qui fait que j'ai changé sa manière d'accéder au tableau; mais c'est vrai qu'après observation,((*a)[i]).i
marche avec ton code.
Pour le reste, bien vu ;) -
-
-