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 -
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
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:
- Valgrind use of uninitialised value of size 8
- Clé windows 8 - Guide
- Mixcraft 8 - Télécharger - Création musicale
- Out of range écran - Forum Ecran
- Departure from inward office of exchange - Forum Réseaux sociaux
- Out of range - Forum Ecran
3 réponses
Salut, soit dit en passant: utilise la balise
Pour commencer, la première erreur que je vois est que tu cherches à accéder à un élément de
Sachant que ta boucle traite maxi 6 lignes, il faut allouer 6 pointeurs de points:
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:
Le dernier hic est que je ne vois pas à quoi sert ton
<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
asans avoir alloué de mémoire, donc
aest 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 propreMais 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.
fiddy
Messages postés
11069
Date d'inscription
Statut
Contributeur
Dernière intervention
1 847
L'allocation de "a" n'est pas correcte par rapport à son code. C'est le contraire ;-).
Bonjour,
En plus des remarques de gravgun,
point **a;
a est un double pointeur. Vu comment tu l'utilises, tu dois faire :
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
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
Pour le reste, bien vu ;)
aun pointeur vers un autre unique pointeur d'une zone mémoire contigüe de 6
points, 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]).imarche avec ton code.
Pour le reste, bien vu ;)