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

Langage Delphi Discussion :

Supprimer et libérer la memoire de Liste chainées


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut Supprimer et libérer la memoire de Liste chainées
    Bonjour

    Je m'essaye aux listes chainées et me suis inspiré d'un projet
    SpeedWay http://quentin.quadrat.free.fr/speedway-fr.html

    J'ai donc crée mes listes que j'extraie d'un fichier VRML2
    Je coince sur la libération des listes en m'inspirant du fichier libre.pas de SpeedWay
    PBs:
    1 il utilise un TObjet en paramètre alors qu'il faudrait un pointeur comme dans le tutoriel
    2 entre la Head et la Queue mon compte n'y est pas
    (et En debug avec Delphi les valeurs des champs sont différentes)

    Je met mon code ici car j'arrive pas à joindre un fichier


    Mon loader
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
     
    unit loadervrml2;
     
    interface
     
    uses
       SysUtils,
       Dialogs,
       typeVRML2, libereObjetsVRML2,
       opengl;
     
    var
       InFile: text;
       buffer: string;
       NbGroupe, NbCouleur, NbPoint, NbFace: integer;
    procedure loadVRML2(nomfich: string; obj: pObjet);
     
    implementation
     
    function droite(SousChaine: string; s: string): string;
    begin
       if pos(SousChaine, s) = 0 then
          result := ''
       else
          result := copy(s, pos(SousChaine, s) + length(SousChaine), length(s) - pos(SousChaine, s) + length(SousChaine));
    end;
     
    function FCgauche(SousChaine: string; s: string): string;
    begin
       if pos(SousChaine, s) > 0 then
          result := copy(s, 1, pos(SousChaine, s) - 1)
       else
          result := s;
    end;
     
    // ----------------------------------------------------------------------------//
    function Str1DansStr2(s2, s1: string): boolean;
    var
       i, j, taille1, taille2: integer;
    begin
       i := 1;
       j := 1;
       taille1 := length(s1);
       taille2 := length(s2);
       while (i <= taille1) and (j <= taille2) do
       begin
          j := 1;
          while s1[i + j - 1] = s2[j] do
          begin
             j := j + 1;
          end;
          i := i + 1;
       end;
       result := j > taille2
    end;
     
    // ----------------------------------------------------------------------------//
    function convertfloat(buffer: string; nbr: integer): GLDouble;
    var
       retour: GLDouble;
       i, j, V: integer;
       Mot: string;
    begin
       i := 1;
       j := 1;
       while nbr > 0 do
       begin
          while ord(buffer[i]) <> $20 do // espace
             inc(i);
          dec(nbr);
          inc(i);
       end;
       while buffer[i + j] <> '.' do
          inc(j);
       inc(j);
       while (ord(buffer[i + j]) >= ord('0')) and (ord(buffer[i + j]) <= ord('9')) do
          inc(j);
       Mot := copy(buffer, i, j);
       val(Mot, retour, V);
       result := retour;
    end;
     
    // ----------------------------------------------------------------------------//
    function loadPvertex(nbr: integer; obj: pObjet): PVertex;
    var
       i: integer;
    begin
       obj^.GroupeEnfantQueue^.PointQueue := @obj^.GroupeEnfantQueue^.PointHead;
       i := 0;
       while i < nbr do
       begin
          obj^.GroupeEnfantQueue^.PointQueue := obj^.GroupeEnfantQueue^.PointQueue^.Next;
          inc(i);
       end;
       result := obj^.GroupeEnfantQueue^.PointQueue;
    end;
     
    // ----------------------------------------------------------------------------//
    function loadPCouleur(nbr: integer; obj: pObjet): PCouleur;
    var
       i: integer;
    begin
       obj^.GroupeEnfantQueue^.CouleurQueue := @obj^.GroupeEnfantQueue^.CouleurHead;
       i := 0;
       while i < nbr do
       begin
          obj^.GroupeEnfantQueue^.CouleurQueue := obj^.GroupeEnfantQueue^.CouleurQueue^.Next;
          inc(i);
       end;
       result := obj^.GroupeEnfantQueue^.CouleurQueue;
    end;
     
    // ----------------------------------------------------------------------------//
    // Affecte aux faces les couleurs
    procedure loadCouleur(obj: pObjet);
    var
       Mot, groupe, terme: string;
    begin
       obj^.GroupeEnfantQueue^.CouleurQueue := @obj^.GroupeEnfantQueue^.CouleurHead;
       while not(Str1DansStr2('colorIndex [', buffer)) do
          readln(InFile, buffer);
       readln(InFile, buffer);
       while not(Str1DansStr2(']', buffer)) do
       begin
          if buffer <> '' then
          begin
             while length(buffer) > 0 do
             begin
                Mot := FCgauche(',', buffer);
                buffer := droite(',', buffer);
                obj^.GroupeEnfantQueue^.FaceQueue.couleur[1] := loadPCouleur(StrToInt(Mot), obj);
                obj^.GroupeEnfantQueue^.FaceQueue.couleur[2] := loadPCouleur(StrToInt(Mot), obj);
                obj^.GroupeEnfantQueue^.FaceQueue.couleur[3] := loadPCouleur(StrToInt(Mot), obj);
                obj^.GroupeEnfantQueue^.FaceQueue^.Next := AllocMem(SizeOf(TFace));
                obj^.GroupeEnfantQueue^.FaceQueue := obj^.GroupeEnfantQueue^.FaceQueue^.Next;
             end;
          end;
          readln(InFile, buffer);
       end;
    end;
     
    // ----------------------------------------------------------------------------//
    // Affecte aux faces les points
    procedure loadFace(obj: pObjet);
    var
       Mot, groupe, terme: string;
    begin
       obj^.GroupeEnfantQueue^.FaceQueue := @obj^.GroupeEnfantQueue.FaceHead;
       while not(Str1DansStr2('coordIndex [', buffer)) do
          readln(InFile, buffer);
       readln(InFile, buffer);
       while not(Str1DansStr2(']', buffer)) do
       begin
          if buffer <> '' then
          begin
             while length(buffer) > 0 do
             begin
                groupe := FCgauche('-1,', buffer);
                Mot := FCgauche(',', groupe);
                begin
                   inc(NbFace);
                   obj^.GroupeEnfantQueue^.FaceQueue.point[1] := loadPvertex(StrToInt(Mot), obj);
                   groupe := droite(',', groupe);
                   Mot := FCgauche(',', groupe);
                   obj^.GroupeEnfantQueue^.FaceQueue.point[2] := loadPvertex(StrToInt(Mot), obj);
                   groupe := droite(',', groupe);
                   Mot := FCgauche(',', groupe);
                   obj^.GroupeEnfantQueue^.FaceQueue.point[3] := loadPvertex(StrToInt(Mot), obj);
                   obj^.GroupeEnfantQueue^.FaceQueue^.Next := AllocMem(SizeOf(TFace));
                   obj^.GroupeEnfantQueue^.FaceQueue := obj^.GroupeEnfantQueue^.FaceQueue^.Next;
                   buffer := droite('-1,', buffer);
                end;
             end;
          end;
          readln(InFile, buffer);
       end;
    end;
     
    // ----------------------------------------------------------------------------//
    // Charge la table des points
    procedure loadPoints(obj: pObjet);
    var
       Mot, terme: string;
    begin
       obj^.GroupeEnfantQueue^.PointQueue := @obj^.GroupeEnfantQueue.PointHead;
       while not(Str1DansStr2('point [', buffer)) do
          readln(InFile, buffer);
       readln(InFile, buffer);
       while not(Str1DansStr2(']', buffer)) do
       begin
          if buffer <> '' then
          begin
             while length(buffer) > 0 do
             begin
                Mot := FCgauche(',', buffer);
                buffer := droite(',', buffer);
                inc(NbPoint);
                obj^.GroupeEnfantQueue^.PointQueue^.x := convertfloat(Mot, 1);
                obj^.GroupeEnfantQueue^.PointQueue^.y := convertfloat(Mot, 2);
                obj^.GroupeEnfantQueue^.PointQueue^.z := convertfloat(Mot, 3);
                obj^.GroupeEnfantQueue^.PointQueue^.Next := AllocMem(SizeOf(TVertex));
                obj^.GroupeEnfantQueue^.PointQueue := obj^.GroupeEnfantQueue^.PointQueue^.Next;
             end;
          end;
          readln(InFile, buffer);
       end;
     
    end;
     
    // ----------------------------------------------------------------------------//
    // Charge la table des couleurs
    procedure loadCouleurs(obj: pObjet);
    var
       Mot, terme: string;
    begin
       obj^.GroupeEnfantQueue^.CouleurQueue := @obj^.GroupeEnfantQueue.CouleurHead;
       while not(Str1DansStr2('color [', buffer)) do
          readln(InFile, buffer);
       readln(InFile, buffer);
       while not(Str1DansStr2(']', buffer)) do
       begin
          if buffer <> '' then
          begin
             while length(buffer) > 0 do
             begin
                Mot := FCgauche(',', buffer);
                buffer := droite(',', buffer);
                inc(NbCouleur);
                obj^.GroupeEnfantQueue^.CouleurQueue^.r := convertfloat(Mot, 1);
                obj^.GroupeEnfantQueue^.CouleurQueue^.V := convertfloat(Mot, 2);
                obj^.GroupeEnfantQueue^.CouleurQueue^.b := convertfloat(Mot, 3);
                obj^.GroupeEnfantQueue^.CouleurQueue^.Next := AllocMem(SizeOf(TCouleur));
                obj^.GroupeEnfantQueue^.CouleurQueue := obj^.GroupeEnfantQueue^.CouleurQueue^.Next;
             end;
          end;
          readln(InFile, buffer);
       end;
    end;
     
    // ----------------------------------------------------------------------------//
    procedure loadGroupe(obj: pObjet);
    begin
       obj^.GroupeEnfantQueue := @obj^.GroupeEnfantHead;
       // affecte le nom du groupe
       obj^.GroupeEnfantQueue^.Nom := FCgauche(' ', buffer);
       obj^.GroupeEnfantQueue^.Next := AllocMem(SizeOf(TGroupeEnfant));
       obj^.GroupeEnfantQueue := obj^.GroupeEnfantQueue^.Next;
       readln(InFile, buffer);
       loadCouleurs(obj);
       loadPoints(obj);
       loadFace(obj);
       loadCouleur(obj);
     
    end;
     
    // ----------------------------------------------------------------------------//
    procedure loadVRML2(nomfich: string; obj: pObjet);
    var
       i: integer;
       indexCouleur: integer;
       indexPoint1, indexPoint2, indexPoint3: integer;
       nbr: integer;
       V1, V2, V3: glFloat;
    begin
       i := 0;
       NbGroupe := 0;
       NbCouleur := 0;
       NbPoint := 0;
       NbFace := 0;
       AssignFile(InFile, nomfich);
       Reset(InFile);
     
       // 1. analyse le fichier et crée les objets
       while not EOF(InFile) do
       begin
          readln(InFile, buffer);
          if (Str1DansStr2('{', buffer)) then // trouve un groupe
          begin
             loadGroupe(obj);
             inc(NbGroupe);
          end;
       end;
       showmessage('Nombre de groupe ' + inttostr(NbGroupe) + ' Nombre de couleur ' + inttostr(NbCouleur) + 'Nombre de point ' + inttostr(NbPoint) + 'Nombre de face ' + inttostr(NbFace));
       (* exit;
     
         // 2. crée la liste d'affichage OPENGL
         CloseFile(InFile);
         obj.List := glGenLists(1);
         glNewList(obj.List, GL_COMPILE);
         glpushmatrix;
         glEnable(GL_TEXTURE_2D);
         obj.GroupeEnfantQueue := @obj.GroupeEnfantHead;
         while obj.GroupeEnfantQueue <> NIL do
         begin
         obj^.GroupeQueue^.ChildrenQueue := @obj^.GroupeQueue^.ChildrenHead;
         obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue := @obj^.GroupeQueue^.ChildrenQueue.ShapeHead;
         obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue := @obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue.GeometrieQueue;
         glBegin(GL_TRIANGLES);
         while obj^.GroupeQueue.Next <> NIL do
         begin
         // point 1
         // ..Couleur
         indexCouleur := obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.colorIndexQueue.valeurf;
         glColor3d(obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.color[indexCouleur], obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.color[indexCouleur],
         obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.color[indexCouleur]);
         // ..valeur
         indexPoint1 := obj^.GroupeQueue^.ChildrenQueue^.GeometrieQueue^.colorIndexQueue.valeurf;
         obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.coordIndexQueue := obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.coordIndexQueue.Next;
         indexPoint2 := obj^.GroupeQueue^.ChildrenQueue^.GeometrieQueue^.colorIndexQueue.valeurf;
         obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.coordIndexQueue := obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.coordIndexQueue.Next;
         indexPoint3 := obj^.GroupeQueue^.ChildrenQueue^.GeometrieQueue^.colorIndexQueue.valeurf;
         // recherche du point1
         nbr := 0;
         while nbr <> indexPoint1 do
         obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.coordQueue^.Next
     
         glVertex3f(obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.coordQueue^.[], obj^.MeshQueue^.FaceQueue^.V[1].y, obj^.MeshQueue^.FaceQueue^.V[1].z);
     
         // point 2
         indexCouleur := obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.colorIndexQueue.valeurf;
         glColor3f(obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.color[indexCouleur], obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.color[indexCouleur],
         obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.color[indexCouleur]);
         glVertex3f(obj^.MeshQueue^.FaceQueue^.V[1].x, obj^.MeshQueue^.FaceQueue^.V[1].y, obj^.MeshQueue^.FaceQueue^.V[1].z);
     
         // point 3
         indexCouleur := obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.colorIndexQueue.valeurf;
         glColor3f(obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.color[indexCouleur], obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.color[indexCouleur],
         obj^.GroupeQueue^.ChildrenQueue^.ShapeQueue^.GeometrieQueue^.color[indexCouleur]);
     
         glVertex3f(obj^.MeshQueue^.FaceQueue^.V[1].x, obj^.MeshQueue^.FaceQueue^.V[1].y, obj^.MeshQueue^.FaceQueue^.V[1].z);
     
         obj^.MeshQueue^.FaceQueue := obj^.MeshQueue^.FaceQueue^.Next;
         end;
         glEnd();
         obj^.MeshQueue := obj^.MeshQueue^.Next;
         end;
         glDisable(GL_TEXTURE_2D);
         glpopmatrix;
         glEndList; *)
       libererObjetVRML2(obj);
    end;
     
    // ----------------------------------------------------------------------------//
    end.
    mon libere
    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
     
    unit libereObjetsVRML2;
     
    interface
     
    uses
       typeVRML2, Dialogs, SysUtils;
     
    procedure libererObjetVRML2(var Obj: pObjet);
     
    implementation
     
    procedure libererObjetVRML2(var Obj: pObjet);
    var
       children: pGroupeEnfant;
       couleur: PCouleur;
       point: PVertex;
       face: pFace;
       i: integer;
       NbGroupe, NbCouleur, NbPoint, NbFace: integer;
    begin
       NbGroupe := 0;
       NbCouleur := 0;
       NbPoint := 0;
       NbFace := 0;
     
       while Obj.GroupeEnfantQueue <> NIL do // On continue jusqu'a ce qu'il n'y ait plus d'élément
       begin
     
          // liberer les couleurs du GroupeEnfant
          Obj.GroupeEnfantQueue.CouleurQueue := Obj.GroupeEnfantQueue.CouleurQueue.Next;
          while Obj.GroupeEnfantQueue.CouleurQueue <> NIL do // On continue jusqu'a ce qu'il n'y ait plus d'élément
          begin
             // On pointe le premier élément
             couleur := Obj.GroupeEnfantQueue.CouleurQueue;
             // On avance notre pointeur
             Obj.GroupeEnfantQueue.CouleurQueue := Obj.GroupeEnfantQueue.CouleurQueue.Next;
             // Puis on détruit le premier élément que l'on avait pointé
             dispose(couleur);
             inc(NbCouleur);
          end;
     
          // liberer les points du GroupeEnfant
          Obj.GroupeEnfantQueue.PointQueue := Obj.GroupeEnfantQueue.PointQueue.Next;
          while Obj.GroupeEnfantQueue.PointQueue <> NIL do // On continue jusqu'a ce qu'il n'y ait plus d'élément
          begin
             // On pointe le premier élément
             point := Obj.GroupeEnfantQueue.PointQueue;
             Obj.GroupeEnfantQueue.PointQueue := Obj.GroupeEnfantQueue.PointQueue.Next;
             freemem(point); ;
             inc(NbPoint);
          end;
     
          // liberer les faces du GroupeEnfant
          Obj.GroupeEnfantQueue.FaceQueue := Obj.GroupeEnfantQueue.FaceQueue.Next;
          while Obj.GroupeEnfantQueue.FaceQueue <> NIL do // On continue jusqu'a ce qu'il n'y ait plus d'élément
          begin
             // On pointe le premier élément
             face := Obj.GroupeEnfantQueue.FaceQueue;
             Obj.GroupeEnfantQueue.FaceQueue := Obj.GroupeEnfantQueue.FaceQueue.Next;
             freemem(face); ;
             inc(NbFace);
          end;
          // On pointe le premier élément
          children := Obj.GroupeEnfantQueue;
          // On avance notre pointeur
          Obj.GroupeEnfantQueue := Obj.GroupeEnfantQueue.Next;
          // Puis on détruit le premier élément que l'on avait pointé
          freemem(children); ;
          inc(NbGroupe);
       end;
     
       showmessage('Libere ' + inttostr(NbGroupe) + 'groupe(s). Libere  ' + inttostr(NbCouleur) + 'couleur(s). Libere ' + inttostr(NbPoint) + 'point(s). Libere ' + inttostr(NbFace) + ' face(s)');
    end;
     
    end.
    Mes types VRML2
    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
     
    unit typeVRML2;
     
    interface
     
    uses
       opengl;
     
    type
     
       pVertex = ^TVertex;
     
       TVertex = record
          x, y, z: gldouble;
          Next: pVertex;
       end;
     
       pCouleur = ^TCouleur;
     
       TCouleur = record
          r, v, b: gldouble;
          Next: pCouleur;
       end;
     
       pFace = ^TFace;
     
       TFace = record
          point: array [1 .. 3] of pVertex;
          couleur: array [1 .. 3] of pCouleur;
          Next: pFace;
       end;
     
       pGroupeEnfant = ^TGroupeEnfant;
     
       TGroupeEnfant = record
          CouleurHead: TCouleur;
          CouleurQueue: pCouleur;
          PointHead: TVertex;
          PointQueue: pVertex;
          FaceHead: TFace;
          FaceQueue: pFace;
          nom: string[20];
          Next: pGroupeEnfant;
       end;
     
       pObjet = ^TObjet;
     
       TObjet = record
          GroupeEnfantHead: TGroupeEnfant;
          GroupeEnfantQueue: pGroupeEnfant;
          List: GLuint;
       end;
     
    implementation
     
    end.
    ci joint un fichier texte de type VRML pour exemple
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
     
    #VRML V2.0 utf8
    Transform {
    children [
    Shape {
    appearance Appearance {
    material Material {
    ambientIntensity 1.000000
    diffuseColor 0.000000 1.000000 0.000000
    emissiveColor 0.000000 0.000000 0.000000
    specularColor 0.000000 1.000000 0.000000
    shininess 0.310000
    transparency 0.000000
    }
    }
    geometry IndexedFaceSet {
    color Color {
    color [
     0.000000 1.000000 0.000000
    ]
    }
    coord Coordinate {
    point [
     0.000000 0.000000 -0.020000, 0.000000 0.000000 0.000000, 0.000000 0.010000 -0.020000, 0.000000 0.010000 0.000000, 0.100000 0.000000 -0.020000,
     0.100000 0.000000 0.000000, 0.100000 0.010000 -0.020000, 0.100000 0.010000 0.000000
    ]
    }
    normal Normal {
    vector [
     -1.000000 0.000000 0.000000, 0.000000 -1.000000 0.000000, 0.000000 0.000000 -1.000000, 0.000000 0.000000 1.000000, 0.000000 1.000000 0.000000,
     1.000000 0.000000 0.000000
    ]
    }
    coordIndex [
     2, 0, 3, -1, 3, 0, 1, -1, 6, 2, 7, -1,
     7, 2, 3, -1, 4, 6, 5, -1, 5, 6, 7, -1,
     0, 4, 1, -1, 1, 4, 5, -1, 6, 4, 2, -1,
     2, 4, 0, -1, 5, 7, 1, -1, 1, 7, 3, -1
    ]
    colorIndex [
     0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0,
    ]
    normalIndex [
     0, 0, 0, -1, 0, 0, 0, -1, 4, 4, 4, -1,
     4, 4, 4, -1, 5, 5, 5, -1, 5, 5, 5, -1,
     1, 1, 1, -1, 1, 1, 1, -1, 2, 2, 2, -1,
     2, 2, 2, -1, 3, 3, 3, -1, 3, 3, 3, -1
    ]
    colorPerVertex FALSE
    normalPerVertex TRUE
    }
    }
    ]
    }
    Transform {
    children [
    Shape {
    appearance Appearance {
    material Material {
    ambientIntensity 1.000000
    diffuseColor 0.909804 0.443137 0.031373
    emissiveColor 0.000000 0.000000 0.000000
    specularColor 0.909804 0.443137 0.031373
    shininess 0.310000
    transparency 0.000000
    }
    }
    geometry IndexedFaceSet {
    color Color {
    color [
     0.909804 0.443137 0.031373
    ]
    }
    coord Coordinate {
    point [
     -0.010000 0.000000 -0.100000, -0.010000 0.000000 0.000000, -0.009749 -0.002225 -0.100000, -0.009749 -0.002225 0.000000, -0.009749 0.002225 -0.100000,
     -0.009749 0.002225 0.000000, -0.009010 -0.004339 -0.100000, -0.009010 -0.004339 0.000000, -0.009010 0.004339 -0.100000, -0.009010 0.004339 0.000000,
     -0.007818 -0.006235 -0.100000, -0.007818 -0.006235 0.000000, -0.007818 0.006235 -0.100000, -0.007818 0.006235 0.000000, -0.006235 -0.007818 -0.100000,
     -0.006235 -0.007818 0.000000, -0.006235 0.007818 -0.100000, -0.006235 0.007818 0.000000, -0.004339 -0.009010 -0.100000, -0.004339 -0.009010 0.000000,
     -0.004339 0.009010 -0.100000, -0.004339 0.009010 0.000000, -0.002225 -0.009749 -0.100000, -0.002225 -0.009749 0.000000, -0.002225 0.009749 -0.100000,
     -0.002225 0.009749 0.000000, -0.000000 -0.010000 -0.100000, -0.000000 -0.010000 0.000000, 0.000000 0.010000 -0.100000, 0.000000 0.010000 0.000000,
     0.002225 -0.009749 -0.100000, 0.002225 -0.009749 0.000000, 0.002225 0.009749 -0.100000, 0.002225 0.009749 0.000000, 0.004339 -0.009010 -0.100000,
     0.004339 -0.009010 0.000000, 0.004339 0.009010 -0.100000, 0.004339 0.009010 0.000000, 0.006235 -0.007818 -0.100000, 0.006235 -0.007818 0.000000,
     0.006235 0.007818 -0.100000, 0.006235 0.007818 0.000000, 0.007818 -0.006235 -0.100000, 0.007818 -0.006235 0.000000, 0.007818 0.006235 -0.100000,
     0.007818 0.006235 0.000000, 0.009010 -0.004339 -0.100000, 0.009010 -0.004339 0.000000, 0.009010 0.004339 -0.100000, 0.009010 0.004339 0.000000,
     0.009749 -0.002225 -0.100000, 0.009749 -0.002225 0.000000, 0.009749 0.002225 -0.100000, 0.009749 0.002225 0.000000, 0.010000 0.000000 -0.100000,
     0.010000 0.000000 0.000000
    ]
    }
    normal Normal {
    vector [
     -1.000000 0.000000 0.000000, -0.974928 -0.222521 0.000000, -0.974928 0.222521 0.000000, -0.900969 -0.433884 0.000000, -0.900969 0.433884 0.000000,
     -0.781832 -0.623490 0.000000, -0.781832 0.623490 0.000000, -0.623490 -0.781832 0.000000, -0.623490 0.781832 0.000000, -0.433884 -0.900969 0.000000,
     -0.433884 0.900969 0.000000, -0.222521 -0.974928 0.000000, -0.222521 0.974928 0.000000, -0.000000 -1.000000 0.000000, 0.000000 0.000000 -1.000000,
     0.000000 0.000000 1.000000, 0.000000 1.000000 0.000000, 0.222521 -0.974928 0.000000, 0.222521 0.974928 0.000000, 0.433884 -0.900969 0.000000,
     0.433884 0.900969 0.000000, 0.623490 -0.781832 0.000000, 0.623490 0.781832 0.000000, 0.781832 -0.623490 0.000000, 0.781832 0.623490 0.000000,
     0.900969 -0.433884 0.000000, 0.900969 0.433884 0.000000, 0.974928 -0.222521 0.000000, 0.974928 0.222521 0.000000, 1.000000 0.000000 0.000000
    ]
    }
    coordIndex [
     52, 55, 54, -1, 54, 55, 51, -1, 54, 51, 50, -1,
     50, 51, 47, -1, 50, 47, 46, -1, 46, 47, 43, -1,
     46, 43, 42, -1, 42, 43, 39, -1, 42, 39, 38, -1,
     38, 39, 35, -1, 38, 35, 34, -1, 34, 35, 31, -1,
     34, 31, 30, -1, 30, 31, 27, -1, 30, 27, 26, -1,
     26, 27, 23, -1, 26, 23, 22, -1, 22, 23, 19, -1,
     22, 19, 18, -1, 18, 19, 15, -1, 18, 15, 14, -1,
     14, 15, 11, -1, 14, 11, 10, -1, 10, 11, 7, -1,
     10, 7, 6, -1, 6, 7, 3, -1, 6, 3, 2, -1,
     2, 3, 1, -1, 2, 1, 0, -1, 0, 1, 5, -1,
     0, 5, 4, -1, 4, 5, 9, -1, 4, 9, 8, -1,
     8, 9, 13, -1, 8, 13, 12, -1, 12, 13, 17, -1,
     12, 17, 16, -1, 16, 17, 21, -1, 16, 21, 20, -1,
     20, 21, 25, -1, 20, 25, 24, -1, 24, 25, 29, -1,
     24, 29, 28, -1, 28, 29, 33, -1, 28, 33, 32, -1,
     32, 33, 37, -1, 32, 37, 36, -1, 36, 37, 41, -1,
     36, 41, 40, -1, 40, 41, 45, -1, 40, 45, 44, -1,
     44, 45, 49, -1, 44, 49, 48, -1, 48, 49, 53, -1,
     48, 53, 52, -1, 52, 53, 55, -1, 20, 24, 30, -1,
     50, 46, 42, -1, 12, 16, 20, -1, 40, 44, 42, -1,
     34, 30, 38, -1, 38, 30, 24, -1, 38, 24, 42, -1,
     20, 30, 12, -1, 12, 30, 26, -1, 12, 26, 22, -1,
     36, 40, 32, -1, 32, 40, 42, -1, 32, 42, 28, -1,
     28, 42, 24, -1, 54, 50, 52, -1, 52, 50, 42, -1,
     52, 42, 48, -1, 48, 42, 44, -1, 10, 6, 14, -1,
     14, 6, 12, -1, 14, 12, 18, -1, 18, 12, 22, -1,
     8, 12, 4, -1, 4, 12, 6, -1, 4, 6, 0, -1,
     0, 6, 2, -1, 23, 27, 31, -1, 39, 43, 13, -1,
     13, 43, 47, -1, 13, 47, 51, -1, 31, 35, 39, -1,
     51, 55, 13, -1, 13, 55, 53, -1, 13, 53, 49, -1,
     39, 13, 31, -1, 31, 13, 9, -1, 31, 9, 5, -1,
     1, 3, 7, -1, 37, 33, 41, -1, 41, 33, 13, -1,
     41, 13, 45, -1, 45, 13, 49, -1, 21, 17, 25, -1,
     25, 17, 13, -1, 25, 13, 29, -1, 29, 13, 33, -1,
     15, 19, 11, -1, 11, 19, 23, -1, 11, 23, 7, -1,
     7, 23, 31, -1, 7, 31, 1, -1, 1, 31, 5, -1
    ]
    colorIndex [
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    ]
    normalIndex [
     28, 29, 29, -1, 29, 29, 27, -1, 29, 27, 27, -1,
     27, 27, 25, -1, 27, 25, 25, -1, 25, 25, 23, -1,
     25, 23, 23, -1, 23, 23, 21, -1, 23, 21, 21, -1,
     21, 21, 19, -1, 21, 19, 19, -1, 19, 19, 17, -1,
     19, 17, 17, -1, 17, 17, 13, -1, 17, 13, 13, -1,
     13, 13, 11, -1, 13, 11, 11, -1, 11, 11, 9, -1,
     11, 9, 9, -1, 9, 9, 7, -1, 9, 7, 7, -1,
     7, 7, 5, -1, 7, 5, 5, -1, 5, 5, 3, -1,
     5, 3, 3, -1, 3, 3, 1, -1, 3, 1, 1, -1,
     1, 1, 0, -1, 1, 0, 0, -1, 0, 0, 2, -1,
     0, 2, 2, -1, 2, 2, 4, -1, 2, 4, 4, -1,
     4, 4, 6, -1, 4, 6, 6, -1, 6, 6, 8, -1,
     6, 8, 8, -1, 8, 8, 10, -1, 8, 10, 10, -1,
     10, 10, 12, -1, 10, 12, 12, -1, 12, 12, 16, -1,
     12, 16, 16, -1, 16, 16, 18, -1, 16, 18, 18, -1,
     18, 18, 20, -1, 18, 20, 20, -1, 20, 20, 22, -1,
     20, 22, 22, -1, 22, 22, 24, -1, 22, 24, 24, -1,
     24, 24, 26, -1, 24, 26, 26, -1, 26, 26, 28, -1,
     26, 28, 28, -1, 28, 28, 29, -1, 14, 14, 14, -1,
     14, 14, 14, -1, 14, 14, 14, -1, 14, 14, 14, -1,
     14, 14, 14, -1, 14, 14, 14, -1, 14, 14, 14, -1,
     14, 14, 14, -1, 14, 14, 14, -1, 14, 14, 14, -1,
     14, 14, 14, -1, 14, 14, 14, -1, 14, 14, 14, -1,
     14, 14, 14, -1, 14, 14, 14, -1, 14, 14, 14, -1,
     14, 14, 14, -1, 14, 14, 14, -1, 14, 14, 14, -1,
     14, 14, 14, -1, 14, 14, 14, -1, 14, 14, 14, -1,
     14, 14, 14, -1, 14, 14, 14, -1, 14, 14, 14, -1,
     14, 14, 14, -1, 15, 15, 15, -1, 15, 15, 15, -1,
     15, 15, 15, -1, 15, 15, 15, -1, 15, 15, 15, -1,
     15, 15, 15, -1, 15, 15, 15, -1, 15, 15, 15, -1,
     15, 15, 15, -1, 15, 15, 15, -1, 15, 15, 15, -1,
     15, 15, 15, -1, 15, 15, 15, -1, 15, 15, 15, -1,
     15, 15, 15, -1, 15, 15, 15, -1, 15, 15, 15, -1,
     15, 15, 15, -1, 15, 15, 15, -1, 15, 15, 15, -1,
     15, 15, 15, -1, 15, 15, 15, -1, 15, 15, 15, -1,
     15, 15, 15, -1, 15, 15, 15, -1, 15, 15, 15, -1
    ]
    colorPerVertex FALSE
    normalPerVertex TRUE
    }
    }
    ]
    }
    Peut être un peu long mais merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    TObjet c'est mal choisi comme nom !
    TObject étant la classe de base des objets Delphi !

    FreeMem ? où est le GetMem ?
    Pourquoi ne pas utiliser New et Dispose ?
    Pourquoi ne pas repenser le tout sous la forme d'objet avec constructeurs et destructeurs ? Un code POO sinon pourquoi utiliser Delphi ?

    Ensuite, tu t'es inspiré du code de SpeedWay, mauvaise idée !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TYPE
    T_pArme = ^T_Arme;
    T_Arme = class ...
    Première unité Armes.pas ! Première Erreur dès la Première déclaration, créer un type pointeur sur un objet qui est lui même une référence (un pointeur plus subtile)
    C'est totalement inutile même pour faire une liste chaînée !
    Cela veut même dire que l'auteur ne connait pas le TComponent (et donc toute la philosophie objet de Delphi) qui est un exemple parfait d'un composant ayant l'instance d'un autre composant pour une relation inverse de la liste chainée, mais au niveau du langage c'est la même chose !

    Init comme nom de constructeur en Delphi, qu'elle idée, pourquoi pas le standard Create ?

    C'est dommage parce qu'il y a une plutôt bonne structure objet !
    Mais une faible modularité, un type élément chainé ancêtre aurait nettement réduit le code de la gestion mémoire

    Cerise sur le gateau !
    Le pire, le développeur de SpeedWay a totalement oublié de libérer les objets ! il libère les pointeurs de ses listes chainées, mais par les objets alloués par Init !
    Encore une fois, une absence de maîtrise de Delphi !
    Je confirme, tu ne pouvais pas prendre plus mauvais exemple même si le jeu a l'air beau, le code ne l'est pas !

    Et encore plus drôle, la fonction libererobjet qui libère le contenu d'un TObjet (record) mais tu l'as maladroitement modifié en PObjet, ce qui change tout, le developpeur de SpeedWay utilise des variables locales ou globales, cela se libère tout seul contrairement aux pointeurs !

    Il a passé en var pour éviter la copie de la structure !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    Merci de répondre et des conseils

    Je vais essayer de repenser le tous en POO

    A+

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 03/06/2014, 07h39
  2. listes chainés ( fonction supprimer)
    Par rockkornman dans le forum C
    Réponses: 4
    Dernier message: 13/05/2009, 11h24
  3. C-System : Memoire partagée et Liste chainée
    Par agrosjea dans le forum C
    Réponses: 3
    Dernier message: 18/06/2008, 09h58
  4. Liste chainé supprimer un element
    Par line86 dans le forum C
    Réponses: 7
    Dernier message: 20/09/2007, 17h17
  5. Supprimer le 1er élément d'une liste chainée
    Par bit_o dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 02/06/2007, 01h05

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