attemp to free un pointer not allocated by malloc sauf que il l'est

attemp to free un pointer not allocated by malloc sauf que il l'est - C - Programmation

Marsh Posté le 23-04-2020 à 19:37:07    

Hello,
 
J'ai un soucis sur lequel je sèche et qui arrive au bout de mes compétences.
 
J'ai une fonctions qui utilise des tableaux de double (1D). ne connaissant pas la taille à la compil, je passe par des pointers.
J'allocate les pointer avec un calloc pour avoir une mise à zéro des vaelurs du tableau.
 
Mon code viens écrire des valeurs dedans en y accèdant comme un tableau normale.
Je viens de "lire" via des fonctions stdev et median mais je passe son adresse avec un +1.
 
Ensuite je viens le free.
 
On arrive au soucis. Par moment j'ai un non-fatal runtime error qui me dis que le pointer à free n'est pas allocated by malloc, calloc, ...
 
J'ai fait un memset juste avant de le free, il passe bien toute les case à 0, mais il pète en error quand meme de temps en temps.
Je ne comprends pas pourquoi des fois ça marche et des fois non.
 

Citation :

NON-FATAL RUN-TIME ERROR:   "Management_Measure.c", line 949, col 9, thread id 7672, function id 1:   Attempt to free pointer to memory not allocated by malloc() or calloc().


 
Le code code qui utilise le tableau. (rien de plus. Plein de code autour pour faire des calul qui permettent de remplir cette variable et la traiter, mais tout les "accès" a la variables sont là.:

Code :
  1. double *dPhaseShiftSamples = NULL;
  2.         dPhaseShiftSamples = (double*)calloc(PERIOD2PROCESS+2,sizeof(double));
  3. //bout de code autre
  4.         dPhaseShiftSamples[indice] = dX1 - dX2;
  5. //on est dans une for ici
  6.         if (dPhaseShiftSamples[indice] < 0) //on est dans une for ici
  7.     iPolarity[indice] = 1;
  8.    else if (dPhaseShiftSamples[indice] > 0)
  9.     iPolarity[indice] = 2;
  10.    else
  11.     iPolarity[indice] = 0;
  12. //fin de la for
  13. //bout de code autre
  14.         StdDev(dPhaseShiftSamples+1,indice-1,&mean,&stdev);
  15. //bout de code autre
  16. Median(dPhaseShiftSamples+1,indice-1,&dPhaseShiftSamplesMean);
  17. if(dPhaseShiftSamples)
  18. {
  19.  memset(dPhaseShiftSamples,0, (PERIOD2PROCESS+2)*sizeof(double));
  20.  free(dPhaseShiftSamples);
  21.  dPhaseShiftSamples = NULL;
  22. }


---------------
Monde de merde | Restez curieux
Reply

Marsh Posté le 23-04-2020 à 19:37:07   

Reply

Marsh Posté le 29-04-2020 à 08:22:44    

Affiche l'adresse obtenue à la sortie du calloc, et affiche la valeur contenue dans ta variable juste avant le free. Si la valeur a changé, tu as un écrasement mémoire quelque part.
 
edit  :
 

Code :
  1. double *dPhaseShiftSamples = NULL;
  2.         dPhaseShiftSamples = (double*)calloc(PERIOD2PROCESS+2,sizeof(double));
  3.         printf("adresse sortie de calloc : %X\n" , dPhaseShiftSamples  ) ;
  4. //bout de code autre
  5.         dPhaseShiftSamples[indice] = dX1 - dX2;
  6. //on est dans une for ici
  7.         if (dPhaseShiftSamples[indice] < 0) //on est dans une for ici
  8.     iPolarity[indice] = 1;
  9.    else if (dPhaseShiftSamples[indice] > 0)
  10.     iPolarity[indice] = 2;
  11.    else
  12.     iPolarity[indice] = 0;
  13. //fin de la for
  14. //bout de code autre
  15.         StdDev(dPhaseShiftSamples+1,indice-1,&mean,&stdev);
  16. //bout de code autre
  17. Median(dPhaseShiftSamples+1,indice-1,&dPhaseShiftSamplesMean);
  18. if(dPhaseShiftSamples)
  19. {
  20. memset(dPhaseShiftSamples,0, (PERIOD2PROCESS+2)*sizeof(double));
  21. printf("adresse avant free : %X\n" , dPhaseShiftSamples  ) ;
  22. free(dPhaseShiftSamples);
  23. dPhaseShiftSamples = NULL;
  24. }


Message édité par xilebo le 29-04-2020 à 08:23:58
Reply

Marsh Posté le 29-04-2020 à 10:40:52    

StdDev(dPhaseShiftSamples+1,indice-1,&mean,&stdev);
Median(dPhaseShiftSamples+1,indice-1,&dPhaseShiftSamplesMean);
 
Pourquoi passer l'adresse avec un +1 et passer l'indice avec un -1 :??:
 
Par ailleurs, ça serait pas mal d'avoir tout le code (au moins la partie boucle).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-04-2020 à 12:51:11    

Hello,
 
J'ai pas encore regardé si l'adresse change ou pas, j'essaie ça Lundi (chômage partiel cette semaine). En y repensant, que j'ai le crash, en débug je vois que l'adresse après le memset est du style 0x0000001. Avant que j'ajoute le memset l’adresse était plus "normale" mais pas fait gaffe si elle était modifiée.
Par contre je n'explique pas pourquoi l'adresse o(ou même le contenus) serais altéré. Normalement windows empèche d'autres variables de venir mettre le boxon et dans le code je viens n'y faire que de la lecture  en dehors de cette ligne oO :

Code :
  1. dPhaseShiftSamples[indice] = dX1 - dX2;


 
 
Je doit ajouter un check Timeout cet aprèm,je peu vous mettre le code complet de la boucle si vous voulez.
Le but de la fonction est de calculer un déphasage sur 2 types de signaux. J'ai voulu avoir un code générique en fonction des signaux. Comme ça en plus je peut le réutiliser dans d'autres programmes.
C'est sur les signaux d'un stator d'un moteur et du capteur de position du rotor.
Les signaux du stators ont une certaine forme et ceux du capteur de position une autre forme.
Je prends tout les déphasage sur les périodes "électriques" sur un tour mécanique. Ça donne un PERIODE2PROCESS à 6 et je prends un rab de 2 à cause des phases à l'origine suites aux débug.
La référence est la valeur médiane du signal. ça me permet de travailler en acquisition équivalent AC et de prendre le passage par 0 comme référence. (les max sont "écrêtés" et ne sont pas fiable)
 
le +1 / -1 : j'ai une table à 8 éléments mais seulement 6 utiles, le premier est toujours à 0.
Si je met le 0 dans l’écart type et la moyenne ça change tout le résultat.
J'ai des valeurs qui sont d'environ 30 000.


---------------
Monde de merde | Restez curieux
Reply

Marsh Posté le 30-04-2020 à 13:34:00    

jungledede a écrit :

Hello,
 
 
Par contre je n'explique pas pourquoi l'adresse o(ou même le contenus) serais altéré. Normalement windows empèche d'autres variables de venir mettre le boxon et dans le code je viens n'y faire que de la lecture  en dehors de cette ligne oO :


 
Absolument pas. Windows te garantit que tu ne vas pas taper dans l'espace d'adressage d'un autre processus, mais dans ton propre processus, tu fais ce que tu veux. Tu peux faire un écrasement mémoire via une autre variable sans problème. Je te donne un exemple :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.   unsigned int   a;
  6.   unsigned int * b ;
  7.   b = (int *)malloc ( 10 * sizeof(unsigned int));
  8.   printf("adresse a : %X\n" , &a ); 
  9.   printf("adresse b : %X\n" , &b  );
  10.   printf("pointeur alloué : %X\n" , b  );
  11.   *(&a+1) = 0xDEADBEEF;
  12.   printf("pointeur alloué : %X\n" , b  );
  13.  
  14.   free(b);
  15.  
  16.   return 0;
  17.  
  18. }


 
