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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    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 éclairé
    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
    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 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 209
    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 éclairé
    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
    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 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 209
    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
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    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.

  8. #8
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 209
    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.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    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.

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