GuiYom_00 | 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 :
- //constantes
- #define SL_FLOAT 1
- #define SL_DOUBLE 2
- #define SL_INT 3
- #define SL_CHAR 4
- #define SL_STRING 5
- #define SL_LONG 6
- #define SL_CHAR_FLOAT "float"
- #define SL_CHAR_DOUBLE "double"
- #define SL_CHAR_INT "int"
- #define SL_CHAR_CHAR "char"
- #define SL_CHAR_STRING "string"
- #define SL_CHAR_LONG "long"
- //error codes
- #define SL_OK 0x00
- #define SL_Error 0x01
- #define SL_ERROR_FILE_EXIST 0x10
- #define SL_ERROR_READ 0x11
- #define SL_ERROR_WRITE 0x12
- #define SL_ERROR_OPEN_FILE 0x13
- #define SL_ERROR_FILE_NOT_OPENED 0x14
- #define SL_ERROR_UNKNOWN_DATA 0x15
- #define SL_ERROR_VAR_NOT_FOUND 0x16
- typedef struct _SLelement
- {
- int iSLtype;
- char *sVarName;
- void *pvVal;
- struct _SLelement *NextElm;
- struct _SLelement *PrevElm;
- }SLelement,*pSLelement;
- typedef class SLfile
- {
- private :
- pSLelement pSLfirst,pSLlast,pSLcurrent;
- FILE *file;
- public :
- int SLfile::SLinit(); //ok
- int putVar(char *cVarName,int iVarType,void *pvValue);
- int addVar(pSLelement); //ok
- int delVar(char *cVarName); //ok
- int changeValue(char *VarName,int iVarType, void *pvVal); //ok
- int scanValue(char *cVarName,int iVarType); //ok
- pSLelement findVar(char *cVarName); //ok
- int writeVar(pSLelement); //ok
- int printVar(char *cVarName); //ok
- int printAllVar(); //ok
- int readVar(char *cVarName,void *pvValue);
- int readFile(); //ok
- int writeFile(); //ok
- int SLfree(); //ok
- int SLfopen(char *filename,char *mode); //ok
- int SLfclose(); //ok
- }sSLfile,*psSLfile;
- int SLfile::SLinit()
- {
- SLfile::pSLfirst=(pSLelement)0;
- SLfile::pSLlast=(pSLelement)0;
- SLfile::pSLcurrent=(pSLelement)0;
- SLfile::file=(FILE *)0;
- return SL_OK;
- }
- int SLfile::SLfree()
- {
- pSLelement pslCur;
- pslCur=SLfile::pSLlast->PrevElm;
- while (pslCur!=(pSLelement)0)
- {
- free(pslCur->NextElm->sVarName);
- free(pslCur->NextElm->pvVal);
- free(pslCur->NextElm);
- pslCur->NextElm=(pSLelement)0;
- pslCur=pslCur->PrevElm;
- }
- /*free(SLfile::pSLfirst->sVarName);
- free(SLfile::pSLfirst->pvVal);
- free(SLfile::pSLfirst);
- SLfile::pSLfirst=(pSLelement)0;
- SLfile::pSLlast=(pSLelement)0;*/
- return SL_OK;
- }
- int SLfile::SLfclose()
- {
- fclose(SLfile::file);
- return SL_OK;
- }
- int SLfile::SLfopen(char *filename,char *mode)
- {
- SLfile::file=fopen(filename,mode);
- if (SLfile::file==(FILE *)0)
- return SL_ERROR_OPEN_FILE;
- return SL_OK;
- }
- int SLfile::addVar(pSLelement SLe)
- {
- pSLelement pSLnew;
- pSLnew=(pSLelement)malloc(sizeof(SLelement));
- pSLnew->iSLtype=SLe->iSLtype;
- pSLnew->sVarName=(char *)malloc((strlen(SLe->sVarName)+1)*sizeof(char));
- strcpy(pSLnew->sVarName,SLe->sVarName);
- pSLnew->pvVal=(void *)malloc(sizeof(int *));
- switch(SLe->iSLtype)
- {
- case SL_INT : *(int *)pSLnew->pvVal = *(int *)SLe->pvVal;
- break;
- case SL_LONG : *(long *)pSLnew->pvVal = *(long *)SLe->pvVal;
- break;
- case SL_DOUBLE: *(double *)pSLnew->pvVal = *(double *)SLe->pvVal;
- break;
- case SL_FLOAT: *(float *)pSLnew->pvVal = *(float *)SLe->pvVal;
- break;
- case SL_CHAR: *(char *)pSLnew->pvVal = *(char *)SLe->pvVal;
- break;
- case SL_STRING: sprintf((char *)pSLnew->pvVal,"%s",(char *)SLe->pvVal);
- break;
- }
- if (SLfile::pSLcurrent==(pSLelement)0) //first element
- {
- SLfile::pSLcurrent=pSLnew;
- SLfile::pSLcurrent->NextElm=(pSLelement)0;
- SLfile::pSLcurrent->PrevElm=(pSLelement)0;
- SLfile::pSLfirst=SLfile::pSLcurrent;
- SLfile::pSLlast=SLfile::pSLcurrent;
- }
- else
- {
- pSLnew->PrevElm=SLfile::pSLcurrent;
- pSLnew->NextElm=SLfile::pSLcurrent->NextElm;
- SLfile::pSLcurrent=pSLnew;
- SLfile::pSLlast->NextElm=SLfile::pSLcurrent;
- SLfile::pSLcurrent->PrevElm=SLfile::pSLlast;
- SLfile::pSLlast=SLfile::pSLcurrent;
- }
- return SL_OK;
- }
- int SLfile::putVar(char *cVarName,int iVarType,void *pvValue)
- {
- SLelement sle;
- sle.sVarName=(char *)malloc((strlen(cVarName)+1)*sizeof(char));
- strcpy(sle.sVarName,cVarName);
- sle.iSLtype=iVarType;
- sle.pvVal=(void *)malloc(sizeof(int *));
- switch(sle.iSLtype)
- {
- case SL_INT : *(int *)sle.pvVal = *(int *)pvValue;
- break;
- case SL_LONG : *(long *)sle.pvVal = *(long *)pvValue;
- break;
- case SL_DOUBLE: *(double *)sle.pvVal = *(double *)pvValue;
- break;
- case SL_FLOAT: *(float *)sle.pvVal = *(float *)pvValue;
- break;
- case SL_CHAR: *(char *)sle.pvVal = *(char *)pvValue;
- break;
- case SL_STRING: sprintf((char *)sle.pvVal,"%s",(char *)pvValue);
- break;
- }
- SLfile::addVar(&sle);
- return SL_OK;
- }
- int SLfile::writeVar(pSLelement sle)
- {
- int iRes;
- if (SLfile::file==(FILE *)0)
- return SL_ERROR_FILE_NOT_OPENED;
- switch(sle->iSLtype)
- {
- case SL_INT : iRes=fprintf(SLfile::file,"int\t%s = %d;\n",sle->sVarName,*(int *)sle->pvVal);
- break;
- case SL_LONG : iRes=fprintf(SLfile::file,"long\t%s = %ld;\n",sle->sVarName,*(long *)sle->pvVal);
- break;
- case SL_DOUBLE:iRes=fprintf(SLfile::file,"double\t%s = %lf;\n",sle->sVarName,*(double *)sle->pvVal);
- break;
- case SL_FLOAT:iRes=fprintf(SLfile::file,"float\t%s = %f;\n",sle->sVarName,*(float *)sle->pvVal);
- break;
- case SL_CHAR:iRes=fprintf(SLfile::file,"char\t%s = %c;\n",sle->sVarName,*(char *)sle->pvVal);
- break;
- case SL_STRING:iRes=fprintf(SLfile::file,"string\t%s = %s;\n",sle->sVarName,(char *)sle->pvVal);
- break;
- }
- if (iRes<0)
- return SL_ERROR_WRITE;
- return SL_OK;
- }
- int SLfile::writeFile()
- {
- pSLelement pslCur;
- pslCur=SLfile::pSLfirst;
- while (pslCur!=(pSLelement)0)
- {
- SLfile::writeVar(pslCur);
- pslCur=pslCur->NextElm;
- }
- return SL_OK;
- }
- int SLfile::readFile()
- {
- char buffer[1024];
- char buf[1024];
- int i,iPos,iPos2;
- SLelement sle;
- for (i=0;i<1024;i++)
- {
- buf[i]='\0';
- buffer[i]='\0';
- }
- while(!feof(file))
- {
- fscanf(SLfile::file,"%s",buffer);
- //type of var
- if (strncmp(buffer,SL_CHAR_INT,sizeof(SL_CHAR_INT))==0) {sle.iSLtype=SL_INT;}
- else if (strncmp(buffer,SL_CHAR_DOUBLE,sizeof(SL_CHAR_DOUBLE))==0){sle.iSLtype=SL_DOUBLE;}
- else if (strncmp(buffer,SL_CHAR_FLOAT,sizeof(SL_CHAR_FLOAT))==0){sle.iSLtype=SL_FLOAT;}
- else if (strncmp(buffer,SL_CHAR_LONG,sizeof(SL_CHAR_LONG))==0){sle.iSLtype=SL_LONG;}
- else if (strncmp(buffer,SL_CHAR_CHAR,sizeof(SL_CHAR_CHAR))==0){sle.iSLtype=SL_CHAR;}
- else if (strncmp(buffer,SL_CHAR_STRING,sizeof(SL_CHAR_STRING))==0){sle.iSLtype=SL_STRING;}
- else
- {
- return SL_ERROR_UNKNOWN_DATA;
- }
- //var name
- fscanf(SLfile::file,"%s = ",buffer);
- sle.sVarName=(char *)malloc((strlen(buffer)+1)*sizeof(char));
- strcpy(sle.sVarName,buffer);
- sle.pvVal=(void *)malloc(sizeof(int *));
- //value
- switch(sle.iSLtype)
- {
- case SL_INT : fscanf(SLfile::file,"%d;\n",(int *)sle.pvVal);
- break;
- case SL_LONG : fscanf(SLfile::file,"%ld;\n",(long *)sle.pvVal);
- break;
- case SL_DOUBLE:fscanf(SLfile::file,"%lf;\n",(double *)sle.pvVal);
- break;
- case SL_FLOAT:fscanf(SLfile::file,"%f;\n",(float *)sle.pvVal);
- break;
- case SL_CHAR:fscanf(SLfile::file,"%c;\n",(char *)sle.pvVal);
- break;
- case SL_STRING:fscanf(SLfile::file,"%s;\n",(char *)sle.pvVal);
- break;
- }
- SLfile::addVar(&sle);
- }
- return SL_OK;
- }
- pSLelement SLfile::findVar(char *cVarName)
- {
- pSLelement pslCurrent;
- pslCurrent=SLfile::pSLfirst;
- while ((pslCurrent!=(pSLelement)0)&&(strncmp(pslCurrent->sVarName,cVarName,strlen(cVarName))))
- {
- pslCurrent=pslCurrent->NextElm;
- }
- return pslCurrent;
- }
- int SLfile::scanValue(char *cVarName,int iVarType)
- {
- pSLelement pslCurrent;
- SLelement sle;
- pslCurrent=SLfile::findVar(cVarName);
- if (pslCurrent==(pSLelement)0)
- {
- sle.iSLtype=iVarType;
- sle.pvVal=(void *)0;
- sprintf(sle.sVarName,"%s",cVarName);
- SLfile::addVar(&sle);
- pslCurrent=SLfile::findVar(cVarName);
- }
- printf("%s = ",pslCurrent->sVarName);
- switch(pslCurrent->iSLtype)
- {
- case SL_INT : scanf("%d;\n",(int *)pslCurrent->pvVal);
- break;
- case SL_LONG : scanf("%ld;\n",(long *)pslCurrent->pvVal);
- break;
- case SL_DOUBLE:scanf("%lf;\n",(double *)pslCurrent->pvVal);
- break;
- case SL_FLOAT:scanf("%f;\n",(float *)pslCurrent->pvVal);
- break;
- case SL_CHAR:scanf("%c;\n",(char *)pslCurrent->pvVal);
- break;
- case SL_STRING:scanf("%s;\n",(char *)pslCurrent->pvVal);
- break;
- }
- SLfile::changeValue(cVarName,pslCurrent->iSLtype,pslCurrent->pvVal);
- return SL_OK;
- }
- int SLfile::printVar(char *cVarName)
- {
- pSLelement pslCurrent;
- pslCurrent=SLfile::findVar(cVarName);
- if (pslCurrent==(pSLelement)0)
- {
- return SL_ERROR_VAR_NOT_FOUND;
- }
- switch(pslCurrent->iSLtype)
- {
- case SL_INT : printf("%s = %d\n",cVarName,*(int *)pslCurrent->pvVal);
- break;
- case SL_LONG : printf("%s = %ld\n",cVarName,*(long *)pslCurrent->pvVal);
- break;
- case SL_DOUBLE:printf("%s = %lf\n",cVarName,*(double *)pslCurrent->pvVal);
- break;
- case SL_FLOAT:printf("%s = %f\n",cVarName,*(float *)pslCurrent->pvVal);
- break;
- case SL_CHAR:printf("%s = %c\n",cVarName,*(char *)pslCurrent->pvVal);
- break;
- case SL_STRING:printf("%s = %s\n",cVarName,(char *)pslCurrent->pvVal);
- break;
- }
- return SL_OK;
- }
- int SLfile::printAllVar()
- {
- pSLelement pslCurrent;
- pslCurrent=SLfile::pSLfirst;
- while (pslCurrent!=(pSLelement)0)
- {
- SLfile::printVar(pslCurrent->sVarName);
- pslCurrent=pslCurrent->NextElm;
- }
- return SL_OK;
- }
- int SLfile::delVar(char *cVarName)
- {
- pSLelement pslCur;
- pslCur=SLfile::findVar(cVarName);
- if (pslCur==(pSLelement)0)
- {
- return SL_ERROR_VAR_NOT_FOUND;
- }
- pslCur->PrevElm->NextElm=pslCur->NextElm;
- pslCur->NextElm->PrevElm=pslCur->PrevElm;
- free(pslCur);
- return SL_OK;
- }
- int SLfile::changeValue(char *cVarName,int iVarType,void *pvVal)
- {
- pSLelement pslCur;
- pslCur=SLfile::findVar(cVarName);
- if (pslCur==(pSLelement)0)
- {
- return SL_ERROR_VAR_NOT_FOUND;
- }
- pslCur->iSLtype=iVarType;
- pslCur->pvVal=pvVal;
- return SL_OK;
- }
- int SLfile::readVar(char *cVarName,void *pvValue)
- {
- pSLelement pslCur;
- pslCur=SLfile::findVar(cVarName);
- if (pslCur==(pSLelement)0)
- {
- return SL_ERROR_VAR_NOT_FOUND;
- }
- switch(pslCur->iSLtype)
- {
- case SL_INT : *(int *)pvValue = *(int *)pslCur->pvVal;
- break;
- case SL_LONG : *(long *)pvValue = *(long *)pslCur->pvVal;
- break;
- case SL_DOUBLE: *(double *)pvValue = *(double *)pslCur->pvVal;
- break;
- case SL_FLOAT: *(float *)pvValue = *(float *)pslCur->pvVal;
- break;
- case SL_CHAR: *(char *)pvValue = *(char *)pslCur->pvVal;
- break;
- case SL_STRING: sprintf((char *)pvValue,"%s",(char *)pslCur->pvVal);
- break;
- }
- return SL_OK;
- }
|
Message édité par GuiYom_00 le 10-08-2004 à 20:29:33
|