result :  
 


adresse a : 427F5CB4                                                                                                                                                                                                                            
adresse b : 427F5CB8                                                                                                                                                                                                                            
pointeur alloué : 12AC010                                                                                                                                                                                                                        
pointeur alloué : DEADBEEF                                                                                                                                                                                                                      
Segmentation fault (core dumped)


 
J'ai écrasé la valeur de ce que j'ai alloué dans b en passant par la variable a
 
Je dis pas que c'est ce que t'as fait, en général , les écrasements mémoire sont plus subtils, mais le fait est que si ta valeur pointée a changé, c'est pas bon ^^
 
Pire, un écrasement de pile, et tu peux même pas debugguer avec un point d'arrêt car la pile est perdue.

Reply

Marsh Posté le 30-04-2020 à 13:43:39    

Je pense à truc : tu ne vérifies pas que valeur retour de l'alloc de mémoire comme si tu partais du principe que ça serait forcément alloué. Il faut toujours vérifier que l'alloc a bien fonctionné :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-04-2020 à 15:49:11    

xilebo a écrit :


 
Absolument pas. Windows te garantit que tu ne vas pas taper dans l'espace d'adressage d'un autre processus, mais dans ton propre processus, tu fais ce que tu veux. Tu peux faire un écrasement mémoire via une autre variable sans problème. Je te donne un exemple :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.   unsigned int   a;
  6.   unsigned int * b ;
  7.   b = (int *)malloc ( 10 * sizeof(unsigned int));
  8.   printf("adresse a : %X\n" , &a ); 
  9.   printf("adresse b : %X\n" , &b  );
  10.   printf("pointeur alloué : %X\n" , b  );
  11.   *(&a+1) = 0xDEADBEEF;
  12.   printf("pointeur alloué : %X\n" , b  );
  13.  
  14.   free(b);
  15.  
  16.   return 0;
  17.  
  18. }


 
result :  
 


adresse a : 427F5CB4                                                                                                                                                                                                                            
adresse b : 427F5CB8                                                                                                                                                                                                                            
pointeur alloué : 12AC010                                                                                                                                                                                                                        
pointeur alloué : DEADBEEF                                                                                                                                                                                                                      
Segmentation fault (core dumped)


 
J'ai écrasé la valeur de ce que j'ai alloué dans b en passant par la variable a
 
Je dis pas que c'est ce que t'as fait, en général , les écrasements mémoire sont plus subtils, mais le fait est que si ta valeur pointée a changé, c'est pas bon ^^
 
Pire, un écrasement de pile, et tu peux même pas debugguer avec un point d'arrêt car la pile est perdue.


 

rufo a écrit :

Je pense à truc : tu ne vérifies pas que valeur retour de l'alloc de mémoire comme si tu partais du principe que ça serait forcément alloué. Il faut toujours vérifier que l'alloc a bien fonctionné :o


 
ok, je comprends un peut plus. ça confirme le subtile. [:mr mala:1]  
Surtout que j'ai pas encore compris la "recurrence" du crash. Des fois ça fonctionne, des fois non, mais quand ça marche pas c'est toujours sur un signal "bizarre" (du moins une forme trop éloigné d'une sinus. A par ne pas trouver les index qu'il faut je comprends pas encore le lien de cause à effet).  
Je verrais lundis avec les debug supplémentaire ce que je peu trouver.
Après je suis pas vraiment programmeur de formation, je me démerde, mais des fois je sens bien que j'implémente des trucs qui sont pas les bonnes pratiques. (Typiquement ça ne fait que 15 jours que je typecast les malloc :o )
 
Pour le code entier:

