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 :

methode avec struct


Sujet :

C

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut methode avec struct
    Bonjour,

    J'essaye de répondre a cette question :Ecrivez un programme qui lit une suite d'adresses dans un fichier et les met dans une table de structures.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mon fichier contient deux lignes d'adresses suivantes:
     
    6 rue flobet 352100
    5 rue guy de ronoit 65200
    j'ai essayé de réaliser ce code mais il m'envoit erreur de segmentation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur de segmentation (core dumped)
    pourriez vous m'aider je bloque sur ça depuis des jours je ne trouves pas ou est le problème .

    Merci

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct adresse adresse1;
    struct adresse {
    int numero;
    int postale;
    char *voie;
    char *nomdelavoie;
    char *ville;
    };
     
    int main(void) {
    int n = 0, i;
    struct adresse *adresse1;
        FILE *f = fopen("adresses.txt","r");
        if (!f) {
            printf("Impossible d'ouvrir le fichier\n");
            return 1;
        }
        char ligne[256];
        while (fgets(ligne,256,f)) {
            if (n == 0) {
                adresse1 = malloc(sizeof(struct adresse)*(n+1));
            }
            else {
                adresse1 = realloc(adresse1,sizeof(struct adresse)*(n+1));
            }
     
    fscanf(f, "%d",&adresse1[n].numero);
    fscanf(f, "%s",adresse1[n].voie);
    fgets(adresse1[n].nomdelavoie , sizeof(adresse1[n].nomdelavoie), f);
    fscanf(f, "%s", adresse1[n].ville);		
    fscanf(f, "%d",&adresse1[n].postale);
            n++;
        }
        for (i = 0; i < n; i++)
        {
    		printf("Numero : %d\n", adresse1[i].numero);
    		printf("voie : %s\n", adresse1[i].voie);
    		printf("Nom de la voie :%s\n", adresse1[i].nomdelavoie);
    		printf("ville :%s\n", adresse1[i].ville);
    		printf("postale : %d\n", adresse1[i].postale);
    	fclose(f);
        free(adresse1);
        }
     
        return 0;
    }

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Une erreur de segmentation signifie que tu as tenté d'écrire dans de la mémoire en lecture seule, ou de déréférencer un pointeur vers de la mémoire interdite d'accès
    typiquement, c'est déréférencer un pointeur NULL ou écrire dans un pointeur sur de la mémoire non allouée

    pointeur = malloc.

    Comment veux-tu faire un scanf (ou autre fgets) si tu n'a pas alloué la chaine à écrire?


    Par ailleurs, realloc peut couter très cher, envisage de faire une liste chainée de struct adresse.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 53
    Points : 85
    Points
    85
    Par défaut
    Je ne suis pas expert, mais a mon avis fclose(f) et free(adresse1) a l'interieur de ton FOR vont poser probleme aussi

  4. #4
    Membre actif

    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 87
    Points : 217
    Points
    217
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                  adresse1 = malloc(sizeof(struct adresse)*(n+1));
            }
            else {
                 adresse1 = realloc(adresse1,sizeof(struct adresse)*(n+1));
    est ce que cette allocation suffit pour que tu puisse accéder à l'espace mémoire pointé par:
    char *voie;
    char *nomdelavoie;
    char *ville;
    ?

    Cordialement,

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    En C, il n'y a pas de constructeurs, mais on peut coder les initialisations proprement

    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
    void init_adresse1(adresse1** new_address) {
        if (new_address == NULL) { return; }
     
    //  Maybe test (*new_address)
     
        (*new_address) = malloc( sizeof(struct adresse) );
     
        if ((*new_address) != NULL) {
            (*new_address)->numero  = 0;
            (*new_address)->postale = 0;
            (*new_address)->voie        = NULL;
            (*new_address)->nomdelavoie = NULL;
            (*new_address)->ville       = NULL;
        }
    }
     
     
    void init_adresse1_with_city(adresse1** new_address, const char* city) {
        if (new_address == NULL) { return; }
     
    //  Maybe test (*new_address)
     
        (*new_address) = malloc( sizeof(struct adresse) );
     
        if ((*new_address) != NULL) 
            (*new_address)->numero  = 0;
            (*new_address)->postale = 0;
            (*new_address)->voie        = NULL;
            (*new_address)->nomdelavoie = NULL;
     
            if (city != NULL) {
                size_t len = strlen(city);
     
                if (len > 0) {
                    (*new_address)->ville = malloc((len + 1) /** sizeof(char)*/);
     
                    if ((*new_address)->ville != NULL) {
                        strncpy((*new_address)->ville, len, city);
    // or               strcpy((*new_address)->ville, city);
     
                        (*new_address)->ville[len] = '\0';
                    }
                } else {
                    (*new_address)->ville = NULL;
                }
            } else {
                (*new_address)->ville = NULL;
            }
        }
    }

  6. #6
    Invité
    Invité(e)
    Par défaut Un peu de recherche avant de poster sur le forum ne te ferais pas de mal
    Citation Envoyé par l1informatique Voir le message
    Bonjour,

    J'essaye de répondre a cette question :Ecrivez un programme qui lit une suite d'adresses dans un fichier et les met dans une table de structures.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mon fichier contient deux lignes d'adresses suivantes:
     
    6 rue flobet 352100
    5 rue guy de ronoit 65200
    j'ai essayé de réaliser ce code mais il m'envoit erreur de segmentation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur de segmentation (core dumped)
    pourriez vous m'aider je bloque sur ça depuis des jours je ne trouves pas ou est le problème .

    Merci

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct adresse adresse1;
    struct adresse {
    int numero;
    int postale;
    char *voie;
    char *nomdelavoie;
    char *ville;
    };
     
    int main(void) {
    int n = 0, i;
    struct adresse *adresse1;
        FILE *f = fopen("adresses.txt","r");
        if (!f) {
            printf("Impossible d'ouvrir le fichier\n");
            return 1;
        }
        char ligne[256];
        while (fgets(ligne,256,f)) {
            if (n == 0) {
                adresse1 = malloc(sizeof(struct adresse)*(n+1));
            }
            else {
                adresse1 = realloc(adresse1,sizeof(struct adresse)*(n+1));
            }
     
    fscanf(f, "%d",&adresse1[n].numero);
    fscanf(f, "%s",adresse1[n].voie);
    fgets(adresse1[n].nomdelavoie , sizeof(adresse1[n].nomdelavoie), f);
    fscanf(f, "%s", adresse1[n].ville);		
    fscanf(f, "%d",&adresse1[n].postale);
            n++;
        }
        for (i = 0; i < n; i++)
        {
    		printf("Numero : %d\n", adresse1[i].numero);
    		printf("voie : %s\n", adresse1[i].voie);
    		printf("Nom de la voie :%s\n", adresse1[i].nomdelavoie);
    		printf("ville :%s\n", adresse1[i].ville);
    		printf("postale : %d\n", adresse1[i].postale);
    	fclose(f);
        free(adresse1);
        }
     
        return 0;
    }
    1) T'aurais du commencer par chercher sur developpez il y-a d'excellent cours sur les pointeurs ou sur le C lui même (je code pour le plaisir, je suis autodidacte et avant d'aborder un nouveau langage de programmation je me documente, oui monsieur, J'apprends au minimum les bases (pas de bibliothèque, pas de fonction nécessitant l'inclusion de bibliothèque))

    2) Le langage C ne fera que ce que tu lui demande, il ne lie pas dans les pensés des gens, alors ne t'attends pas a des miracles, on t'as dit en haut que t'as erreur core dump parce que....
    C'est simple à chaque fois que tu ton fameux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     adresse1 = malloc(sizeof(struct adresse)*(n+1))
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    adresse1 = alloc(sizeof(struct adresse)*(n+1))
    Tu alloues de la mémoire que pour des structures de type adresse, or ta fameuse structure est composé de deux int et de trois pointeurs sur des char, (trois pointeurs et non trois chaînes de caractère), quand tu fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fgets(adresse1[n].nomdelavoie , sizeof(adresse1[n].nomdelavoie), f);
    fscanf(f, "%s", adresse1[n].ville);		
    fscanf(f, "%s",adresse1[n].voie);
    tu envoies les char lu du fichier vers des espaces mémoire sensé contenir que des char pointaient respectivement par adresse1[n].ville, ...[n].voie, et ...nomdelavoie, et tes pointeurs ils pointent sur quoi? On ne s'est pas puisque tu n'as pas allouer de la mémoire, bref t'aurais du faire un petit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    adresse1[n].nomdelavoie = malloc( 256*sizeof( char));/* généralement sizeof(char) == 1*/
    adresse1[n].ville = malloc( 256*sizeof( char));
    adresse1[n].voie = malloc( 256*sizeof( char));
    avant de tes scanf, en supposant que le nombre de caractère lu pour nomdelavoie, ville et voie ne dépasse pas 256 caractères (à chaque lecture).
    Voilà c'étais pas aussi compliquer mais t'aurais du commencer par chercher.
    Tant qu'on y est quand on fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     scanf( File *, "%s", char *)
    la fonction rajoute un '\0' dans la chaîne de caractère ou est ce qu'on doit le faire explicitement? Et aussi est ce que c'est le cas dans toutes peut importe le compilateur, etc...?

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    Mon fichier texte contient deux adresses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    5 rue Guy de la Brosse Paris 75005	
    3 rue florent dancourt suresnes 92100
    On suivant vos conseils si j'ai bien compris j'ai ajouté des modification au code mais je me retrouves avec des erreurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Numero : �:�789�
    voie : rue
    Nom de la voie :florent
    ville :dancourt
    postale : suresnes
    *** Error in `./SD111': corrupted double-linked list: 0x08e93168 ***
    Abandon (core dumped)
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct adresse adresse1;
    struct adresse {
    char *numero;
    char *postale;
    char *voie;
    char *nomdelavoie;
    char *ville;
    };
     
    int main(void) {
    int n = 0, i;
    struct adresse *adresse1;
        FILE *f = fopen("adresses.txt","r");
        if (!f) {
            printf("Impossible d'ouvrir le fichier\n");
            return 1;
        }
        char ligne[256];
        while (fgets(ligne,256,f)) {
            if (n == 0) {
                adresse1 = malloc(sizeof(struct adresse)*(n+1));
            }
    adresse1[n].numero = malloc( 256*sizeof( char));
    adresse1[n].voie = malloc( 256*sizeof( char));
    adresse1[n].nomdelavoie = malloc( 256*sizeof( char));/* généralement sizeof(char) == 1*/
    adresse1[n].ville = malloc( 256*sizeof( char));
    adresse1[n].postale = malloc( 256*sizeof( char));
     
    fscanf( f , "%s %s %s %s %s", adresse1[n].numero, adresse1[n].voie, adresse1[n].nomdelavoie, adresse1[n].ville ,adresse1[n].postale);
     
     
    n++;  
        }
     
        for (i = 0; i < n; i++)
        {
    		printf("Numero : %s\n", adresse1[i].numero);
    		printf("voie : %s\n", adresse1[i].voie);
    		printf("Nom de la voie :%s\n", adresse1[i].nomdelavoie);
    		printf("ville :%s\n", adresse1[i].ville);
    		printf("postale : %s\n", adresse1[i].postale);
        fclose(f);
        free(adresse1);
        }
     
        return 0;
    }

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Ligne 48 , réfléchis un peu

    Ligne 47, pourquoi dans la boucle?


    Édit: kdo

    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
    void free_adresse1(adresse1** new_address) {
        if (new_address == NULL) { return; }
     
        if ((*new_address) != NULL) {
            (*new_address)->numero  = 0;
            (*new_address)->postale = 0;
            if ((*new_address)->voie != NULL) { free((*new_address)->voie); (*new_address)->voie = NULL;  }
            if ((*new_address)->nomdelavoie != NULL) { free((*new_address)->nomdelavoie); (*new_address)->nomdelavoie = NULL;  }
            if ((*new_address)->ville != NULL) { free((*new_address)->ville); (*new_address)->ville = NULL;  }
     
            free((*new_address));
     
            (*new_address) = NULL;
        }
    }

Discussions similaires

  1. Lien symbolique avec struct dirent
    Par DefmY dans le forum C
    Réponses: 14
    Dernier message: 24/05/2006, 13h18
  2. [Reflection] Retrouver une methode avec des parametres primitifs
    Par rozwel dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 06/02/2006, 15h39
  3. Réponses: 6
    Dernier message: 25/04/2005, 17h33
  4. [Compilateur] appel de méthodes avec signature similaire
    Par Monkeyget dans le forum Général Java
    Réponses: 4
    Dernier message: 30/03/2005, 20h14
  5. [C#][WebServices] Appel methode avec une classe en paramètre
    Par bran_noz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 16h41

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