Here is my function finished but the free is working now because I added struct before the declaration of temp_arr:
This could be helpful for other people maybe:
void quantile(d_array arr, d_array percentages, d_array borders )
{
int i;
struct d_array temp_arr;
temp_arr.content = (double *)malloc(sizeof(double)*(arr.len+2));
memcpy(temp_arr.content+1, arr.content, sizeof(double)*arr.len);
t_d(temp_arr.content, 25);
qsort(temp_arr.content+1, arr.len, sizeof(double), d_compare);
t_d(temp_arr.content, 25);
temp_arr.content[0] = temp_arr.content[1];
temp_arr.content[arr.len+1] = temp_arr.content[arr.len];
t_d(temp_arr.content, 25);
d_array q;
q.len = arr.len+2;
q.content = malloc(sizeof(double)*(arr.len+2));
q.content[0] = 0;
q.content[1] = 100*0.5/arr.len;
q.content[arr.len+1] = 100;
for(i=2; i<arr.len+1 ;i++)
q.content[i] = (q.content[i-1] + (double)100/arr.len);
int indx=0;
double elem=0;
for(i=0; i< percentages.len; i++)
{
find(q, percentages.content[i]*100, '>', &indx, &elem);
if (temp_arr.content[indx] == temp_arr.content[indx-1] )
borders.content[i] = temp_arr.content[indx-1];
else
borders.content[i] = temp_arr.content[indx-1] + (percentages.content[i]*100 - q.content[indx-1])*(temp_arr.content[indx]-temp_arr.content[indx-1])/(q.content[indx]-q.content[indx-1]) ;
}
free(temp_arr.content);
}
find function:
int find(d_array mat, double el, char op, int *indx, double * eee)
{
int i;
if (op=='>')
for(i=0;i<mat.len ;i++)
if (mat.content[i]>el)
{
*indx = i;
*eee= mat.content[i];
return 0;
}
else if(op=='=')
for(i=0;i<mat.len ;i++)
if (mat.content[i] == el)
{
*indx = i;
*eee = mat.content[i];
return 0;
}
else if(op=='<')
for(i=0;i<mat.len ;i++)
if (mat.content[i] < el)
{
*indx = i;
*eee = mat.content[i];
return 0;
}
return 1;
}
and:
struct d_array
{ double *content
int len
} d_array;
the call is :
double test_sig[] = {1.0, 0.0, 2.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 15.0, 0.0,51.0, 20.0, 514.0, 2.0, 0.0, 151.0, 20.0, 51.0, 0.0, 016.0, 05.0};
struct d_array pecentages;
pecentages.content=malloc(sizeof(double)*5);
pecentages.len=5;
struct d_array borders;
borders.content=malloc(sizeof(double)*5);
borders.len=5;
mat.content = test_sig;
pecentages.content[0] = 0.1;
pecentages.content[1] = 0.2;
pecentages.content[2] = 0.5;
pecentages.content[3] = 0.8;
pecentages.content[4] = 0.9;
quantile( mat, pecentages, borders );