Code :
  1. int PhaseAngle(eSignals iSignal1, eSignals iSignal2 ,double dFrequency, unsigned short iNumbPairsPoles, double *pdAngle)
  2. {
  3. // passage en AC      
  4. //TriggerDetection à 0V
  5. // 6 period processed
  6. const int PERIOD2PROCESS = iNumbPairsPoles*1+2;
  7. double  FREQSIGNAL = dFrequency;
  8. int FREQSAMPLE = DescripteurCourbe[iSignal1].frequenceApparenteEchantillonnage;
  9. int nbPoint;
  10. int nbSamplesToCheck = RoundRealToNearestInteger((FREQSAMPLE/FREQSIGNAL)*PERIOD2PROCESS);
  11. int width = nbSamplesToCheck / (PERIOD2PROCESS*3);
  12. int startSample = 0;
  13. double dMedian1,dMedian2;
  14. const int COEFSUPERSAMPLE = 200;
  15. const int SUPER_SAMPLES_MAX = nbSamplesToCheck*COEFSUPERSAMPLE;
  16. double *X = NULL;
  17. double *dSecondDerivative1 = NULL,*dSecondDerivative2 = NULL;
  18. int iSuperSample;
  19. double *dYSuperSampled1 = NULL, *dYSuperSampled2 = NULL;
  20. int *iIndices1 = NULL;
  21. int *iIndices2 = NULL;
  22. const int LINFITSAMPLES = 150*(0.5*COEFSUPERSAMPLE); //20 before
  23. double *dDataX1 = NULL,*dDataX2 = NULL,*dOut = NULL;
  24. int iNewStartSample1 = 0, iNewStartSample2 = 0;
  25. double dA1 = 0, dA2 = 0, dB1 = 0, dB2 = 0, dError1 = 0, dError2 = 0;
  26. double dX1 = 0, dX2 = 0;
  27. double *dPhaseShiftSamples = NULL;
  28. double dPhaseShiftSamplesMean = 0.;
  29. double *dPhaseShiftSamplesTrigger = NULL;
  30. double dPeriodSample = 0.;
  31. double *dPeriodSampleArray = NULL;
  32. int indice = 0;
  33. int iNbIndices1 = 0, iNbIndices2 = 0;
  34. int *iPolarity = NULL;
  35. int iFlagError = false;
  36. int SignalValid = false;
  37. unsigned char maxTryPhase = 1;
  38. int try = 0;
  39.  iPolarity = (int*)calloc(PERIOD2PROCESS+2,sizeof(int));
  40. iIndices1 = (int*)calloc(PERIOD2PROCESS+2,sizeof(int));
  41. iIndices2 = (int*)calloc(PERIOD2PROCESS+2,sizeof(int));
  42. dPhaseShiftSamples = (double*)calloc(PERIOD2PROCESS+2,sizeof(double));
  43. dPhaseShiftSamplesTrigger = (double*)calloc(PERIOD2PROCESS+2,sizeof(double));
  44. dPeriodSampleArray = (double*)calloc(PERIOD2PROCESS+2,sizeof(double));
  45. dDataX1 = (double*)calloc(LINFITSAMPLES+1,sizeof(double));//+2
  46. dDataX2 = (double*)calloc(LINFITSAMPLES+1,sizeof(double));
  47. dOut = (double*)calloc(LINFITSAMPLES+20,sizeof(double));
  48. //Recreate the real signal in super sampled signal (x1000).
  49. //Alow better accuracy
  50. X = (double*)calloc(nbSamplesToCheck,sizeof(double));
  51. dSecondDerivative1 = (double*)calloc(nbSamplesToCheck,sizeof(double));
  52. dSecondDerivative2 = (double*)calloc(nbSamplesToCheck,sizeof(double));
  53. dYSuperSampled1 = (double*)calloc(SUPER_SAMPLES_MAX,sizeof(double));
  54. dYSuperSampled2 = (double*)calloc(SUPER_SAMPLES_MAX,sizeof(double));
  55. double validity = 0;
  56. double stdev = 0;
  57. double mean = 0;
  58. do
  59. {
  60.  printf("debut boucle\n" );
  61.  CHECK_TIMEOUT;
  62.  //sometime the acquition is not finish for all signal, so we cue for the signal with the less of point in the curve.  
  63.  if(DescripteurCourbe[iSignal1].nombrePoints <= DescripteurCourbe[iSignal2].nombrePoints)
  64.   nbPoint = DescripteurCourbe[iSignal1].nombrePoints;
  65.  else
  66.   nbPoint = DescripteurCourbe[iSignal2].nombrePoints;
  67.  startSample = nbPoint - nbSamplesToCheck - 2;
  68.  printf("startSample %d\n",startSample);
  69. //SuperSample the signals  
  70.  Ramp(nbSamplesToCheck,startSample,startSample+nbSamplesToCheck,X);
  71.  Spline(X,DescripteurCourbe[iSignal1].identificateurPointsY.points+startSample, nbSamplesToCheck, 0.0, 0.0, dSecondDerivative1);
  72.  Spline(X,DescripteurCourbe[iSignal2].identificateurPointsY.points+startSample, nbSamplesToCheck, 0.0, 0.0, dSecondDerivative2);
  73.  for (iSuperSample = 0; iSuperSample < SUPER_SAMPLES_MAX; iSuperSample++)
  74.  {
  75.   SpInterp(X,DescripteurCourbe[iSignal1].identificateurPointsY.points+startSample, dSecondDerivative1, nbSamplesToCheck, startSample+iSuperSample*(1.0/COEFSUPERSAMPLE), &dYSuperSampled1[iSuperSample]);
  76.   SpInterp(X,DescripteurCourbe[iSignal2].identificateurPointsY.points+startSample, dSecondDerivative2, nbSamplesToCheck, startSample+iSuperSample*(1.0/COEFSUPERSAMPLE), &dYSuperSampled2[iSuperSample]);
  77.  }
  78. //Get the H1 harmonic for phases since the waveform at crossing 0 is not reliable anymore with rare earth magnet
  79.  if(iSignal1 < PSU1)
  80.  {
  81.   double dFreqResolution;
  82.   double dStartFreq;
  83.   double phaseFound;
  84.   double amplFound;
  85.   double freqFound;
  86.   SearchType Search;
  87.   double *dExportSpectre = (double*)malloc(SUPER_SAMPLES_MAX*sizeof(double));
  88.   double period = 1.0/(DescripteurCourbe[iSignal1].frequenceApparenteEchantillonnage * COEFSUPERSAMPLE);
  89.   Search.centerFrequency = dFrequency;
  90.   Search.frequencyWidth = 2;
  91.   SingleToneSignal (dYSuperSampled1, SUPER_SAMPLES_MAX, period
  92.        , &Search, TONE_EXPORT_DETECTED, &freqFound
  93.        , &amplFound, &phaseFound, dYSuperSampled1
  94.        , &period, dExportSpectre, &dStartFreq, &dFreqResolution);
  95.   free(dExportSpectre);
  96.   dExportSpectre = NULL;
  97.  }
  98.  if(iSignal2 < PSU1)
  99.  {
  100.   double dFreqResolution;
  101.   double dStartFreq;
  102.   double phaseFound;
  103.   double amplFound;
  104.   double freqFound;
  105.   SearchType Search;
  106.   double *dExportSpectre = (double*)malloc(SUPER_SAMPLES_MAX*sizeof(double));
  107.   double period = 1.0/(DescripteurCourbe[iSignal2].frequenceApparenteEchantillonnage * COEFSUPERSAMPLE);
  108.   Search.centerFrequency = dFrequency;
  109.   Search.frequencyWidth = 2;
  110.   SingleToneSignal (dYSuperSampled2, SUPER_SAMPLES_MAX, period
  111.        , &Search, TONE_EXPORT_DETECTED, &freqFound
  112.        , &amplFound, &phaseFound, dYSuperSampled2
  113.        , &period, dExportSpectre, &dStartFreq, &dFreqResolution);
  114.   free(dExportSpectre);
  115.   dExportSpectre = NULL;
  116.  }
  117. //Get the median value (avoid HighPass filter to AC or soustract the ac value)  
  118.  Median(DescripteurCourbe[iSignal1].identificateurPointsY.points+startSample,nbSamplesToCheck,&dMedian1);
  119.  Median(DescripteurCourbe[iSignal2].identificateurPointsY.points+startSample,nbSamplesToCheck,&dMedian2);
  120.  if(dMedian2 ==0)
  121.  {
  122.   //dor debug
  123.   Sleep(1);
  124.  }
  125. // Find the location of the next value over the median value (equivalent to 0V crossign value with AC signal)  
  126.  ThresholdPeakDetector (dYSuperSampled1,
  127.          SUPER_SAMPLES_MAX,
  128.          dMedian1, width,
  129.          iIndices1,&iNbIndices1);
  130.  ThresholdPeakDetector (dYSuperSampled2,
  131.          SUPER_SAMPLES_MAX,
  132.          dMedian2, width,
  133.          iIndices2,&iNbIndices2);
  134.  if (try >= maxTryPhase) //for debug
  135.  {
  136.           YGraphPopup("",dYSuperSampled2,SUPER_SAMPLES_MAX,VAL_DOUBLE);
  137.  }
  138. //Get the sample phase shift
  139.  for(indice = 1;indice < iNumbPairsPoles+1;indice ++)
  140.  {
  141.   if(iIndices1[indice] != 0 && iIndices2[indice] != 0)
  142.   {
  143. //We have samples position, but not acurate enought.
  144. //We get 80 samples around the index sample to process a lineFit.
  145. //With the ax+b line, we can compute the position for the triger position with a result in double.
  146. // (we know y = ax+b.  y = median value, need to find the x).  
  147.   //Create an array for the x axle
  148.    Ramp(LINFITSAMPLES,iIndices1[indice]-(LINFITSAMPLES/2),iIndices1[indice]+(LINFITSAMPLES/2),dDataX1);
  149.    Ramp(LINFITSAMPLES,iIndices2[indice]-(LINFITSAMPLES/2),iIndices2[indice]+(LINFITSAMPLES/2),dDataX2);
  150.   //Get the new start sample    
  151.    iNewStartSample1 = iIndices1[indice]-(LINFITSAMPLES/2);
  152.    if(iNewStartSample1 <0)
  153.     break;
  154.    iNewStartSample2 = iIndices2[indice]-(LINFITSAMPLES/2);
  155.    if(iNewStartSample2 <0)
  156.     break;
  157.   //Get the linear regression  
  158.    LinFit(dDataX1,dYSuperSampled1+iNewStartSample1,LINFITSAMPLES,dOut,&dA1,&dB1,&dError1);
  159.    LinFit(dDataX2,dYSuperSampled2+iNewStartSample2,LINFITSAMPLES,dOut,&dA2,&dB2,&dError2);
  160.   //compute the float number sample (the X at the median value)  
  161.    dX1 = (dMedian1 -dB1) / dA1;
  162.    dX2 = (dMedian2 -dB2) / dA2;
  163.    if(iSignal1 == U1)
  164.    {
  165.     //dor debug
  166.     Sleep(1);
  167.    }
  168.    //computed value  
  169.    dPhaseShiftSamples[indice] = dX1 - dX2;
  170.    if (dPhaseShiftSamples[indice] < 0)
  171.     iPolarity[indice] = 1;
  172.    else if (dPhaseShiftSamples[indice] > 0)
  173.     iPolarity[indice] = 2;
  174.    else
  175.     iPolarity[indice] = 0;
  176.    if(indice > 1)
  177.    {
  178.     if(iPolarity[indice] != iPolarity[indice-1])
  179.      iFlagError = true;
  180.    }
  181.    dPeriodSampleArray[indice] = iIndices1[indice+1] - iIndices1[indice];
  182.    printf("phase %3.2f, period %3.2f\n",dPhaseShiftSamples[indice],dPeriodSampleArray[indice]);
  183.   }
  184.   else
  185.    break;
  186.  }
  187.  //check that all index are almost the same.  
  188.  StdDev(dPhaseShiftSamples+1,indice-1,&mean,&stdev);
  189.  validity = stdev/mean;
  190.  validity = fabs(validity);
  191.  printf("std %f, mean %f, valid %f\n",stdev,mean,validity);
  192.  //(!iFlagError) &&
  193.  if( (validity < 0.01))// if we don't have error, means the index are all in the same order and check they have almost the same valeu.
  194.   SignalValid = TRUE;
  195.  try++;
  196.  printf("fin boucle\n" );
  197. }
  198. while (!SignalValid);
  199. Median(dPhaseShiftSamples+1,indice-1,&dPhaseShiftSamplesMean);
  200. Mean(dPeriodSampleArray+1,indice-1,&dPeriodSample);
  201. if(dPhaseShiftSamples)
  202. {
  203.  memset(dPhaseShiftSamples,0, (PERIOD2PROCESS+2)*sizeof(double));
  204.  free(dPhaseShiftSamples);
  205.  dPhaseShiftSamples = NULL;
  206. }
  207. if(dPeriodSampleArray)
  208. {
  209.  memset(dPeriodSampleArray,0, PERIOD2PROCESS+2);
  210.  free(dPeriodSampleArray);
  211.  dPeriodSampleArray = NULL;
  212. }
  213. if(X)
  214. {
  215.  memset(X,0, nbSamplesToCheck);
  216.  free(X);
  217.  X = NULL;
  218. }
  219. if(dSecondDerivative1)
  220. {
  221.  memset(dSecondDerivative1,0,nbSamplesToCheck);
  222.  free(dSecondDerivative1);
  223.  dSecondDerivative1 = NULL;
  224. }
  225. if(dSecondDerivative2)
  226. {
  227.  memset(dSecondDerivative2,0, nbSamplesToCheck);
  228.  free(dSecondDerivative2);
  229.  dSecondDerivative2 = NULL;
  230. }
  231. if(dYSuperSampled1)
  232. {
  233.  memset(dYSuperSampled1,0,SUPER_SAMPLES_MAX);
  234.  free(dYSuperSampled1);
  235.  dYSuperSampled1 = NULL;
  236. }
  237. if(dYSuperSampled2)
  238. {
  239.  memset(dYSuperSampled2,0, SUPER_SAMPLES_MAX);
  240.  free(dYSuperSampled2);
  241.  dYSuperSampled2 = NULL;
  242. }
  243. if(iIndices1)
  244. {
  245.  memset(iIndices1,0, PERIOD2PROCESS+2);
  246.  free(iIndices1);
  247.  iIndices1 = NULL;
  248. }
  249. if(iIndices2)
  250. {
  251.  memset(iIndices2,0, PERIOD2PROCESS+2);
  252.  free(iIndices2);
  253.  iIndices2 = NULL;
  254. }
  255. if(dDataX1)
  256. {
  257.  free(dDataX1);
  258.  dDataX1 = NULL;
  259. }
  260. if(dDataX2)
  261. {
  262.  free(dDataX2);
  263.  dDataX2 = NULL;
  264. }
  265. if(dOut)
  266. {
  267.  free(dOut);
  268.  dOut = NULL;
  269. }
  270. if(iPolarity)
  271. {
  272.  free(iPolarity);
  273.  iPolarity = NULL;
  274. }
  275. //Convert into angle value
  276. // get periods sample duration
  277. // scale in angle
  278. // dPeriodSample = iIndices1[2] - iIndices1[1];
  279. FREQSAMPLE = FREQSAMPLE*COEFSUPERSAMPLE;
  280. *pdAngle = 360.0*dPhaseShiftSamplesMean/dPeriodSample;
  281. printf("angle %3.2f\n",*pdAngle);
  282. return 0;
  283. }


