Page 1 sur 1

invalid acess memory[Résolu]

Publié : lun. 09/avr./2007 15:07
par Anonyme
Salut, je ne comprend pas pourquoi lors du second appel de cette procedure
j'ai un "invalid acess memory"

Est ce un bogue ??

Code : Tout sélectionner


Structure MESH3D
  Position.VECTOR3       
  Rotation.Quaternions  
  
  VerticeList.l
  Nbr_Vertice.l
  
  Mat_Translate.MATRIX4x4
  Mat_Rotation.MATRIX4x4
  Mat_Projection.MATRIX4x4
  ScaleFactor.f
EndStructure


Procedure CREATE_MESH(Vertice)
  
  *Temp.MESH3D      = AllocateMemory(SizeOf(MESH3D))
  *Temp\VerticeList   = AllocateMemory(Vertice*12)
  *Temp\Nbr_Vertice = Vertice
  *Temp\ScaleFactor = 1
  
  ProcedureReturn *Temp
EndProcedure

Publié : lun. 09/avr./2007 15:43
par tmyke
Bizarre, jai essayé le code suivant (comme le tiens, mais avec des versions
DX des composant mathématique 3D):

Code : Tout sélectionner

Structure MESH3D
  Position.D3DXVECTOR3   
  Rotation.D3DXQUATERNION
 
  VerticeList.l
  Nbr_Vertice.l
 
  Mat_Translate.D3DXMATRIX
  Mat_Rotation.D3DXMATRIX
  Mat_Projection.D3DXMATRIX
  ScaleFactor.f
EndStructure


Procedure CREATE_MESH(Vertice)
 
  *Temp.MESH3D      = AllocateMemory(SizeOf(MESH3D))
  *Temp\VerticeList   = AllocateMemory(Vertice*12)
  *Temp\Nbr_Vertice = Vertice
  *Temp\ScaleFactor = 1
 
  ProcedureReturn *Temp
EndProcedure


Debug "debut"
For i = 0 To 200
 *tt.MESH3D = CREATE_MESH(128*(i+1))
 Debug *tt\VerticeList
 Debug *tt\Nbr_Vertice
Next
Debug "fin"
Je n'ai jamais de plantage.
J'ai remplacé ensuite plutot
...VerticeList.l.. dans la structure par *VerticeList, vue que AllocateMemory()
attend renvoie un pointeur. Juste une histoire de syntaxe. Mais j'ai
tenté plusieurs manipulation, sans VAM... :cry:

Publié : lun. 09/avr./2007 15:54
par Anonyme
Bizarre, chez moi ca plante lors du second appel à CreateMesh()

entre les 2 createmesh(), j''ai cette fct° :
Procedure SET_VERTEX(*Mesh.MESH3D,Vertex,x.f,y.f,z.f)
PokeF(*Mesh\VerticeList+((Vertex*#Vertice_SizeOf)+0),x)
PokeF(*Mesh\VerticeList+((Vertex*#Vertice_SizeOf)+4),y)
PokeF(*Mesh\VerticeList+((Vertex*#Vertice_SizeOf)+8),z)
EndProcedure
Quand je la vire , ca passe, sinon , sa plante :?

Publié : lun. 09/avr./2007 15:59
par Anonyme
Voila le bug isolé :

Code : Tout sélectionner

Structure Quaternions
  x.f
  y.f
  z.f
  w.f
EndStructure

Structure MATRIX4x4
  _11.f : _21.f : _31.f : _41.f
  _12.f : _22.f : _32.f : _42.f 
  _13.f : _23.f : _33.f : _43.f 
  _14.f : _24.f : _34.f : _44.f 
EndStructure 

Structure VECTOR3
  x.f
  y.f
  z.f
EndStructure

Structure MESH3D
  Position.VECTOR3       ; Position in 3D space
  Rotation.Quaternions   ; use quaternion for rotations
  
  *VerticeList.l
  Nbr_Vertice.l
  
  Mat_Translate.MATRIX4x4
  Mat_Rotation.MATRIX4x4
  Mat_Projection.MATRIX4x4
  ScaleFactor.f
  
  
EndStructure

#Vertice_SizeOf = 12



Procedure CREATE_MESH(Vertice)
  
  *Temp.MESH3D = AllocateMemory(SizeOf(MESH3D))
  *Temp\VerticeList = AllocateMemory(Vertice*#Vertice_SizeOf)
  *Temp\Nbr_Vertice = Vertice
  *Temp\ScaleFactor = 1
  
  
  ProcedureReturn *Temp
EndProcedure



Procedure SET_VERTEX(*Mesh.MESH3D,Vertex,x.f,y.f,z.f)
  
  *Ptr.l = *Mesh\VerticeList
  PokeF( *Ptr+((Vertex*#Vertice_SizeOf)+0),x)
  PokeF( *Ptr+((Vertex*#Vertice_SizeOf)+4),y)
  PokeF( *Ptr+((Vertex*#Vertice_SizeOf)+8),z)
  
  
EndProcedure  



*A = CREATE_MESH(10)

For i = 1 To 10
SET_VERTEX(*A,i,0,0,0)
Next 

*b = CREATE_MESH(10)

For i = 1 To 10
  SET_VERTEX(*b,i,0,0,0)
Next 

Publié : lun. 09/avr./2007 16:02
par tmyke
La oui, cela plante, j'étudie le truc...

Publié : lun. 09/avr./2007 16:02
par Dr. Dri
j'ai l'IMA je vais regarder ça de près

Dri

Publié : lun. 09/avr./2007 16:04
par tmyke
j'écrirais plutot

Code : Tout sélectionner


*A = CREATE_MESH(10)

For i = 1 To 10
SET_VERTEX(*A,i-1,0,0,0)
Next

*b = CREATE_MESH(10)

For i = 1 To 10
  SET_VERTEX(*b,i-1,0,0,0)
Next
la c'est bon...

Publié : lun. 09/avr./2007 16:05
par Anonyme
dans se sens ca passe, mais ca ne m'arange pas :s

Code : Tout sélectionner

*A = CREATE_MESH(10)
*b = CREATE_MESH(10)

For i = 1 To 10
SET_VERTEX(*A,i,0,0,0)
Next 

For i = 1 To 10
  SET_VERTEX(*b,i,0,0,0)
Next 

edit : Tmyke, je regarde

Publié : lun. 09/avr./2007 16:06
par tmyke
(j'ai merdé sur mon post d'avant, désolé, mais j'ai corrigé)

ou plutot..

Code : Tout sélectionner

*A = CREATE_MESH(10)

For i = 0 To 9
 SET_VERTEX(*A,i,0,0,0)
Next



*b = CREATE_MESH(10)

For i = 0 To 9
  SET_VERTEX(*b,i,0,0,0)
Next

Publié : lun. 09/avr./2007 16:08
par Anonyme
J'ai trouvé, mauvaise allocation de mémoire pour les vertices, j'ai oublié de multiplier le nombre de vertice par la taille d'un float :?

Merci d'avoir regardé :wink:

Publié : lun. 09/avr./2007 16:10
par Dr. Dri
bah je poste quand même ma solution, si ca t'intéresse comme méthode ce sera ça de gagné ^^

Code : Tout sélectionner

Structure Quaternions
  x.f
  y.f
  z.f
  w.f
EndStructure

Structure MATRIX4x4
  _11.f : _21.f : _31.f : _41.f
  _12.f : _22.f : _32.f : _42.f
  _13.f : _23.f : _33.f : _43.f
  _14.f : _24.f : _34.f : _44.f
EndStructure

Structure VECTOR3
  x.f
  y.f
  z.f
EndStructure

Structure MESH3D
  Position.VECTOR3       ; Position in 3D space
  Rotation.Quaternions   ; use quaternion for rotations
  
  Mat_Translate.MATRIX4x4
  Mat_Rotation.MATRIX4x4
  Mat_Projection.MATRIX4x4
  ScaleFactor.f
  
  Nbr_Vertice.l
  VerticeList.VECTOR3[0]
EndStructure

Procedure CREATE_MESH(Nbr_Vertice)
  
  ;faut vérifier que nbr_vertice est positif
  
  *Temp.MESH3D = AllocateMemory(SizeOf(MESH3D) + SizeOf(VECTOR3) * Nbr_Vertice)
  *Temp\Nbr_Vertice = Nbr_Vertice
  *Temp\ScaleFactor = 1.0
  
  ProcedureReturn *Temp
EndProcedure

Procedure SET_VERTEX(*Mesh.MESH3D,Vertex,x.f,y.f,z.f)
  
  ;faut vérifier que vertex est positif et inférieur a nbr_vertice
  
  *Mesh\VerticeList[Vextex]\x = x
  *Mesh\VerticeList[Vextex]\x = y
  *Mesh\VerticeList[Vextex]\x = z
  
EndProcedure 

*A = CREATE_MESH(10)

For i = 1 To 10
SET_VERTEX(*A,i,0,0,0)
Next

*b = CREATE_MESH(10)

For i = 1 To 10
  SET_VERTEX(*b,i,0,0,0)
Next 
Dri

Publié : lun. 09/avr./2007 16:12
par Anonyme
Merci, y a des jour ou je ferais mieux de faire dodo :D