Strtok et atof la memoire ne peut etre written

Résolu
Signaler
Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
-
Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
-
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

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
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++ (@++)<!--
Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
1
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 ?
Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
1
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.