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 :

erreur de segmentation sur matrice


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 21
    Points : 7
    Points
    7
    Par défaut erreur de segmentation sur matrice
    Bonjour,
    A partir d'un fichier.txt, j'extrait les valeurs en utilisant char (chaine de caractère) que je nomme tampon.

    Voici mon code
    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
    			float f1, f2, f3,f4,f5;
    			f1 = strtof (tampon, &pEnd);
    			f2 = strtof (pEnd,   &pEnd);
    			f3 = strtof (pEnd,   &pEnd);
    			f4 = strtof (pEnd,   &pEnd);
    			f5 = strtof (pEnd,   NULL );
     
    /* /\*   printf ("%f %f %f", f1 ,f2,f3); *\/ */
     
     
     
    			float tab[n+50][5];
    			tab[i][0] =f1;
    			tab[i][1] =f2;
    			tab[i][2] =f3;
    			tab[i][3] =f4;
    			tab[i][4] =f5;
    Grace à strtof , je convertit la chaine en float. Je cré ensuite un tableau pour stocker mes floats.

    Or lorsque le fichier est très grand, plusieurs milliers de lignes, j'ai le message d'erreur suivant qui apparait :Erreur de segmentation ./$TEST_EXEC.

    Merci pour votre aide

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Il avait été dit quelque part que :
    Ne fonctionnera pas, car "n" est dynamique, alors que l'allocation du tableau sera fait à la compilation.

    Il faudrait donc allouer dynamique à l'exécution ton tableau !
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int i;
    float **tab;
     
    tab = malloc(n * sizeof (float*));
    for (i = 0; i < n; i++)
      tab[n] = malloc(5 * sizeof (float));
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Merci

    Ca fonctionne!

    Tu es trop fort

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Si je fais un simple print : printf ("%f", tab[i][0]); du tableau ça me renvoie les bons résultats

    Mais quand je le convertit en .h5, ça me donne n'importe quoi. Voila mon code
    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
     
    #include "hdf5.h"
    #include "hdf5_hl.h"
    #define RANK 2
     
    #include <stdlib.h>
    #include <stdio.h>
    /* #include <conio.h> */
    #include <string.h>
    #define MAX 100
     
     
     
     
    double *extract(char *TEST)
    /* double *extract(char TEST[]) */
    {
      char tampon[MAX] = {0};
            int i=0, n =0, j=0, h=0;
            FILE *fichier = NULL;
            float *tableau;
            float *toto;
      char* pEnd;
     
      float **tab;
     
     
     
     
            printf("Le fichier a ouvrir est : %s\n", "TEST.DAT");
        fichier = fopen("TEST.DAT", "r");
     
        if (fichier != NULL)
        {
            printf("L'ouverture du fichier %s a reussie !\n", "TEST.DAT");
     
                    while (fgets(tampon, MAX, fichier) != NULL)
                            n++;
     
                    printf("Le fichier contient %d valeurs.\n", n);
     
                    tableau = malloc(n * sizeof(double));
     
    		tab = malloc(n * sizeof (float*));
     
                    if (tableau == NULL)
                    {
                            printf("Erreur allocation !");
                            exit(0);
                    }
                    else
                    {
                            printf("Allocation reussie !\n");
                    }
     
                    rewind(fichier);
     
                    for (h=0; h<MAX; h++)
                            tableau[h] = 0.0;
     
                    for (i=0; i<n; i++)
     
                    {
                            fgets(tampon, MAX, fichier);
     
    			/*      printf("tampon : %s\n", tampon); */
    			/* 	tableau[i] =    atof (tampon); */
    			/* 	tableau[i] =    strtof(tampon, NULL);  */
     
     
    			/* Taille de chaque chaine de caractere */
    			/* 	printf("%lu", strlen(tampon)); */
     
    			float f1, f2, f3,f4,f5;
    			f1 = strtof (tampon, &pEnd);
    			f2 = strtof (pEnd,   &pEnd);
    			f3 = strtof (pEnd,   &pEnd);
    			f4 = strtof (pEnd,   &pEnd);
    			f5 = strtof (pEnd,   NULL );
     
    /* /\*   printf ("%f %f %f", f1 ,f2,f3); *\/ */
     
    			tab[i] = malloc(5 * sizeof (float));
    		/* 	float tab[n+50][5]; */
     
    		      	tab[i][0] =f1;
    			tab[i][1] =f2;
    			tab[i][2] =f3;
    			tab[i][3] =f4;
    			tab[i][4] =f5;
     
    /* printf ("%f", tab[i][0]); */
     
    			/* --------- CREATION HDF5 ----------- */
     
      hid_t       file_id;
     hsize_t     dims[RANK]={n,5};
     herr_t      status;
     
    /* create a HDF5 file */
     file_id = H5Fcreate ("ex_lite2.h5",H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
     
    /*  /\* create and write an integer type dataset named "dset" *\/ */
     status = H5LTmake_dataset(file_id,"/dset",RANK,dims,H5T_NATIVE_FLOAT,tab);
     
     /* close file */
     status = H5Fclose (file_id);
    			/* --------- FIN CREATION HDF5 ----------- */
     
                    }
     
            }
        else
            printf("L'ouverture du fichier %s a echouee !\n", "TEST.DAT");
     
        return 0;
     
    }
    Merci

  5. #5
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     status = H5LTmake_dataset(file_id,"/dset",RANK,dims,H5T_NATIVE_FLOAT,tab);
    Le commentaire juste avant dit "écriture d'un int", mais je vois un define de FLOAT dedans, donc ça ne doit pas être ça....

    Et euh, tu as une explication de ce que fait la fonction H5LTmake_dataset ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Cette fonction permet de créer un .h5 (format HDF5) qui en comparaison avec un fichier.DAT est beaucoup moins lourd en taille.

    Je me suis trompé sur le commentaire mais j'ai mis un FLOAT car mon tab est déclaré en float.

    Si je met tab[n+50][5] ca retranscrit bien mon fichier .DAT en fichier.h5.

    Mais l'allocation du tab ne me donne que des 0 dans le fichier.h5.

    Merci

  7. #7
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    OK, alors on va essayer d'etoffer un peu l'allocation...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i;
    float **tab;
     
    tab = malloc((n + 1) * sizeof (float*));
    tab[n] = NULL;
    for (i = 0; i < n; i++)
      tab[i] = malloc(5 * sizeof (float));
    Avec ça, on dit que la dernière case contient NULL, donc que ça se finit là.

    Tu n'as pas la documentation officielle de tes fonctions H5* ?
    Pour voir le comportement EXACT qu'elles ont (et surtout ce qu'elles attendent EXACTEMENT en paramètre)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Non, ça me donne toujours des 0.

    D'ailleurs j'écris plutot:
    tab[i] = malloc(5 * sizeof (float)); et non tab[n]..... (i plutot que n) sinon ça met erreur de segmentation.

    Le printf ("%f", tab[i][0]); me renvoie les bonnes valeurs mais pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    status = H5LTmake_dataset(file_id,"/dset",RANK,dims,H5T_NATIVE_FLOAT,tab);

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    la doc se trouve sur le site HDF5

  10. #10
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Euuuh.... oui j'ai mis N en pensant à i ! xD
    Nononon ! Il faut mettre N ! Et malloc (N + 1) !
    Oui, dans la boucle for on met i, mais juste avant pour le NULL c'est n.

    Je regarde la doc en rentrant, si tu trouves avant, c'est perfect !


    URL de la doc des open/close, make_data
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  11. #11
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Alors, d'après ce que je lis dans la doc :
    herr_t H5LTmake_dataset(hid_t loc_id, const char *dset_name, int rank, const hsize_t *dims, hid_t type_id, const void *buffer)
    On va admettre que "buffer" peut être de n'importe quel type... mais le problème "peut" venir de là.

    Ensuite : dims[RANK] = { n, 5 };
    n s'incrémente à l'exécution, donc tu dois remplir "à la main" à l'exécution dims avec n.

    Bref, tu devrais aussi te simplifier la vie avec :
    herr_t H5LTmake_dataset_float(hid_t loc_id, const char *dset_name, int rank, const hsize_t *dims, const float *buffer)
    Ce qui serait intéressant, ce serait de savoir comment devrait être formaté le "buffer".

    Je suppose que ça doit être un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float *tab;
     
    tab = (row * col * sizeof (float));
    Et on remplit en faisant des modulos....
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    En faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     status = H5LTmake_dataset_float(file_id,"/dset",RANK,dims,tab);
    J'ai ce message d'erreur :

    ex_lite2.c: In function ‘extract’:
    ex_lite2.c:128: attention : passing argument 5 of ‘H5LTmake_dataset_float’ from incompatible pointer type

  13. #13
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Et "tab" est de type float* ou float** ?
    Car la fonction veut un float* !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    tab est bien déclaré en float *tab.....

  15. #15
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Je ne sais pas trop du coup...

    La doc parle bien d'un float*, donc je ne comprends pas pourquoi l'erreur existe.
    Il faudrait trouver des exemples qui fonctionnent déjà et voir quel est le format adopté pour le dernier argument.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Ok

    Merci!

Discussions similaires

  1. erreur de segmentation sur affectation champ enum structure
    Par marion5515 dans le forum Débuter
    Réponses: 9
    Dernier message: 24/02/2010, 11h51
  2. Erreur de segmentation sur une concaténation
    Par cypher.sephiroth dans le forum Débuter
    Réponses: 14
    Dernier message: 18/08/2009, 17h42
  3. Erreur de segmentation sur ifstream.close()
    Par tHE_fLAmMinG_mOE dans le forum SL & STL
    Réponses: 4
    Dernier message: 27/01/2009, 14h54
  4. Erreur de segmentation sur une File
    Par hugo1992 dans le forum C
    Réponses: 2
    Dernier message: 22/10/2007, 08h49
  5. Erreur de segmentation sur une chaine en récursif...
    Par laurent_ifips dans le forum C
    Réponses: 12
    Dernier message: 13/12/2005, 16h04

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