Use of uninitialised value of size 8

Résolu
rosate999 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 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
A voir également:

3 réponses

ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
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 de
a
sans avoir alloué de mémoire, donc
a
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 structure
point
.

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 pointeur
NULL
, 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 ton
tableau_t *tableau;
vu que tu ne t'en sers pas, et que tu fais ça
a=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.
2
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
L'allocation de "a" n'est pas correcte par rapport à son code. C'est le contraire ;-).
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
0
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
'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 6
point
s, moi c'était un pointeur vers un tableau de différents pointeurs de
point
(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 ;)
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Au temps pour moi, je n'avais pas vu que tu avais aussi changé sa manière d'accéder au tableau.
0
rosate999 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour vos réponses.
0