[C] plantage a la liberation de la memoire

plantage a la liberation de la memoire [C] - C - Programmation

Marsh Posté le 10-08-2004 à 20:16:26    

Bonjour, ou plutot bonsoir,
 
Voila je bosse sur cette liste chainée depuis ce matin, tout marche bien sauf la fonction SLfree qui a une tendance a planter... Donc si quelqu'un voit pourquoi...
Je pense que ca peut etre quelque chose que j'ai pas fais de maniere assez "propre" mais je vois pas pourquoi les plantages sont pas tout le temps au meme endroit dans la fonction.
Donc bon je pourrais ne pas liberer la memoire en fin de programme mais c'est loin d'etre une maniere elegante de faire je trouves...
 

Code :
  1. //constantes
  2. #define SL_FLOAT 1
  3. #define SL_DOUBLE 2
  4. #define SL_INT 3
  5. #define SL_CHAR 4
  6. #define SL_STRING 5
  7. #define SL_LONG 6
  8. #define SL_CHAR_FLOAT "float"
  9. #define SL_CHAR_DOUBLE "double"
  10. #define SL_CHAR_INT "int"
  11. #define SL_CHAR_CHAR "char"
  12. #define SL_CHAR_STRING "string"
  13. #define SL_CHAR_LONG "long"
  14. //error codes
  15. #define SL_OK 0x00
  16. #define SL_Error 0x01
  17. #define SL_ERROR_FILE_EXIST 0x10
  18. #define SL_ERROR_READ 0x11
  19. #define SL_ERROR_WRITE 0x12
  20. #define SL_ERROR_OPEN_FILE 0x13
  21. #define SL_ERROR_FILE_NOT_OPENED 0x14
  22. #define SL_ERROR_UNKNOWN_DATA 0x15
  23. #define SL_ERROR_VAR_NOT_FOUND 0x16
  24. typedef struct _SLelement
  25. {
  26. int iSLtype;
  27. char *sVarName;
  28. void *pvVal;
  29.     struct    _SLelement *NextElm;
  30.     struct    _SLelement *PrevElm;
  31. }SLelement,*pSLelement;
  32. typedef class SLfile
  33. {
  34. private :
  35. pSLelement pSLfirst,pSLlast,pSLcurrent;
  36. FILE *file;
  37. public :
  38. int SLfile::SLinit(); //ok
  39. int putVar(char *cVarName,int iVarType,void *pvValue);
  40. int addVar(pSLelement); //ok
  41. int delVar(char *cVarName); //ok
  42. int changeValue(char *VarName,int iVarType, void *pvVal); //ok
  43. int scanValue(char *cVarName,int iVarType); //ok
  44. pSLelement findVar(char *cVarName); //ok
  45. int writeVar(pSLelement); //ok
  46. int printVar(char *cVarName); //ok
  47. int printAllVar(); //ok
  48. int readVar(char *cVarName,void *pvValue);
  49. int readFile(); //ok
  50. int writeFile(); //ok
  51.     int SLfree(); //ok
  52. int SLfopen(char *filename,char *mode); //ok
  53. int SLfclose(); //ok
  54. }sSLfile,*psSLfile;
  55. int SLfile::SLinit()
  56. {
  57. SLfile::pSLfirst=(pSLelement)0;
  58. SLfile::pSLlast=(pSLelement)0;
  59. SLfile::pSLcurrent=(pSLelement)0;
  60. SLfile::file=(FILE *)0;
  61. return SL_OK;
  62. }
  63. int SLfile::SLfree()
  64. {
  65. pSLelement pslCur;
  66. pslCur=SLfile::pSLlast->PrevElm;
  67. while (pslCur!=(pSLelement)0)
  68. {
  69.  free(pslCur->NextElm->sVarName);
  70.  free(pslCur->NextElm->pvVal);
  71.  free(pslCur->NextElm);
  72.  pslCur->NextElm=(pSLelement)0;
  73.  pslCur=pslCur->PrevElm;
  74. }
  75. /*free(SLfile::pSLfirst->sVarName);
  76. free(SLfile::pSLfirst->pvVal);
  77. free(SLfile::pSLfirst);
  78. SLfile::pSLfirst=(pSLelement)0;
  79. SLfile::pSLlast=(pSLelement)0;*/
  80. return SL_OK;
  81. }
  82. int SLfile::SLfclose()
  83. {
  84. fclose(SLfile::file);
  85. return SL_OK;
  86. }
  87. int SLfile::SLfopen(char *filename,char *mode)
  88. {
  89. SLfile::file=fopen(filename,mode);
  90. if (SLfile::file==(FILE *)0)
  91.  return SL_ERROR_OPEN_FILE;
  92. return SL_OK;
  93. }
  94. int SLfile::addVar(pSLelement SLe)
  95. {
  96. pSLelement pSLnew;
  97.  pSLnew=(pSLelement)malloc(sizeof(SLelement));
  98.  pSLnew->iSLtype=SLe->iSLtype;
  99.  pSLnew->sVarName=(char *)malloc((strlen(SLe->sVarName)+1)*sizeof(char));
  100.  strcpy(pSLnew->sVarName,SLe->sVarName);
  101.  pSLnew->pvVal=(void *)malloc(sizeof(int *));
  102.  switch(SLe->iSLtype)
  103.  {
  104.  case SL_INT : *(int *)pSLnew->pvVal  = *(int *)SLe->pvVal;
  105.  break;
  106.  case SL_LONG : *(long *)pSLnew->pvVal  = *(long *)SLe->pvVal;
  107.  break;
  108.  case SL_DOUBLE: *(double *)pSLnew->pvVal = *(double *)SLe->pvVal;
  109.  break;
  110.  case SL_FLOAT: *(float *)pSLnew->pvVal  = *(float *)SLe->pvVal;
  111.  break;
  112.  case SL_CHAR: *(char *)pSLnew->pvVal  = *(char *)SLe->pvVal;
  113.  break;
  114.  case SL_STRING: sprintf((char *)pSLnew->pvVal,"%s",(char *)SLe->pvVal);
  115.  break;
  116.  }
  117. if (SLfile::pSLcurrent==(pSLelement)0) //first element
  118. {
  119.  SLfile::pSLcurrent=pSLnew;
  120.  SLfile::pSLcurrent->NextElm=(pSLelement)0;
  121.  SLfile::pSLcurrent->PrevElm=(pSLelement)0;
  122.  SLfile::pSLfirst=SLfile::pSLcurrent;
  123.  SLfile::pSLlast=SLfile::pSLcurrent;
  124. }
  125. else
  126. {
  127.  pSLnew->PrevElm=SLfile::pSLcurrent;
  128.  pSLnew->NextElm=SLfile::pSLcurrent->NextElm;
  129.  SLfile::pSLcurrent=pSLnew;
  130.  SLfile::pSLlast->NextElm=SLfile::pSLcurrent;
  131.  SLfile::pSLcurrent->PrevElm=SLfile::pSLlast;
  132.  SLfile::pSLlast=SLfile::pSLcurrent;
  133. }
  134. return SL_OK;
  135. }
  136. int SLfile::putVar(char *cVarName,int iVarType,void *pvValue)
  137. {
  138. SLelement sle;
  139. sle.sVarName=(char *)malloc((strlen(cVarName)+1)*sizeof(char));
  140. strcpy(sle.sVarName,cVarName);
  141. sle.iSLtype=iVarType;
  142. sle.pvVal=(void *)malloc(sizeof(int *));
  143. switch(sle.iSLtype)
  144. {
  145.  case SL_INT : *(int *)sle.pvVal  = *(int *)pvValue;
  146.  break;
  147.  case SL_LONG : *(long *)sle.pvVal  = *(long *)pvValue;
  148.  break;
  149.  case SL_DOUBLE: *(double *)sle.pvVal = *(double *)pvValue;
  150.  break;
  151.  case SL_FLOAT: *(float *)sle.pvVal  = *(float *)pvValue;
  152.  break;
  153.  case SL_CHAR: *(char *)sle.pvVal  = *(char *)pvValue;
  154.  break;
  155.  case SL_STRING: sprintf((char *)sle.pvVal,"%s",(char *)pvValue);
  156.  break;
  157. }
  158. SLfile::addVar(&sle);
  159. return SL_OK;
  160. }
  161. int SLfile::writeVar(pSLelement sle)
  162. {
  163. int iRes;
  164. if (SLfile::file==(FILE *)0)
  165.  return SL_ERROR_FILE_NOT_OPENED;
  166. switch(sle->iSLtype)
  167. {
  168. case SL_INT : iRes=fprintf(SLfile::file,"int\t%s = %d;\n",sle->sVarName,*(int *)sle->pvVal);
  169.  break;
  170. case SL_LONG : iRes=fprintf(SLfile::file,"long\t%s = %ld;\n",sle->sVarName,*(long *)sle->pvVal);
  171.  break;
  172. case SL_DOUBLE:iRes=fprintf(SLfile::file,"double\t%s = %lf;\n",sle->sVarName,*(double *)sle->pvVal);
  173.  break;
  174. case SL_FLOAT:iRes=fprintf(SLfile::file,"float\t%s = %f;\n",sle->sVarName,*(float *)sle->pvVal);
  175.  break;
  176. case SL_CHAR:iRes=fprintf(SLfile::file,"char\t%s = %c;\n",sle->sVarName,*(char *)sle->pvVal);
  177.  break;
  178. case SL_STRING:iRes=fprintf(SLfile::file,"string\t%s = %s;\n",sle->sVarName,(char *)sle->pvVal);
  179.  break;
  180. }
  181. if (iRes<0)
  182.  return SL_ERROR_WRITE;
  183. return SL_OK;
  184. }
  185. int SLfile::writeFile()
  186. {
  187. pSLelement pslCur;
  188. pslCur=SLfile::pSLfirst;
  189. while (pslCur!=(pSLelement)0)
  190. {
  191.  SLfile::writeVar(pslCur);
  192.  pslCur=pslCur->NextElm;
  193. }
  194. return SL_OK;
  195. }
  196. int SLfile::readFile()
  197. {
  198. char buffer[1024];
  199. char buf[1024];
  200. int i,iPos,iPos2;
  201. SLelement sle;
  202. for (i=0;i<1024;i++)
  203. {
  204.  buf[i]='\0';
  205.  buffer[i]='\0';
  206. }
  207. while(!feof(file))
  208. {
  209.  fscanf(SLfile::file,"%s",buffer);
  210.  //type of var
  211.  if (strncmp(buffer,SL_CHAR_INT,sizeof(SL_CHAR_INT))==0) {sle.iSLtype=SL_INT;}
  212.  else if (strncmp(buffer,SL_CHAR_DOUBLE,sizeof(SL_CHAR_DOUBLE))==0){sle.iSLtype=SL_DOUBLE;}
  213.  else if (strncmp(buffer,SL_CHAR_FLOAT,sizeof(SL_CHAR_FLOAT))==0){sle.iSLtype=SL_FLOAT;}
  214.  else if (strncmp(buffer,SL_CHAR_LONG,sizeof(SL_CHAR_LONG))==0){sle.iSLtype=SL_LONG;}
  215.  else if (strncmp(buffer,SL_CHAR_CHAR,sizeof(SL_CHAR_CHAR))==0){sle.iSLtype=SL_CHAR;}
  216.  else if (strncmp(buffer,SL_CHAR_STRING,sizeof(SL_CHAR_STRING))==0){sle.iSLtype=SL_STRING;}
  217.  else
  218.  {
  219.   return SL_ERROR_UNKNOWN_DATA;
  220.  }
  221.  //var name
  222.  fscanf(SLfile::file,"%s = ",buffer);
  223.  sle.sVarName=(char *)malloc((strlen(buffer)+1)*sizeof(char));
  224.  strcpy(sle.sVarName,buffer);
  225.  sle.pvVal=(void *)malloc(sizeof(int *));
  226.  //value
  227.  switch(sle.iSLtype)
  228.  {
  229.   case SL_INT : fscanf(SLfile::file,"%d;\n",(int *)sle.pvVal);
  230.   break;
  231.   case SL_LONG : fscanf(SLfile::file,"%ld;\n",(long *)sle.pvVal);
  232.   break;
  233.   case SL_DOUBLE:fscanf(SLfile::file,"%lf;\n",(double *)sle.pvVal);
  234.   break;
  235.   case SL_FLOAT:fscanf(SLfile::file,"%f;\n",(float *)sle.pvVal);
  236.   break;
  237.   case SL_CHAR:fscanf(SLfile::file,"%c;\n",(char *)sle.pvVal);
  238.   break;
  239.   case SL_STRING:fscanf(SLfile::file,"%s;\n",(char *)sle.pvVal);
  240.   break;
  241.  }
  242.  SLfile::addVar(&sle);
  243. }
  244. return SL_OK;
  245. }
  246. pSLelement SLfile::findVar(char *cVarName)
  247. {
  248. pSLelement pslCurrent;
  249. pslCurrent=SLfile::pSLfirst;
  250. while ((pslCurrent!=(pSLelement)0)&&(strncmp(pslCurrent->sVarName,cVarName,strlen(cVarName))))
  251. {
  252.  pslCurrent=pslCurrent->NextElm;
  253. }
  254. return pslCurrent;
  255. }
  256. int SLfile::scanValue(char *cVarName,int iVarType)
  257. {
  258. pSLelement pslCurrent;
  259. SLelement sle;
  260. pslCurrent=SLfile::findVar(cVarName);
  261. if (pslCurrent==(pSLelement)0)
  262. {
  263.  sle.iSLtype=iVarType;
  264.  sle.pvVal=(void *)0;
  265.  sprintf(sle.sVarName,"%s",cVarName);
  266.  SLfile::addVar(&sle);
  267.  pslCurrent=SLfile::findVar(cVarName);
  268. }
  269. printf("%s = ",pslCurrent->sVarName);
  270. switch(pslCurrent->iSLtype)
  271. {
  272.  case SL_INT : scanf("%d;\n",(int *)pslCurrent->pvVal);
  273.  break;
  274.  case SL_LONG : scanf("%ld;\n",(long *)pslCurrent->pvVal);
  275.  break;
  276.  case SL_DOUBLE:scanf("%lf;\n",(double *)pslCurrent->pvVal);
  277.  break;
  278.  case SL_FLOAT:scanf("%f;\n",(float *)pslCurrent->pvVal);
  279.  break;
  280.  case SL_CHAR:scanf("%c;\n",(char *)pslCurrent->pvVal);
  281.  break;
  282.  case SL_STRING:scanf("%s;\n",(char *)pslCurrent->pvVal);
  283.  break;
  284. }
  285. SLfile::changeValue(cVarName,pslCurrent->iSLtype,pslCurrent->pvVal);
  286. return SL_OK;
  287. }
  288. int SLfile::printVar(char *cVarName)
  289. {
  290. pSLelement pslCurrent;
  291. pslCurrent=SLfile::findVar(cVarName);
  292. if (pslCurrent==(pSLelement)0)
  293. {
  294.  return SL_ERROR_VAR_NOT_FOUND;
  295. }
  296. switch(pslCurrent->iSLtype)
  297. {
  298.  case SL_INT : printf("%s = %d\n",cVarName,*(int *)pslCurrent->pvVal);
  299.  break;
  300.  case SL_LONG : printf("%s = %ld\n",cVarName,*(long *)pslCurrent->pvVal);
  301.  break;
  302.  case SL_DOUBLE:printf("%s = %lf\n",cVarName,*(double *)pslCurrent->pvVal);
  303.  break;
  304.  case SL_FLOAT:printf("%s = %f\n",cVarName,*(float *)pslCurrent->pvVal);
  305.  break;
  306.  case SL_CHAR:printf("%s = %c\n",cVarName,*(char *)pslCurrent->pvVal);
  307.  break;
  308.  case SL_STRING:printf("%s = %s\n",cVarName,(char *)pslCurrent->pvVal);
  309.  break;
  310. }
  311. return SL_OK;
  312. }
  313. int SLfile::printAllVar()
  314. {
  315. pSLelement pslCurrent;
  316. pslCurrent=SLfile::pSLfirst;
  317. while (pslCurrent!=(pSLelement)0)
  318. {
  319.  SLfile::printVar(pslCurrent->sVarName);
  320.  pslCurrent=pslCurrent->NextElm;
  321. }
  322. return SL_OK;
  323. }
  324. int SLfile::delVar(char *cVarName)
  325. {
  326. pSLelement pslCur;
  327. pslCur=SLfile::findVar(cVarName);
  328. if (pslCur==(pSLelement)0)
  329. {
  330.  return SL_ERROR_VAR_NOT_FOUND;
  331. }
  332. pslCur->PrevElm->NextElm=pslCur->NextElm;
  333. pslCur->NextElm->PrevElm=pslCur->PrevElm;
  334. free(pslCur);
  335. return SL_OK;
  336. }
  337. int SLfile::changeValue(char *cVarName,int iVarType,void *pvVal)
  338. {
  339. pSLelement pslCur;
  340. pslCur=SLfile::findVar(cVarName);
  341. if (pslCur==(pSLelement)0)
  342. {
  343.  return SL_ERROR_VAR_NOT_FOUND;
  344. }
  345. pslCur->iSLtype=iVarType;
  346. pslCur->pvVal=pvVal;
  347. return SL_OK;
  348. }
  349. int SLfile::readVar(char *cVarName,void *pvValue)
  350. {
  351. pSLelement pslCur;
  352. pslCur=SLfile::findVar(cVarName);
  353. if (pslCur==(pSLelement)0)
  354. {
  355.  return SL_ERROR_VAR_NOT_FOUND;
  356. }
  357. switch(pslCur->iSLtype)
  358. {
  359.  case SL_INT : *(int *)pvValue  = *(int *)pslCur->pvVal;
  360.  break;
  361.  case SL_LONG : *(long *)pvValue = *(long *)pslCur->pvVal;
  362.  break;
  363.  case SL_DOUBLE: *(double *)pvValue = *(double *)pslCur->pvVal;
  364.  break;
  365.  case SL_FLOAT: *(float *)pvValue = *(float *)pslCur->pvVal;
  366.  break;
  367.  case SL_CHAR: *(char *)pvValue = *(char *)pslCur->pvVal;
  368.  break;
  369.  case SL_STRING: sprintf((char *)pvValue,"%s",(char *)pslCur->pvVal);
  370.  break;
  371. }
  372. return SL_OK;
  373. }


