IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

tableau dynamique provenant d'une structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2
    Par défaut tableau dynamique provenant d'une structure
    Hello tout le monde

    Ceci est mon 1er post sur develloppez.com. Je me présente je m'apelle Malcon j'ai 18 ans et je suis un jeune programmeur.J'ai commencé la programmation en C il y a environ 1 an et demi.En ce moment je travaille sur un petit programme qui me permettra d'afficher des mesh. j'utilise SDL pour le fenetrage et OpenGL pour la gestion des graphisme.
    Mon probleme est le suivant : j'ai un probleme de d'assignation d'un tableau dynamique provenant d'une structure a un autre tableau
    J'ai declarer une structure "meshdata" qui va contenir quelque info pour l'affichage de l'object
    la voila
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct meshdata meshdata
    struct meshdata
    {
        char *filename; // le nom du fichier a charger
        int ncoord;  // le nombre de coordonnées présente dans le fichier
        int nvertex; // le nombre de vertex ( un vertex = 3 coordonées)
        int nfaces; // le nombre de face
        float location[3]; // la location de l'object
        float *ArrayXYZ; // tableau de float qui va contenir ttes les coordonnées
        int *ArrayF; // le tableau de int qui va contenir les index de face
    }
    Afin de charger un model j'ai ecris cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    void Load3Dmesh(meshdata *data)
    {
     
    	int i = 0;
    	int j = 0;
    	int count = 1;
    	int indexn = 0;  // le nombre de caracteres qui composent une coordonée
    	char caractere = 0;
    	char **arrayxyz = NULL; //pointeur de pointeur pour recupérer toute les coordonées
    	char **farray = NULL; //pointeur de pointeur pour récuperer tous les index des faces
    	FILE *mesh = NULL;
    	mesh = fopen(data->filename, "r");
    	if (mesh == NULL)
    	{
    		exit(1);
    	}
     
    	fscanf(mesh,"%d %d %d %f %f %f", &data->nvertex,&data->ncoord, &data->nfaces, &data->location[0], &data->location[1], &data->location[2]);
     
        arrayxyz = (char**)malloc(data->ncoord    * sizeof(char) );
        farray = (char**)malloc(data->nfaces * 3  * sizeof(char) );
     
    	data->ArrayXYZ = ( float* )malloc( data->ncoord * sizeof (float) );
    	data->ArrayF = ( int* )malloc( (data->nfaces * 3) * sizeof (int) );
     
        while(count)
        {
             caractere = fgetc(mesh);
             switch(caractere)
             {
                   case ' ':arrayxyz[i] = (char *)malloc(sizeof(char) * indexn );i++;indexn = 0;break;
                   case '\n': arrayxyz[i] = (char *)malloc(sizeof(char) * indexn );i++;indexn = 0;break;
                   default : indexn++;break;
                   case '#':  i = 0; indexn = 0;
                            while(i != data->nfaces * 3)
                            {
                                caractere = fgetc(mesh);
                                switch(caractere)
                                {
                                case ' ':farray[i] = (char *)malloc(sizeof(char) * indexn);i++;indexn = 0;break;
                                case '\n' : break;
                                default : indexn++;break;
                                }
                            }
             }
            if( i == data->nfaces * 3 )
            {
                count = 0;
            }
     
        }
        rewind(mesh);
       while(count)
       {
           caractere = fgetc(mesh);
           switch(caractere)
           {
               case ' ': i++;j = 0;break;
               case '\n': i++;j = 0;break;
               default : arrayxyz[i][j] = caractere; j++;break;
               case '#':
                    while( i != data->nfaces*3)
                    {
                        caractere = fgetc(mesh);
                        switch(caractere)
                        {
                            case '\n' : break;
                            case ' ' : i++;j = 0;break;
                            default : farray[i][j] = caractere;j++;break;
                        }
                    }
           }
           if ( i == data->nfaces*3)
           {
               count = 0;
           }
       }
     
       for(i = 0; i < data->ncoord; i++)
       {
             ( data->ArrayXYZ)[i]  = atof(arrayxyz[i]);
             free(arrayxyz[i]);
             arrayxyz[i] = NULL;
       }
     
       for(i = 0; i < data->nfaces * 3; i++)
       {
           (data->ArrayF)[i]  = atoi( farray[i] );
             free(farray[i]);
             farray[i] = NULL;
       }
    }

    Les while sont la pour remplacer scanf. Je trouve scanf pas tres precis dans l'aquisition des données donc j'ai préférer choisir une methode differente
    Mais la fonction plante j'obtiens une seg fault elle provient des 2 boucles for de la fin.Je sais pas comment je pourais mettre dans data->ArrayXYZ les valeurs des differentes coordonnées.
    Je m'en remets a vous pour la resolution de mon probleme
    Amicalement VenomX

  2. #2
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Je n'ai pas regardé tout le code, mais les allocations suivantes sont douteuses :


    Citation Envoyé par VenomX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void Load3Dmesh(meshdata *data)
    {
    [...]
    	char **arrayxyz = NULL; //pointeur de pointeur pour recupérer toute les coordonées
    	char **farray = NULL; //pointeur de pointeur pour récuperer tous les index des faces
     
            arrayxyz = (char**)malloc(data->ncoord    * sizeof(char) );
            farray = (char**)malloc(data->nfaces * 3  * sizeof(char) );
     
    [...]
    }

    Tu voulais peut être faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        arrayxyz = malloc(sizeof(*arrayxyz) * data->ncoord);
        farray   = malloc(sizeof(*farray) * (data->nfaces * 3));
    PS : le cast sur malloc n'est pas necessaire.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Salut et bienvenue sur Developpez.com

    D'abord plusieurs remarques de style.




    Ensuite sur le fond :

    Pourquoi passer par un tableau intermédiaire, ce qui complexifie l'écriture, la compréhension, et donne la chance de faire des erreurs (ce que tu as fais) ?

    Tes i ne correspondent pas à ce que ça doit...

    [EDIT]

    Et pour rajouter sur crocodilex, tu voulais peut-être faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    void Load3Dmesh(meshdata *data)
    {
    [...]
    	char **arrayxyz = NULL; //pointeur de pointeur pour recupérer toute les coordonées
    	char **farray = NULL; //pointeur de pointeur pour récuperer tous les index des faces
     
            arrayxyz = (char**)malloc(data->ncoord    * sizeof(char *) );
            farray = (char**)malloc(data->nfaces * 3  * sizeof(char *) );
     
    [...]
    }
    [/EDIT]

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2
    Par défaut
    Ensuite sur le fond :

    Pourquoi passer par un tableau intermédiaire, ce qui complexifie l'écriture, la compréhension, et donne la chance de faire des erreurs (ce que tu as fais) ?
    Pas bete la remarque...mais dans ce cas dans ma structure je la declare comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    typedef struct meshdata meshdata
    struct meshdata
    {
        char *filename; // le nom du fichier a charger
        int ncoord;  // le nombre de coordonnées présente dans le fichier
        int nvertex; // le nombre de vertex ( un vertex = 3 coordonées)
        int nfaces; // le nombre de face
        float location[3]; // la location de l'object
        char **ArrayXYZ; // tableau de float qui va contenir ttes les coordonnées
        char **ArrayF; // le tableau de int qui va contenir les index de face
    }

    Dans ce cas comment faire les allocation necessaires ? en sachant que la fonction qui charge le mesh prend en argument un pointeur de structure ?

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    je crois que

    1. Tu ne m'as pas bien compris
    2. Tu ne t'es pas bien exprimé



    • Tout d'abord en général on lit un fichier avec fgets :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
       
          while ( fgets(ligne, Longueur, fich) != NULL )
            {
                 ........
            }
    • Comment ton fichier est-il ? D'après ce que je vois, les lignes commençant par '#' sont les lignes contenant les coordonnées ?

    • Pourquoi ta structure change-t-elle entre ta manière initiale et ton dernier post ? Je ne parlais que de la lecture, et je disais pourquoi passer par un tableau de chaînes de caractères, au lieu de lire directement un float ?


    Je crois qu'il faut que tu revoies ton algorithme...

    Revois-le, réécris-le sur le papier, puis ici, en mettant un exemple du fichier...


    En tous cas, tu as pris une manière très compliquée (trop) pour faire ce que je pense que tu veux faire...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Presenter un tableau de cellules et une structure
    Par frazz dans le forum MATLAB
    Réponses: 5
    Dernier message: 09/10/2009, 14h38
  2. Tableau non contraint dans une structure
    Par chronos dans le forum C
    Réponses: 8
    Dernier message: 07/06/2007, 17h44
  3. [Tableaux] Tableau dynamique issue d'une requete
    Par JmL40 dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2007, 20h37
  4. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  5. Réponses: 6
    Dernier message: 16/02/2006, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo