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 :

Aide aux allocations dynamiques


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Aide aux allocations dynamiques
    Bonjour à tous,

    je sollicite votre aide afin de m'aider dans une amélioration de mon programme.

    Ce programme récupère en fait une liste de données dans un fichier texte.

    J'ai donc créé une structure dont le type est appelé trace. Elle contient un titre (comment) un nombre de points affiché, et deux colonnes de valeurs.

    Le fichier marche très bien, je peux le lire et l'afficher dans une console.



    Ce que j'aimerai pour l'améliorer c'est de créer une structure de ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct{
    char comment[40];
    int nbpts;
    float *time;
    float *value;
    } trace;
    et par le fait utiliser des allocations dynamiques. mais je n'ai pas très bien saisi la subtilité.

    Si vous pouviez m'aider dans les démarches se serait cool

    Je vous ai joins le code que j'ai créé auparavant.

    merci d'avance.

    Skanino


    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
    #include<stdio.h>
    #include<stdlib.h>
    #define POINTS 4096
     
    typedef struct{
    char comment[40];
    int nbpts;
    float time[POINTS];
    float value[POINTS];
    } trace;
     
    void readTrace(char* fichier,trace* uneTrace);
    void printTrace(trace* uneTrace);
     
    void main()
    {
    	trace uneTrace;										/*on défini le type trace pour la variable uneTrace*/
    	int t=0;/*
    	FILE* pf;
    	pf=fopen("cell2.txt","r");*/
    	readTrace("cell2.txt",&uneTrace);					/*appel de la fonction en envoyant le fichier txt et l'adresse de la variable*/
    	printf("Tester la fonction print tape 1\n\t");
    	scanf("%d",&t);
     
    	if (t==1)
    		printTrace(&uneTrace);
    	else
    		printf("\ntu veux rien faire\n");
     
    }
     
    void readTrace(char* fichier,trace* uneTrace)
    {
    	int i=0;											
    	FILE* pf;
    	pf=fopen(fichier,"r");								/*ouverture du fichier envoyé par la fonction dans le main, ici cell2.tx*/
     
    	if(pf!=NULL)										/*si le fichier est bien lu on applique la lecture*/
    	{
    		fscanf(pf,"%s",uneTrace->comment);				/*lecture du titre*/
    		fscanf(pf,"%d",&(uneTrace->nbpts));				/*nombre d'éléments*/
     
    		for(i=0;i<(uneTrace->nbpts);i++)
    		{
    			fscanf(pf,"%f",&(uneTrace->time[i]));		/*valeure num1 du tableau*/
    			fscanf(pf,"%f",&(uneTrace->value[i]));		/*valeure num2 du tableau*/
    		}
    		printf("c ok\n\n");
    	}
    	else
    		printf("c pas ok");
     
    	fclose(pf);
    }
     
    void printTrace(trace* uneTrace)						/*avec cette fonction on va pouvoir afficher les valeures lues*/
    {
    	int i=0;
    		printf("%s\n",uneTrace->comment);
    		printf("\t%d\n",uneTrace->nbpts);
     
    		for(i=0;i</*(uneTrace->nbpts)*/15;i++)         /*on affiche que les premiers éléments pour l'instant*/
    		{
    			printf("t=%.1f\t",uneTrace->time[i]);
    			printf("v=%.3f\n",uneTrace->value[i]);
    		}
    }

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    sur le principe, tu dois allouer la taille quand tu la connais, dans readTrace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...		fscanf(pf,"%d",&(uneTrace->nbpts));				/*nombre d'éléments*/
     // ici tu fais tes allocations :
    uneTrace->time = (float*) malloc(uneTrace->nbpts * sizeof(float));
    uneTrace->value= (float*) malloc(uneTrace->nbpts * sizeof(float));
    		for(i=0;i<(uneTrace->nbpts);i++)....
    le reste ne devrait pas changer

    pour être propre, a la fin du main(), tu fais un free est 2 pointeurs

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci je test dans la semaine et je tiens au courant

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    merci ça marche bien

    j'ai juste pas trop compris l'histoire des free et des 2 pointeurs :/

  5. #5
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 564
    Points
    1 564
    Par défaut
    Hello,

    Comme tu as alloué de la mémoire pour tes variables time et value avec la fonction malloc(), pour être propre, tu dois la libérer à la fin de ton programme (au plus tard).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    free(uneTrace->time);
    free(uneTrace->value);
    ce qui a pour effet de rendre la mémoire allouée au système.
    Personnellement, je libère de la mémoire allouée dès que je n'en ai plus besoin.

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    génial merci effectivement c'est bien plus pratique pour la suite

    Merci encore

Discussions similaires

  1. Aide allocation dynamique
    Par lassault1 dans le forum Débuter
    Réponses: 8
    Dernier message: 23/04/2010, 20h05
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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