Message édité par GuiYom_00 le 10-08-2004 à 20:29:33
Reply

Marsh Posté le 10-08-2004 à 20:16:26   

Reply

Marsh Posté le 10-08-2004 à 20:22:07    

oh du C :o

Reply

Marsh Posté le 10-08-2004 à 20:25:07    

et alors?

Reply

Marsh Posté le 10-08-2004 à 20:25:35    

ben te la joue pas C++ alors :o

Reply

Marsh Posté le 10-08-2004 à 20:30:00    

Voila j'ai rectifié le titre...

Reply

Marsh Posté le 10-08-2004 à 20:33:42    

ce que t'es idiot ...

Reply

Marsh Posté le 10-08-2004 à 21:47:29    

bon, que je m'explique alors vu que on dirait que quelqu'un ici aime a ce que l'on soit precis...
Oui j'ai fais une classe C++, et oui j'utilise les fonctions C malloc, printf... et autres et non je ne veux pas changer pour iostream.h et new, delete a la place de malloc free...
Et bon, que je sache, ca m'etonnerait que les problemes viennent de l'utilisation de malloc a la place de new vu que dans mon cas, j'ai vérifié et je n'ai pas de problemes lors des allocations...

Reply

Marsh Posté le 10-08-2004 à 21:56:19    

