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

ciberrique 591 Messages postés lundi 25 août 2003Date d'inscription 18 juillet 2010 Dernière intervention - 10 avril 2008 à 13:03 - Dernière réponse : ciberrique 591 Messages postés lundi 25 août 2003Date d'inscription 18 juillet 2010 Dernière intervention
- 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
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 10 avril 2008 à 15:46
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de SAKingdom
ciberrique 591 Messages postés lundi 25 août 2003Date d'inscription 18 juillet 2010 Dernière intervention - 10 avril 2008 à 18:36
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
ciberrique 591 Messages postés lundi 25 août 2003Date d'inscription 18 juillet 2010 Dernière intervention - 10 avril 2008 à 18:39
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.