Bonjour,

Je souhaite créer un tableau qui pointe sur le début d'une liste chaîné (créé grâce à la struct). Mon problème se situe dans la fonction insererArc(), lorsque je met une valeur dans une case du tableau j'obtient une erreur de segmentation lors de l'exécution.

Voici mon code (tout les printf non indenté servent à savoir où est l'erreur de segmentation).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <stdlib.h>
#include <stdio.h>
 
struct arc* lectureFichier(FILE* fichier);
struct arc* recherchePlacement (struct arc* arcCourant, int poid);
void insererArc (struct arc* sommets [], int sommetDepart, int sommetArrive, int poid);
void initTableau (struct arc* sommets [], int nbrSommets);
 
typedef struct arc { //structure servant de liste pour mettre les arcs
	int sommetArrive;
	int poid;
	struct arc* arcSuivant;
};
 
 
struct arc* lectureFichier(FILE* fichier){
 
	int nbrSommets, nbrArcs, sommet1, sommet2, poid, i;
	struct arc *qdfv;
 
	fscanf (fichier, "%d", &nbrSommets);
	struct arc* sommets [nbrSommets]; //créé le tableau de sommets
	initTableau (sommets, nbrSommets); //initialise les listes d'arcs à NULL
 
 
	fseek(fichier, 1, SEEK_CUR);
	fscanf (fichier, "%d", &nbrArcs);
	for (i=0 ; i<nbrArcs ; i++) {
printf ("Je passe dans la boucle, et i=%d;\n",i);
 
		fseek(fichier, 1, SEEK_CUR); //permet de passer à la ligne suivante
		fscanf (fichier, "%d %d %d", &sommet1, &sommet2, &poid); //permet de lire la ligne, et de récupperrer son contenue
 
		insererArc (sommets, sommet1, sommet2, poid);
		insererArc (sommets, sommet2, sommet1, poid);
 
 
	}
 
	//qdfv=sommets;
	return qdfv;
 
}
 
 
void insererArc (struct arc* sommets [], int sommetDepart, int sommetArrive, int poid) {
	struct arc nouvelArc, tampon;
	struct arc* arcADeplacer;
printf ("Je passe dans insererArc, sommetDepart=%d, sommetArrive=%d, poid=%d.\n", sommetDepart, sommetArrive, poid);
 
	if (sommets [sommetDepart-1]==NULL) { //Si c'est le premier arc ayant pour origine sommetDepart
printf ("Je passe dans le if.\n");
		nouvelArc.sommetArrive=sommetArrive;
printf ("Le sommet d'arrivé a été mit.\n");
		nouvelArc.poid=poid;
printf ("Le poid a été mit.\n");
		nouvelArc.arcSuivant=NULL;
printf("L'arc suivant a été initialisé.\n");
		sommets [sommetDepart-1]=nouvelArc;
printf("Le pointeur a été bougé.\n");
	}
	else {
printf ("Je passe dans le else.\n");
		arcADeplacer=recherchePlacement (sommets [sommetDepart-1], poid);
 
		nouvelArc.sommetArrive=sommetArrive;
		nouvelArc.poid=poid;
		nouvelArc.arcSuivant=arcADeplacer->arcSuivant;
		*arcADeplacer->arcSuivant=nouvelArc;
 
	}
}
 
 
struct arc* recherchePlacement (struct arc* arcCourant, int poid) {
	struct arc* arcRetour;
 
	if (arcCourant->poid>=poid) {
		arcRetour=arcCourant;
	}
	else {
		if (arcCourant->arcSuivant==NULL) {
			arcRetour=NULL;
		}
		else {
			arcRetour=recherchePlacement (arcCourant->arcSuivant, poid);
		}
	}
 
	return arcRetour;
}
 
 
void initTableau (struct arc* sommets [], int nbrSommets) {
	int i;
 
	for (i=0; i<nbrSommets; i++) {
		sommets [i]=NULL;
	}
}
 
 
int main (int argc, char *argv[]) {
 
 
	//Ouverture du fichier
	FILE* fichier=NULL;
	fichier=fopen (argv[1], "a+");
	if (fichier != NULL){
 
		lectureFichier (fichier);
 
		//fermeture du fichier
		fclose (fichier);
	}
	else {
		printf ("Un problème est survenue lors de l'ouverture de fichier\n");
	}
 
	return 0;
}
Comment faire pour pouvoir modifier une case d'un tableau de pointeur ?


J'ai aussi un warning que je ne copmprend pas quand je compile.

13: warning: useless storage class specifier in empty declaration

Merci d'avance de votre aide.

Phantomlibre