Strtok et atof la memoire ne peut etre written

Résolu
ciberrique Messages postés 589 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 18 juillet 2010 - 10 avril 2008 à 13:03
ciberrique Messages postés 589 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 18 juillet 2010 - 10 avril 2008 à 18:39
Bonjours j'ai écris ce code mais il y a une erreur a l'execution de type la mémoire de ne peut etre "written".
Il semlerait que l'erreur soit sur les ligne ou je fais la conversion de la chaine de caractere en float avec la fonction atof et strtok.
Si quelqu'un a une idée, cela m'aiderais grandement.

void LoadObj(char *path){
            char buffer[500];
            int i,;
            FILE * fread;


            fread = fopen(path, "r");


            if (fread != NULL) {


                i =1;
                Obj.x = (float *) malloc(sizeof(float));
                Obj.y = (float *) malloc(sizeof(float));
                Obj.z = (float *) malloc(sizeof(float));


                while (fgets(buffer,500,fread)){
                    if (strncmp(buffer,"v ",2)==0){
                        strtok(buffer," ");
                        Obj.x[i] = (float)atof(strtok(NULL, " "));
                        Obj.y[i] = (float)atof(strtok(NULL, " "));
                        Obj.z[i] = (float)atof(strtok(NULL, "\n"));
                        i++;
                        Obj.x = (float *) realloc(Obj.x, sizeof(float) * i);
                        Obj.y = (float *) realloc(Obj.y, sizeof(float) * i);
                        Obj.z = (float *) realloc(Obj.z, sizeof(float) * i);
                    }             
                 }
                fclose(fread);
            }
        }//fin de fonction

3 réponses

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 avril 2008 à 15:46
i =1;

Un tableau commence toujours à 0.

Obj.x = (float *) realloc(Obj.x, sizeof(float) * i);
Obj.y = (float *) realloc(Obj.y, sizeof(float) * i);
Obj.z = (float *) realloc(Obj.z, sizeof(float) * i);

Oufff!!! Que c'est lourd ça. Tu serais peut-être mieux d'allouer plus de mémoire dès le début puis ne réallouer que si le buffer est dépassé.

C++ (@++)<!--
3
ciberrique Messages postés 589 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 18 juillet 2010 1
10 avril 2008 à 18:36
Effectivement, j'ai donc mis i à 0 et effectué quelque modification :

void LoadObj(char *path){
            char buffer[500];
            int i,;
            FILE * fread;


            fread = fopen(path, "r");


            if (fread != NULL) {


                i =0;
                Obj.x = (float *) malloc(sizeof(float)*386);
                Obj.y = (float *) malloc(sizeof(float)*386);
                Obj.z = (float *) malloc(sizeof(float)*386); //386 correspond au nombre de lignes de mon fichier


                while (fgets(buffer,500,fread)){
                    if (strncmp(buffer,"v ",2)==0){
                        strtok(buffer," ");
                        Obj.x[i] = (float)atof(strtok(NULL, " "));
                        Obj.y[i] = (float)atof(strtok(NULL, " "));
                        Obj.z[i] = (float)atof(strtok(NULL, "\n"));
                        i++;
                    }             
                 }
                fclose(fread);
            }
        }//fin de fonction

Donc maintenant ca ne plante plus, mais je pars dans l'idée que je ne connais pas le nombre de ligne donc est il possible d'avoir une formulation correcte pour un realloc ?
0
ciberrique Messages postés 589 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 18 juillet 2010 1
10 avril 2008 à 18:39
Oups j'ai rien dis, j'ai compris mon erreur, je dois realloc a i+1 et pas i.

Merci pour ta reponse.

<hr />www.e-fitz.com
Encore plus de source et de tutoriels.
0