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 :

L'allocation mémoire ne marche pas bien


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut L'allocation mémoire ne marche pas bien
    Bonjour,
    J'aimerais allouer mon fichier dans une matrice. J'ai essayé de faire ça mais le résulta est que ça m'affiche à partir de la 2ème ligne du fichier et après ça bug.
    Pourquoi ?
    Voici le 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
    /* Fichiers d'en-tête */
    #include <stdlib.h>    // Génération nbres aléatoires, allocation dynamique mémoire
    #include <stdio.h>    //  Gestion erreurs et E/S (scanf, printf)
    #include <math.h>	 //   Fonctions mathématiques
    #include <string.h>
     
    #define TAILLE_MAX  4700
     
    // 1ère étape : Chargement du fichier IRIS DATA ==> pas OK
    int main()
    {
        /* Descripteur fichier */
        FILE* fichier = NULL;
     
        /* Ouverture fichier */
        fichier = fopen("iris_data.txt", "r+");
     
        if (fichier != NULL)
        {
            char chaine[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
     
            while(fgets(chaine, TAILLE_MAX, fichier)!= NULL)  // On lit maximum TAILLE_MAX caractères du fichier, on stocke le tout dans "chaine"
            {
                // On peut lire et écrire dans le fichier
                printf("Le fichier IRIS DATA est ouvert \n");
     
                /*----------------- Etape 2 : Allocation mémoire--------------------*/
                /* Allocation mémoire d'un tableau de 100 valeurs flottantes */
                double** vect;
                if  ( ( vect =malloc(100*sizeof(**vect) ))== NULL)
                {
                    printf("Il n'y a pas assez de mémoire !\n ");
                    exit(EXIT_FAILURE);
                }
                printf("La memoire est allouee! \n");
                //exit(EXIT_SUCCESS);
     
     
     
                // indice
                int i=0;
                for (i=0; i<=149; i++)
                {
     
                    printf("vecteur numero %d \n",i);
                    printf("----------------------------------------\n");
     
                    fscanf(fichier, "%lf ,%lf ,%lf ,%lf", &vect[i][0], &vect[i][1], &vect[i][2], &vect[i][3]);
                    printf("Le vecteur de donnees %d est : %f,%f,%f,%f \n",i, vect[i][0], vect[i][1], vect[i][2], vect[i][3]);
                }
            }
        }
        else
        {
            // On affiche un message d'erreur si on veut
            printf("Impossible d'ouvrir le fichier iris_data.txt");
        }
     
        return 0;
    }
    Merci

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double** vect;
    vect = malloc(100 * sizeof(**vect));
    Tu as un niveau d'indirection de trop, double * suffit. D'autre part, écris plutôt sizeof(double) dans l'appel à malloc c'est plus clair.

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Merci pour votre réponse.
    si je mets seulement double*, j'ai une erreur sur la ligne où j'ai vect[i][0], ça doit être une matrice.
    sizeof(double) marche bien, merci!

    Je sais pourquoi ça n'affiche pas la première ligne.
    En fait, j'ai utilisé fscanf au lieu de sscanf vu que j'ai utilisé avant la fonction fgets. Du coup, j'ai la première ligne puis encore la première ligne qui s'est répétée puis ça bug

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Si c'est une matrice, celle-ci devrait être déclaré entant que tel.
    Comme le présente la FAQ C :
    Comment déclarer et utiliser un tableau « à plusieurs dimensions » ?


    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Merci kolotz. En fait, la matrice doit être mise dans un pointeur.

  6. #6
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Cela ne change rien sur le principe de la déclaration.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    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 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par kolodz Voir le message
    Cela ne change rien sur le principe de la déclaration.
    Mais sur l'initialisation si

    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
    double** vect;
    // Here 100 == numbers of rows
    vect = (double**) malloc(100 * sizeof(double*));
     
    if (vect == NULL) { /*error*/ }
     
    for (int i = 0; i < 100; ++i) {
        // Here 100 == numbers of columns
        vect[i] = (double*) malloc(100 * sizeof(double));
     
        if (vect[i] == NULL) { /*error*/ }
    }
     
     
    // Release vect
    for (int i = 0; i < 100; ++i) { free(vect[i]); vect[i] = NULL;  }
     
    free(vect);
    vect = NULL;

    Édit: Merci Bktero , je me suis laissé influencer par kolodz et sa déclaration statique

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double vect[100][100]; // or double** vect;
    // Here 100 == numbers of rows
    vect = (double**) malloc(100 * sizeof(double*));
    Pardon ?

    EDIT : le code a été corrigé dans le message précédent. Notez que la seconde ligne génère une erreur de compilation.

  9. #9
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Kaboom !


    Citation Envoyé par geeka Voir le message
    Merci pour votre réponse.
    si je mets seulement double*, j'ai une erreur sur la ligne où j'ai vect[i][0], ça doit être une matrice.
    La représentation mémoire t'est imposée ? Parce qu'un tableau à une seule dimension suffit pour stocker une matrice, hein.

  10. #10
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Bonjour,

    Je ne comprends pas bien votre besoin de déclarer en dynamique une matrice...

    Depuis quand le fait de récupérer le pointeur d'une variable nécessite une déclaration dynamique ?
    Pourquoi vous ne faites pas une déclaration statique propre, puis une récupération du pointeur avec &vect ?
    Pour ma part, votre déclaration double** ne peut qu'amener des problèmes. Sans parler du fait qu'une indirection ne change pas le type final de la structure. Dans ce cas, c'est un double. Certes, c'est le pointeur du pointeur d'un double, mais cela n'en fait pas une matrice...

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Finalement, la question importante, c'est: Les dimensions sont-elles connues à la compilation?

    Car dans le cas contraire, il faut alors un tableau dynamique de double à deux dimensions (exemple).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Mon besoin c'est d'allouer les valeurs d'un fichier dans une matrice, si je n'utilise pas de pointeurs je n'aurais pas assez de mémoire pour tout afficher à la fois. Quelle serait la solution ?
    Les dimensions sont bien connues à l'avance 150 lignes et 5 colonnes, que je dois formater.

  13. #13
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    si je n'utilise pas de pointeurs je n'aurais pas assez de mémoire pour tout afficher à la fois.
    Pourquoi dis-tu cela ?

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ah, problème de pile contre tas. Qu'à cela ne tienne, on peut avoir une matrice de taille statique sur le tas.

    Un des moyens les plus simples étant de mettre ça dans une structure:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct maMatrice
    {
    	double valeurs[150][5];
    };
     
    ...
     
    struct maMatrice * pMat = malloc(sizeof *pMat);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Merci
    @Bktero : car j'ai testé et les données sont coupées à l'affichage, toutefois, je peux afficher ces vecteurs un à un, mais j'ai besoin de les afficher en même temps.

    @Médinoc:
    Comment je pourrais utiliser avec votre code, lequels des pMat, maMatrice ou valeurs peut remplacer vect ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (i=0; i<=149; i++)
                {
     
                    printf("vecteur numero %d \n",i);
                    printf("----------------------------------------\n");
     
                    fscanf(fichier, "%lf ,%lf ,%lf ,%lf", &vect[i][0], &vect[i][1], &vect[i][2], &vect[i][3]);
                    printf("Le vecteur de donnees %d est : %f,%f,%f,%f \n",i, vect[i][0], vect[i][1], vect[i][2], vect[i][3]);
                }

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Il s'agit de pMat->valeurs.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Class herite de JButton qui marche pas bien
    Par MinsK dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/03/2008, 17h57
  2. Selection souris ne marche pas bien
    Par kahya dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 18/01/2008, 16h30
  3. envoi en tcp qui marche pas bien
    Par zarbiman dans le forum Développement
    Réponses: 2
    Dernier message: 18/12/2007, 00h21
  4. Réponses: 2
    Dernier message: 22/09/2007, 11h39
  5. [RegEx] [bbcode] marche pas bien avec associations
    Par Woufeigh dans le forum Langage
    Réponses: 4
    Dernier message: 02/05/2007, 20h32

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