---------------
Monde de merde | Restez curieux
Reply

Marsh Posté le 30-04-2020 à 17:28:06    

je regarderai plus tard mais y a pas tout :o
 
déjà ça :  
 

Code :
  1. if(iIndices1)
  2. {
  3. memset(iIndices1,0, PERIOD2PROCESS+2);
  4. free(iIndices1);
  5. iIndices1 = NULL;
  6. }


 
ca sert à rien de faire un memset juste avant un free.
 
 
edit : quand je dis y a pas tout, c'est le code complet ( le main, les autres fonctions qui manipulent tes tableaux ).
 

Message cité 1 fois
Message édité par xilebo le 30-04-2020 à 17:33:31
Reply

Marsh Posté le 30-04-2020 à 18:41:00    

Tu pourrais pas mettre le ficheir en téléchargement qq part parce que sans l'indentation, c'est chaud à lire.
 
Déjà, y'a un truc qui me chose si j'ai bien vu : tu fais des déclarations de variables à l'intérieur de ton do...while. C'est aps une bonne idée car à chaque tour de boucle, tu redéclares :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-04-2020 à 19:07:19    

xilebo a écrit :

je regarderai plus tard mais y a pas tout :o

 

déjà ça :

 
Code :
  1. if(iIndices1)
  2. {
  3. memset(iIndices1,0, PERIOD2PROCESS+2);
  4. free(iIndices1);
  5. iIndices1 = NULL;
  6. }
 

ca sert à rien de faire un memset juste avant un free.

 


edit : quand je dis y a pas tout, c'est le code complet ( le main, les autres fonctions qui manipulent tes tableaux ).

 



Le memset on l'a mis en "debug".
On voulais voir si il arrive bien à remettre à zéro le tableau avant le free. Et en point d’arrêt on est bien à 0.
Mais on est d'accord qu'il ne sert à rien et qu'ils seront supprimés quand ça sera fiable.

 

Tout le code est là. Il n'y a que les structures de stockage des points (DescripteurCourbe) qui sont global. Le reste ça passe dans le prototype.

 

Je regarde pour vous mettre le fichier en lien. Je dois avoir un login Github qui traine


Message édité par jungledede le 30-04-2020 à 19:09:40

---------------
Monde de merde | Restez curieux
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed