Strtok et atof la memoire ne peut etre written [Résolu]

Messages postés
591
Date d'inscription
lundi 25 août 2003
Dernière intervention
18 juillet 2010
- - Dernière réponse : ciberrique
Messages postés
591
Date d'inscription
lundi 25 août 2003
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
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Dernière intervention
16 février 2009
3
Merci
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++ (@++)<!--

Merci SAKingdom 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de SAKingdom
Messages postés
591
Date d'inscription
lundi 25 août 2003
Dernière intervention
18 juillet 2010
0
Merci
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 ?
Commenter la réponse de ciberrique
Messages postés
591
Date d'inscription
lundi 25 août 2003
Dernière intervention
18 juillet 2010
0
Merci
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.
Commenter la réponse de ciberrique

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.