ton problème c'est que tu fais du très mauvais C avec des classes C++ :  à mélanger les genre, tu n'as que les inconvénients des 2 langages
 
 
edit : y a pas a dire, je ne garderais pas une seule ligne, ton C est vraiment mauvais  et dangereux. revois tes bases sur les FILE* (feof en particulier), (f)scanf, découvre fgets, les enums, les déclarations imbriquées, le mot clef const, vire tes cast inutiles. tes allocations sont bugguées et défaillantes, tu passes ton temps à corrompre ta mémoire. y a pas un seul malloc correct
 
quant au C++, n'en parlons pas


Message édité par Taz le 10-08-2004 à 22:05:42
Reply

Marsh Posté le 10-08-2004 à 22:08:56    

GuiYom_00 a écrit :

Oui j'ai fais une classe C++, et oui j'utilise les fonctions C malloc, printf... et autres


ouais enfin a la base tu choisis entre C et C++ et tu t'y tiens, à part quand t'as pas le choix tu code pas dans un truc hybride avec des bouts de C et des bouts de C++...

Citation :

et non je ne veux pas changer pour iostream.h


et <iostream>?
 
Après pour la technique 'pure' je ne vais sûrement pas prétendre être du niveau du grincheux croulant ( :whistle: ) donc je vais te laisser voir ce qu'il dit


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 10-08-2004 à 22:23:55    

en fait ce qui se passe c que j'ai un code fait a 95% en C et pour me faciliter la vie, j'aurais juste besoin de la classe C++ que j'ai copié au dessus...  
donc voila pourquoi je veux pas tout reprendre maintenant que j'en suis a un peu plus de 5000 ligne de code quand meme...

Reply

Marsh Posté le 10-08-2004 à 22:23:55   

Reply

Marsh Posté le 10-08-2004 à 22:41:52    

ben quand t'es pas capable de faire un malloc correct mais que tu te permets de critiquer new, j'ai peur ...

Reply

Marsh Posté le 10-08-2004 à 22:51:16    

alors dans ce cas dis moi ou mon malloc est pas correct...
si c'est a cause des typecast, c juste pour que VS gueule pas...

Reply

Marsh Posté le 10-08-2004 à 23:01:38    

 sle.pvVal=(void *)malloc(sizeof(int *));  dans readFile par exemple :o

Reply

Marsh Posté le 10-08-2004 à 23:05:15    

tu preferes que je mettes   sle.pvVal=(void *)malloc(sizeof(void *));
mais bon ca ne changes quand meme rien...

Reply

Marsh Posté le 10-08-2004 à 23:07:37    

tes classes ne sont meme pas canonique

Reply

Marsh Posté le 10-08-2004 à 23:08:08    

le problème c'est pas ça :o

Reply

Marsh Posté le 10-08-2004 à 23:09:49    

oui je sais

Reply

Marsh Posté le 10-08-2004 à 23:10:38    

GuiYom_00 a écrit :

tu preferes que je mettes   sle.pvVal=(void *)malloc(sizeof(void *));
mais bon ca ne changes quand meme rien...


 
c'est un pointeur sur quel type sle.pvVal ?

Reply

Marsh Posté le 10-08-2004 à 23:16:12    

justement, ca depends... ca peut etre float, int, double...
donc par defaut je mets un void et apres je fais un cast quand je veux lui donner une valeur particuliere... mais bon, vu que tout les pointeurs ont la meme taille, c'est vrai que c'est pas la dessus que j'ai porté toute mon attention...
 
Edit : c'est vrai que une fois que je serais sur que les fontions marchent, je m'occuperai de rendre la classe canonique...


Message édité par GuiYom_00 le 10-08-2004 à 23:20:13
Reply

Marsh Posté le 10-08-2004 à 23:19:48    

si tu veux allouer pour un double
sle.pvVal=malloc(sizeof(double));  
...
 
le cast du malloc est inutile

Reply

Marsh Posté le 10-08-2004 à 23:20:15    

oui mais ce que tu fous dedans :o

Reply

Marsh Posté le 10-08-2004 à 23:21:56    

dans quoi ?

Reply

Marsh Posté le 10-08-2004 à 23:23:13    

*(double *)pSLnew->pvVal = *(double *)SLe->pvVal
 
 
et après ça y va ....

Reply

Marsh Posté le 10-08-2004 à 23:25:19    

ouai :D

Reply

Marsh Posté le 10-08-2004 à 23:26:09    

et je parle pas du cast de lvalue qui est rigoureusement interdit :o

Reply

Marsh Posté le 10-08-2004 à 23:29:49    

et yen a partout

Reply

Marsh Posté le 10-08-2004 à 23:31:22    

sprintf((char *)pSLnew->pvVal,"%s",(char *)SLe->pvVal);  
 
et ça c'est pas beau ?

Reply

Marsh Posté le 10-08-2004 à 23:31:40    

ok si je veux allouer pour un double je fais sle.pvVal=malloc(sizeof(double));
mais le truc c'est que je ne sais pas a l'avance quel est le type des variables or dans ma declaration il faut quand meme que je dise que j'ai besoin d'un pointeur...
 
Peut etre que si j'explique un peu plus dans quel but je fais cette classe, cela rendra les choses plus claires...
Un programme a besoin de X parametres , par exemple un temps (double), une position (aussi double), le nom d'un fichier (char *)...et il faut qu'il stocke ces parametres dans un fichier a qu'il puisse les relire a chaque execution...
Dans ce cas, je me sers de cette classe pour creer le fichier avec les valeurs dedans, et aussi pour le lire...
Donc vu que mes variables peuvent etre de differents type, je ne vois pas comment faire autrement que par des void * et des cast...

Reply

Marsh Posté le 10-08-2004 à 23:33:21    

« il faut quand meme que je dise que j'ai besoin d'un pointeur... » le fait est que tu n'as pas besoin d'un pointeur
 
 
la solution classique C, c'est union + enum, comme j'ai déjà maintes fois donné l'exemple

Reply

Marsh Posté le 10-08-2004 à 23:33:46    

c'est stylisé

Reply

Marsh Posté le 10-08-2004 à 23:35:12    

c'est canonique comme façon de faire

Reply

Marsh Posté le 10-08-2004 à 23:50:33    

Oui c'est vrai que j'avais pas pensé au systeme enum+union...
mais ca n'empeche que j'aimerais savoir pourquoi j'ai les free qui plantent de temps en temps alors que, meme si l'utilisation des void * n'est peut etre pas la plus "jolie", a aucun moment dans les test que j'ai fais je n'ai eu de problemes pour lire mes valeurs, les ecrire, les afficher ou quoi que ce sois d'autres...

Reply

Marsh Posté le 10-08-2004 à 23:51:31    

qu'est-ce que tu veux que tes free comprennent si tu cases tes données n'importe ou ? le problème c'est pas les free bordel :o

Reply

Marsh Posté le 10-08-2004 à 23:56:31    

mes mes données sont bien casées dans mes pointeurs void pourtant... donc je vois pas en quoi les free sont génés...
 
Edit  et pour en revenir aux expressions du type : *(int *)sle.pvVal  = *(int *)pvValue
Si j'ai fais ca, c'est que je ne veux pas que au moment ou je libere la memoire allouée a sle.pvVal, ca joue sur la zone memoire de pvValue...
Or si j'avais fais sle.pvVal=pvValue
et qu'ensuite je fais un free(sle.pvVal) alors que va-t-il advenir de la valeur de pvValue??


Message édité par GuiYom_00 le 10-08-2004 à 23:59:39
Reply

Marsh Posté le 10-08-2004 à 23:56:57    

NON :o

Reply

Marsh Posté le 11-08-2004 à 00:00:14    

alors elles sont ou mes données???

Reply

Marsh Posté le 11-08-2004 à 00:01:09    

la ou elle devrait pas être, ça corrompt tout et n'importe quoi

Reply

Marsh Posté le 11-08-2004 à 00:09:15    

ok donc dans ce cas je vais voir ce que me donne un petit debug en suivant bien tout du debut a la fin concernant la memoire pour savoir ou c que ca commence a partir en live...

Reply

Marsh Posté le 11-08-2004 à 00:10:31    

des que tu touches à un pointeur :o
 
tu gagnerais du temps à passer au modèle enum+union, plus d'allocation dynamique si ce n'est pour ta structure de données.
 
ou alors tu fais ça en 2 lignes de C++ avec std::list, mais c'est toi qui voit

Reply

Marsh Posté le 11-08-2004 à 00:15:42    

C'est sur que la liste chainée, je vois pas trop comment je pourrais faire autrement...
et bon, le modele enum+union est assez rapide a mettre en place, mais vu que je suis quand meme un peutetu, je vais essayer de voir plus en detail les raisons des plantages...car les pointeurs, je fais gaffe justement a essayer de pas trop les "deplacer" mais juste a modifier leurs valeurs...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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