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 :

probleme avec les allocations memoires


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 4
    Points : 2
    Points
    2
    Par défaut probleme avec les allocations memoires
    bonjour,

    j'ai des problemes d'allocations de memoire.. je tourne un peu en rond et je ne vois pas la solution.
    pouvez-vous m'aider a debugger mon code ? merci.
    quand j''appelle la fonction d'interpolation plusieurs fois à la suite, le remplissage du buffer se fait mal.

    david



    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
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    //bibliotheques
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
     
    //prototypes des fonctions
    int Modif_Ecg(float Largeur_P,float Amplitude_P,float Largeur_H,float Amplitude_H,float Distance_S_T,float Largeur_T,float Amplitude_T,float Pulses_Minute);
    int Interpolation(float Buff[], long * Taille_Buff);
     
     
    //fonction main
    void main(void)
    {
    	//appel a la fonction Modif_Ecg
    	Modif_Ecg(1,2,3,4,5,6,7,9);
    }
     
     
    //fonction Modif_Ecg
    int Modif_Ecg(float Largeur_P,float Amplitude_P,float Largeur_H,float Amplitude_H,float Distance_S_T,float Largeur_T,float Amplitude_T,float Pulses_Minute)
    {
     
    	//declaration des variables
    	float fin_echantillon     =301;
    	float debut_p             =44;
    	float fin_p               =103;
    	float debut_q             =104;
    	float fin_q               =114;
    	float debut_r             =115;
    	float fin_r               =130;
    	float debut_s             =131;
    	float fin_s               =143;
    	float debut_t             =144;
    	float fin_t               =243;
    	FILE * Pointeur_Fichier;
    	long Taille_Buffer=2000;
    	float * Buffer;
    	char * Chaine;
    	int i=0;
    	int j=0;
    	int k=0;
     
     
    	//ouverture du fichier contenant le signal echantillonné
    	Pointeur_Fichier =fopen("echantillons_ecg.dat", "r");
    	if (Pointeur_Fichier==NULL) return (1);
     
    	//allocation de memoire pour le buffer
    	Buffer = (float *) malloc (Taille_Buffer*sizeof(float));
    	if (Buffer == NULL) return (2);
     
    	//allocation de memoire pour la chaine de caractere
    	Chaine = (char *) malloc (20);
    	if (Chaine == NULL) return (3);
     
    	//recuperation des float stockes dans le fichier texte
    	while(fgets(Chaine,  20, Pointeur_Fichier)!=NULL)
    	{
    		if(Chaine!=NULL)
    		{
    			if (i==Taille_Buffer)  Taille_Buffer=Taille_Buffer*2;
    			Buffer = (float *) realloc (Buffer, Taille_Buffer*sizeof(float));
    			Buffer[i]= (float) (atof(Chaine));
    		}
    		i++;
    	}
     
    	//allocation de memoire au plus juste pour le buffer
    	Taille_Buffer=i;
    	Buffer = (float *) realloc (Buffer, Taille_Buffer*sizeof(float));
     
    	//fermeture du fichier
    	fclose (Pointeur_Fichier);
     
    	//affichage du buffer
    	for(j=0;j<Taille_Buffer;j++)
    	{
    		printf("%f\n",Buffer[j]);
    	}
     
    	printf("\n\n\n");
     
    	//interpolation entre les points du buffer existant
    	for(j=0;j<1;j++)
    	{
    		Interpolation(Buffer, &Taille_Buffer);
    	}
     
    	//affichage du buffer apres interpolation
    	for(k=0;k<Taille_Buffer;k++)
    	{
    		printf("%f\n",Buffer[k]);
    	}
     
    	//liberation de la memoire du buffer
    	free (Buffer);
    	return (0);
    }
     
     
    //fonction d'interpolation pour doubler la taille du buffer
    int Interpolation(float * Buff, long * Taille_Buff)
    {
     
    	//declaration des variables
    	long Taille_Buff_Temp;
    	float * Buff_Temp;
    	int i=0;
     
    	//recopie du buffer existant et de sa taille dans des variables temporaires.
    	Taille_Buff_Temp = *Taille_Buff;
    	Buff_Temp = (float *) malloc (Taille_Buff_Temp*sizeof(float));
    	for(i=0;i<*Taille_Buff;i++)
    	{
    		Buff_Temp[i]=Buff[i];
    	}
     
    	//on double la taille du buffer pour inserer les valeurs moyennes
    	*Taille_Buff=(*Taille_Buff)*2-1;
    	Buff = (float *) realloc (Buff, (*Taille_Buff)*sizeof(float));
     
    	//remplissage du buffer (anciennes et nouvelles valeurs)
    	for(i=0;i<(*Taille_Buff);i++)
    	{
    		//recopie des valeurs existantes
    		if((i%2)==0)
    		{
    			Buff[i]=Buff_Temp[i/2];
    		}
    		//ajout des valeurs intermediaires
    		else
    		{
    			Buff[i]= ( Buff_Temp[(i-1)/2] + Buff_Temp[(i+1)/2] ) /2;
    		}
    	}
     
    	//affichage du nouveau buffer avant retour a la fonction principale
    	for(i=0;i<(*Taille_Buff);i++)
    	{
    		printf("%f\n",Buff[i]);
    	}
     
    	//liberation memoire 
    	free(Buff_Temp);
     
    	return (0);
     
    }
    le fichier .txt ou .bat est de la forme :

    4.69
    78.945
    454.87
    4.5
    6.9
    45.36

    ou

    4.1307271e-003
    6.7016233e-003
    9.7383247e-003
    1.3330083e-002
    1.7574953e-002

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: probleme avec les allocations memoires
    Citation Envoyé par david35
    j'ai des problemes d'allocations de memoire.. je tourne un peu en rond et je ne vois pas la solution.
    pouvez-vous m'aider a debugger mon code ? merci.
    quand j''appelle la fonction d'interpolation plusieurs fois à la suite, le remplissage du buffer se fait mal.
    J'ai mis un peu de clarté et d'instrumentation dans 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
    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
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <assert.h>
     
    #define FMT "%10.2f"
     
    //fonction d'interpolation pour doubler la taille du buffer
    static int Interpolation (double *Buff
                              ,size_t * p_taille)
    {
       // recopie du buffer existant et de sa taille dans des variables temporaires.
       {
          size_t taille = *p_taille;
          double *Buff_Temp = malloc (taille * sizeof *Buff_Temp);
     
          if (Buff_Temp != NULL)
          {
             {
                size_t i;
                for (i = 0; i < taille; i++)
                {
                   Buff_Temp[i] = Buff[i];
                }
             }
             //on double la taille du buffer pour inserer les valeurs moyennes
             taille = taille * 2 - 1;
             Buff = realloc (Buff, taille * sizeof *Buff);
     
             //remplissage du buffer (anciennes et nouvelles valeurs)
             {
                size_t i;
                for (i = 0; i < taille; i++)
                {
                   //recopie des valeurs existantes
                   if ((i % 2) == 0)
                   {
                      assert ((i / 2) >= 0);
                      assert ((i / 2) < taille);
     
                      Buff[i] = Buff_Temp[i / 2];
                   }
                   //ajout des valeurs intermediaires
                   else
                   {
     
                      assert (((i - 1) / 2) >= 0);
                      assert (((i - 1) / 2) < taille);
                      assert (((i + 1) / 2) >= 0);
                      assert (((i + 1) / 2) < taille);
     
                      Buff[i] = (Buff_Temp[(i - 1) / 2] + Buff_Temp[(i + 1) / 2]) / 2;
                   }
                }
             }
     
             //affichage du nouveau buffer avant retour a la fonction principale
             {
                size_t i;
                for (i = 0; i < taille; i++)
                {
                   printf (FMT"\n", Buff[i]);
                }
             }
             printf ("\n");
     
             //liberation memoire
             free (Buff_Temp), Buff_Temp = NULL;
     
             *p_taille = taille;
             assert (Buff_Temp == NULL);
          }
       }
     
       return 0;
    }
     
    //fonction Modif_Ecg
    static int Modif_Ecg (char const *fname
                          ,double Largeur_P
                          ,double Amplitude_P
                          ,double Largeur_H
                          ,double Amplitude_H
                          ,double Distance_S_T
                          ,double Largeur_T
                          ,double Amplitude_T
                          ,double Pulses_Minute)
    {
       size_t Taille_Buffer = 2000;
     
       //ouverture du fichier contenant le signal echantillonné
       FILE *Pointeur_Fichier = fopen (fname, "r");
     
       if (Pointeur_Fichier != NULL)
       {
          //allocation de memoire pour le buffer
          double *Buffer = malloc (Taille_Buffer * sizeof *Buffer);
     
          if (Buffer != NULL)
          {
             //allocation de memoire pour la chaine de caractere
             char Chaine[20];
     
             //recuperation des float stockes dans le fichier texte
             {
                size_t i = 0;
     
                while (fgets (Chaine, sizeof Chaine, Pointeur_Fichier) != NULL)
                {
                   if (i == Taille_Buffer)
                   {
                      Taille_Buffer = Taille_Buffer * 2;
                   }
                   Buffer = realloc (Buffer, Taille_Buffer * sizeof *Buffer);
                   Buffer[i] = strtod (Chaine, NULL);
                   i++;
                }
                //allocation de memoire au plus juste pour le buffer
                Taille_Buffer = i;
             }
             Buffer = realloc (Buffer, Taille_Buffer * sizeof *Buffer);
     
             //fermeture du fichier
             fclose (Pointeur_Fichier);
     
             //affichage du buffer
             {
                size_t i;
                for (i = 0; i < Taille_Buffer; i++)
                {
                   printf (FMT"\n", Buffer[i]);
                }
             }
             printf ("\n");
     
             //interpolation entre les points du buffer existant
             {
                size_t i;
                for (i = 0; i < 1; i++)
                {
                   Interpolation (Buffer, &Taille_Buffer);
                }
             }
     
             //affichage du buffer apres interpolation
             {
                size_t i;
                for (i = 0; i < Taille_Buffer; i++)
                {
                   printf (FMT"\n", Buffer[i]);
                }
             }
     
             //liberation de la memoire du buffer
             free (Buffer), Buffer = NULL;
          }
          assert (Buffer == NULL);
       }
       else
       {
          perror (fname);
       }
       return 0;
    }
     
    //fonction main
    int main (void)
    {
       //appel a la fonction Modif_Ecg
       Modif_Ecg (FNAME, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0);
       return 0;
    }
    Je ne saurais dire si le résultat est conforme, car je ne sais pas ce qui est attendu.
    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
     
          4.69
         78.94
        454.87
          4.50
          6.90
         45.36
     
          4.69
         41.82
         78.94
        266.91
        454.87
        229.69
          4.50
          5.70
          6.90
         26.13
         45.36
     
          4.69
         41.82
         78.94
        266.91
        454.87
        229.69
          4.50
          5.70
          6.90
         26.13
         45.36
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 4
    Points : 2
    Points
    2
    Par défaut precisions
    j'utilise visual studio 6.0 pour compiler sous windows.
    lorsque je compile le code que vous avez retouché, j'ai des erreurs et warning (en bas de ce commentaire).
    je ne sais pas ce qu'est la variable FNAME, je lisais mes données dans un fichier .txt ou .bat
    avec le code que je fournissais je pouvais compiler et j'obtenais le resultat que vous avez eu également.
    il y a un probleme de memoire lorsque je fais tourner plusieurs fois d'affiler la fonction "interpolation".
    si personne ne voit pourquoi j'ai des problemes avec l'allocation dynamique de mémoire, je tiendrai compte des corrections de code que l'on m'a donné (ou si je n'y arrive pas je mettrai le tout en statique).
    merci.



    Compiling...
    res_forum.c
    s:\developpement\réalisation\dev-dl\18oct05\res_forum.c(170) : error C2065: 'FNAME' : undeclared identifier
    s:\developpement\réalisation\dev-dl\18oct05\res_forum.c(170) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'int '
    s:\developpement\réalisation\dev-dl\18oct05\res_forum.c(170) : warning C4024: 'Modif_Ecg' : different types for formal and actual parameter 1
    Error executing cl.exe.

    res_forum.exe - 1 error(s), 2 warning(s)

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Si j'ai bien compris ton code, dans interpolation, tu realloues Buf, donc buf change d'adresse, mais comme ce changement n'est pas répercuté dans la fonction main, ce n'est pas étonnant que tu aies des problèmes.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: precisions
    Citation Envoyé par david35
    j'utilise visual studio 6.0 pour compiler sous windows.
    lorsque je compile le code que vous avez retouché, j'ai des erreurs et warning (en bas de ce commentaire).
    je ne sais pas ce qu'est la variable FNAME, je lisais mes données dans un fichier .txt ou .bat
    Oui, tu remplaces par le nom de ton fichier. Faut pas sortir de MATernelle SUPérieure pour trouver ça...
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    merci emmanuel et trap d

    avant de revenir sur le forum ce matin, j'ai retouché à ma fonction et c'est bon, j'ai pu faire ce que je voulais.
    desolé emmanuel, j'avais pas fait gaffe qu'il suffisait de remplacer fname par le nom du fichier.

    bonne journee.

    david

Discussions similaires

  1. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  2. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  3. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32
  4. Problem avec les *.AVI sur les panels
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/08/2003, 22h50
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18

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