Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1507 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] plantage a la liberation de la memoire

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[C] plantage a la liberation de la memoire

n°819547
GuiYom_00
Posté le 10-08-2004 à 20:16:26  profilanswer
 

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
mood
Publicité
Posté le 10-08-2004 à 20:16:26  profilanswer
 

n°819552
Taz
bisounours-codeur
Posté le 10-08-2004 à 20:22:07  profilanswer
 

oh du C :o

n°819558
GuiYom_00
Posté le 10-08-2004 à 20:25:07  profilanswer
 

et alors?

n°819560
Taz
bisounours-codeur
Posté le 10-08-2004 à 20:25:35  profilanswer
 

ben te la joue pas C++ alors :o

n°819569
GuiYom_00
Posté le 10-08-2004 à 20:30:00  profilanswer
 

Voila j'ai rectifié le titre...

n°819571
Taz
bisounours-codeur
Posté le 10-08-2004 à 20:33:42  profilanswer
 

ce que t'es idiot ...

n°819602
GuiYom_00
Posté le 10-08-2004 à 21:47:29  profilanswer
 

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...

n°819607
Taz
bisounours-codeur
Posté le 10-08-2004 à 21:56:19  profilanswer
 

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
n°819615
masklinn
í dag viðrar vel til loftárása
Posté le 10-08-2004 à 22:08:56  profilanswer
 

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
n°819625
GuiYom_00
Posté le 10-08-2004 à 22:23:55  profilanswer
 

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...

mood
Publicité
Posté le 10-08-2004 à 22:23:55  profilanswer
 

n°819630
Taz
bisounours-codeur
Posté le 10-08-2004 à 22:41:52  profilanswer
 

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

n°819643
GuiYom_00
Posté le 10-08-2004 à 22:51:16  profilanswer
 

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...

n°819658
Taz
bisounours-codeur
Posté le 10-08-2004 à 23:01:38  profilanswer
 

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

n°819673
GuiYom_00
Posté le 10-08-2004 à 23:05:15  profilanswer
 

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

n°819683
cris56
Posté le 10-08-2004 à 23:07:37  profilanswer
 

tes classes ne sont meme pas canonique

n°819687
Taz
bisounours-codeur
Posté le 10-08-2004 à 23:08:08  profilanswer
 

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

n°819697
cris56
Posté le 10-08-2004 à 23:09:49  profilanswer
 

oui je sais

n°819701
cris56
Posté le 10-08-2004 à 23:10:38  profilanswer
 

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 ?

n°819732
GuiYom_00
Posté le 10-08-2004 à 23:16:12  profilanswer
 

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
n°819740
cris56
Posté le 10-08-2004 à 23:19:48  profilanswer
 

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

n°819741
Taz
bisounours-codeur
Posté le 10-08-2004 à 23:20:15  profilanswer
 

oui mais ce que tu fous dedans :o

n°819744
cris56
Posté le 10-08-2004 à 23:21:56  profilanswer
 

dans quoi ?

n°819747
Taz
bisounours-codeur
Posté le 10-08-2004 à 23:23:13  profilanswer
 

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

n°819749
cris56
Posté le 10-08-2004 à 23:25:19  profilanswer
 

ouai :D

n°819750
Taz
bisounours-codeur
Posté le 10-08-2004 à 23:26:09  profilanswer
 

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

n°819758
cris56
Posté le 10-08-2004 à 23:29:49  profilanswer
 

et yen a partout

n°819761
Taz
bisounours-codeur
Posté le 10-08-2004 à 23:31:22  profilanswer
 

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

n°819763
GuiYom_00
Posté le 10-08-2004 à 23:31:40  profilanswer
 

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...

n°819770
Taz
bisounours-codeur
Posté le 10-08-2004 à 23:33:21  profilanswer
 

« 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

n°819772
cris56
Posté le 10-08-2004 à 23:33:46  profilanswer
 

c'est stylisé

n°819775
Taz
bisounours-codeur
Posté le 10-08-2004 à 23:35:12  profilanswer
 

c'est canonique comme façon de faire

n°819809
GuiYom_00
Posté le 10-08-2004 à 23:50:33  profilanswer
 

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...

n°819813
Taz
bisounours-codeur
Posté le 10-08-2004 à 23:51:31  profilanswer
 

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

n°819819
GuiYom_00
Posté le 10-08-2004 à 23:56:31  profilanswer
 

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
n°819821
Taz
bisounours-codeur
Posté le 10-08-2004 à 23:56:57  profilanswer
 

NON :o

n°819827
GuiYom_00
Posté le 11-08-2004 à 00:00:14  profilanswer
 

alors elles sont ou mes données???

n°819829
Taz
bisounours-codeur
Posté le 11-08-2004 à 00:01:09  profilanswer
 

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

n°819837
GuiYom_00
Posté le 11-08-2004 à 00:09:15  profilanswer
 

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...

n°819840
Taz
bisounours-codeur
Posté le 11-08-2004 à 00:10:31  profilanswer
 

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

n°819850
GuiYom_00
Posté le 11-08-2004 à 00:15:42  profilanswer
 

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...

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] plantage a la liberation de la memoire

 

Sujets relatifs
[debutant] Probleme d'allocation memoire pour de grands tableaux[Java] Problème de taille mémoire avec un JTree
[C++] Plantage d'une dll [résolu][ASM] Optim : précalcul en mémoire ou calcul sur registres ?
[Oracle] Debug - Forcer le plantage dans cas particulier...Mise en mémoire d'évènements midi : HashMap ?
pile memoire - modification donneesPlantage inexpliqué dès que je touche à un .h
[Weblogic] pas assez de mémoire sous l'EDI Workshopgestion de la memoire
Plus de sujets relatifs à : [C] plantage a la liberation de la memoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR