IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Tableau de pointeur de type struct


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Points : 18
    Points
    18
    Par défaut Tableau de pointeur de type struct
    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

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Est-ce que tous tes printf() s'exécutent? SI non, à quel endroit le programme s'arrête?
    Dans ta fonctioninsererArc(), il y a déja un problème dans le else:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		nouvelArc.arcSuivant=arcADeplacer->arcSuivant;
    		*arcADeplacer->arcSuivant=nouvelArc;
    Tu déclares un pointeur sur structure arcADeplacer sans lui allouer de la mémoire, puis tu demande l'accès à un de ses champs.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Non, tous les printf ne s'exécutent pas. Le dernier est celui de la ligne 58.

    Es-tu sûr qu'il y ai un problème, car à la ligne 64, le pointeur arcADeplacer prend le paramètre de retour de la fonction recherchePlacement. Je ne peux pas dire si le programme plante à ce momment là puisque le tableau étant toujours initialisé à NULL je ne suis jamais passé dans le else!

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		sommets [sommetDepart-1]=nouvelArc;
    sommet est un tableau de pointeurs donc sommets [sommetDepart-1] est un pointeur sur struct arc or nouvelArc est une structure. En gros tu affecte à un pointeur sur structure une structure.
    Vérifie aussi que sommetDepart-1 est supérieur ou égal à 0.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    oui, je sais, normalement il y a une * devant sommets, mais là je sais pas pourquoi je l'ai enlevé. Mais même avec l'étoile ça ne marche pas.

    sommetDepart est le numéro d'un sommet du graphe, donc il est toujours supérieur ou égal a 1. Mais je ferais quand même un teste au cas où...

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("L'arc suivant a été initialisé.\n");
    		sommets [sommetDepart-1]=nouvelArc;
    Je ne crois pas que ce soit possible de copier une structure comme ça. Il faut le faire champ par champ ou bien le plus simple serait d'utiliser un malloc pour nouvelArc. Essaye donc ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct *nouvelArc=malloc(sizeof(arc);
     
    (...)
    sommets[Depart-1]=nouvelArc;

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    C'est bon ça marche avec malloc !
    merci

    Il y avait bien un problème dans le else, mais il venait de la fonction recherchePlacement qui renvoyé NULL de temps en temps. Donc c'est bon, ça marche (pas comme il faut, mais c'est plus qu'un problème algorithmique).

    Encore merci de ton aide


    PS : juste pas hasard, tu n'aurais pas un idée de ce que signifie le warning ?

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Le warning vient surement du typedef. La syntaxe est de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct ....
    {
    (....)
    } NomDuTypeDéfini;
    En fait typedef sert à définir un type.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Ok merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/09/2011, 07h30
  2. Réponses: 37
    Dernier message: 18/05/2008, 23h20
  3. Initialisation d'un tableau de type STRUCT
    Par Axiome dans le forum MFC
    Réponses: 4
    Dernier message: 06/09/2005, 10h58
  4. Tableau d'éléments de type variable
    Par Drooxy dans le forum Langage
    Réponses: 4
    Dernier message: 16/03/2003, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo