Page 1 sur 1

[Résolu] AllocateMemory() : Erreur d'initialisation.

Publié : lun. 21/sept./2015 15:28
par falsam
PB 5.31 (x86) - Windows 10

Je me bat avec un souci d’initialisation mémoire durant un traitement par lot. Le code de mon application étant trés long, j'ai extrait la partie qui ne fonctionne pas.

L'objectif de ce code consiste à:
1 - Extraire une structure JSON contenant différents contenu de fichiers (Meshs, Images, ...) vers une liste chaînée.
2 - Pour chaque type de fichier, initialiser une zone mémoire pour reconstitution du fichier.

C'est la phase 2 qui actuellement me pose un souci. Si je charge le fichier une deuxiéme fois, j'ai une erreur d'intialisation.

Si vous souhaitez m'aider, vous pouvez télécharger le code et le fichier JSON en cliquant sur ce lien.

:arrow: http://s242132022.onlinehome.fr/downloa ... yerror.zip

Merci.

Je poste le code au cas ou un jour, cette piéce jointe n'existe plus.

Code : Tout sélectionner

Enumeration 
  #JSONFile
EndEnumeration

Structure NewEntity
  id.i ;Cursor
  ItemCreation.s
  
  mesh.i
  texture.i
  material.i
  
  meshBuffer.s
  meshFile.s
  meshFileExt.s
  meshLength.i  
  
  imageFile.s
  imageFileExt.s
  image.s
  imageBlend.b
  
  script.s  
  
  x.f 
  y.f 
  z.f 
  
  rx.f
  ry.f
  rz.f
  
  sx.f
  sy.f
  sz.f
  
  speed.f 
  rotate.f
  fly.f  
EndStructure
Global NewList Work.NewEntity()

For i = 0 To 100
  Debug "Passe " + Str(i)
  
  If LoadJSON(#JSONFile, "test.json", #PB_JSON_NoCase)
    
    ExtractJSONList(JSONValue(#JSONFile), Work())
    
    ForEach Work()
      With Work()
        Select \ItemCreation 
          Case "Mesh"
            ;*InputBuffer = AllocateMemory(\meshLength)
            *InputBuffer = AllocateMemory(Int(\meshLength * 1.30))
            Base64Decoder(@\meshBuffer, Len(\meshBuffer), *InputBuffer, \meshLength)
            
            ;Case autre cas   
        EndSelect
      EndWith
      If *InputBuffer
        FreeMemory(*InputBuffer)
      EndIf
    Next
  Else 
    Debug "Ooops ! Souci"
  EndIf
Next

Re: AllocateMemory() : Erreur d'initialisation.

Publié : lun. 21/sept./2015 15:54
par Anonyme2
falsam,

j'ai regardé, je te propose ceci, dis-moi si ça marche.

J'ai mis le purificateur et j'ai eu une erreur sur la ligne

Code : Tout sélectionner

Base64Decoder(
un débordement (overflow), le tampon est trop petit

je regarde la doc de Base64Decoder et il y est dit une chose et son contraire ... mais je ne sais pas si je comprend bien de quel tampon on parle.
La mémoire tampon de sortie peut être jusqu'à 33% plus petite que le tampon d'entrée, avec une taille minimale de 64 octets.
Il est recommandé de faire un tampon légèrement plus grand, par exemple 30%, pour éviter les débordements.
j'ai augmenté le tampon de sortie de 30% et je n'ai plus d'erreur.

Code : Tout sélectionner

*InputBuffer = AllocateMemory(Int(\meshLength * 1.30))

Re: AllocateMemory() : Erreur d'initialisation.

Publié : lun. 21/sept./2015 16:11
par falsam
Merci beaucoup Denis pour ton analyse. J'ai fait un test dans le code du projet que j'ai en cours et cette fois çi je n'ai plus d'erreur d'allocation.

Par contre pourquoi ça a fonctionné avec le code précédent lors de la première passe, et pas à la seconde passe dans la boucle For ... Next. Mystère !

Encore une fois merci Denis.

Re: AllocateMemory() : Erreur d'initialisation.

Publié : lun. 21/sept./2015 16:14
par Anonyme2
falsam a écrit :Merci beaucoup Denis pour ton analyse. J'ai fait un test dans le code du projet que j'ai en cours et cette fois çi je n'ai plus d'erreur d'allocation.

Par contre pourquoi ça a fonctionné avec le code précédent lors de la première passe, et pas à la seconde passe dans la boucle For ... Next. Mystère !

Encore une fois merci Denis.
Je suis comme toi, perplexe.
As-tu essayé une boucle très très grande ? juste pour voir si ça plante.

Je n'ai pas vu de freememory() avant la seconde allocation, alors ... Comme le code est un extrait, je ne sais pas comment est ton code.

Re: [Résolu] AllocateMemory() : Erreur d'initialisation.

Publié : lun. 21/sept./2015 16:24
par falsam
Denis a écrit :As-tu essayé une boucle très très grande ? juste pour voir si ça plante.
Oui et je n'ai pas eu de souci.
Denis a écrit :e n'ai pas vu de freememory() avant la seconde allocation, alors ... Comme le code est un extrait, je ne sais pas comment est ton code.
Après EndWith je libere *InputBuffer

J'ai mis à jour l'extrait de code dans mon premier message.