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