Page 1 sur 1

[V4 Beta 5] Declare avec un Tableau en paramètre [Corrigé]

Publié : sam. 25/févr./2006 8:38
par comtois

Code : Tout sélectionner

Dim Map.Point(20,20)

Declare Toto(Map.Point(2))

Procedure Toto(Map.Point(2))
Map(1,1)\x=12
Map(1,1)\y=34
EndProcedure

Toto(Map())
Debug Map(1,1)\x
Debug Map(1,1)\y
Si je commente la ligne

Code : Tout sélectionner

;Declare Toto(Map.Point(2))
Le code fonctionne , sinon j'ai une erreur "pointer is null"

Dans le code suivant , j'ai un "invalid memory access" , idem le code fonctionne avec le Declare en commentaire

Code : Tout sélectionner

Structure Truc
   X.f
   Y.f
   Z.f
 EndStructure
 
Dim Map.TRuc(20,20)

Declare Toto(Map.Truc(2))

Procedure Toto(Map.Truc(2))
Map(1,2)\x=12
Map(1,2)\y=34
EndProcedure

Toto(Map())
Debug Map(1,2)\x
Debug Map(1,2)\y
Et pour finir j'ai essayé de convertir à la V4 le code du cpl.bator,et là j'obtiens un
---------------------------
PureBasic - Assembler error
---------------------------
PureBasic.asm [1051]:

MP0

error: illegal instruction.


---------------------------
OK
---------------------------

Idem si je commente les declare , le code fonctionne.

Code : Tout sélectionner

;Deformation Wave  Map isométrique 
;Par Cpl.Bator

#TailleMapX=40
#TailleMapY=40

#TailleTileX = 16
#TailleTileY = 8

Structure World
 X.f
 Y.f
 Z.f
 WaveHeight_A.f
 WaveHeight_B.f
 EndStructure

Global WaveSpeed.f = 10

Dim Map.World(#TailleMapX,#TailleMapY)


;-Initialisation des composants DirectX
If InitSprite()=0 Or InitMouse()=0 Or InitKeyboard()=0
 MessageRequester("Erreur","Impossible d'initialiser DirectX")
  End
   EndIf
   
OpenScreen(800 , 600,32,"")

Declare UpdateMap(Map.World(2))
Declare Initialisation_MapIso(Map.World(2))

Procedure UpdateMap(Map.World(2))
  StartDrawing(ScreenOutput())
  DrawingMode(4|1)
  FrontColor($FFFFFF)
  WaveSpeed+0.1
  For Y = 1 To #TailleMapY
    For X = 1 To #TailleMapX
      ;Calcul des vagues, puis affectation à la hauteur (Z).
      Map(x,y)\WaveHeight_A = x*Cos((x*20*2*0.144)+WaveSpeed)
      Map(y,x)\WaveHeight_B = x*Cos((x*20*2*0.144)+WaveSpeed)
      Map(X,Y)\Z = (Map(x,y)\WaveHeight_A + Map(x,y)\WaveHeight_B)/2
      ;Affichage des segments
      If x=>1 And x<#TailleMapX And y=>1 And y<#TailleMapY
        LineXY(352 + Map(X,Y)\X ,150+ Map(X,Y)\Y - Map(X,Y)\Z ,352 + Map(X+1,Y)\X ,150+ Map(X+1,Y)\Y - Map(X+1,Y)\Z)
        LineXY(352 + Map(X,Y)\X ,150+ Map(X,Y)\Y - Map(X,Y)\Z ,352 + Map(X,Y+1)\X ,150+ Map(X,Y+1)\Y - Map(X,Y+1)\Z)
      EndIf
    Next
  Next
  StopDrawing()
EndProcedure

Procedure Initialisation_MapIso(Map.World(2))
  Shared DecalageX.l,DecalageY.l,Offset.l
  For Y = 1 To #TailleMapY
    For X = 1 To #TailleMapX
      DecalageX = DecalageX + (#TailleTileX/2)
      DecalageY = DecalageY + (#TailleTileY/2)
      Map(X,Y)\X = DecalageX
      Map(X,Y)\Y = DecalageY
    Next X
    Offset+1
    DecalageX = -(Offset*(#TailleTileX/2))   
    DecalageY = (#TailleTileY/2)*Offset
  Next Y
EndProcedure

Initialisation_MapIso(Map())

Repeat
  ExamineKeyboard() 
  ExamineMouse() 
  ClearScreen(0)
  UpdateMap(Map())
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
 

Publié : sam. 25/févr./2006 8:45
par comtois
je viens de tester ce code , et là ça fonctionne.

Code : Tout sélectionner

Structure Truc
   X.f
   Y.f
   Z.f
 EndStructure
 
Dim Map.TRuc(20,20)

Declare Toto(Map.Truc())

Procedure Toto(Map.Truc(2))
Map(1,2)\x=12
Map(1,2)\y=34
EndProcedure

Toto(Map())
Debug Map(1,2)\x
Debug Map(1,2)\y
Mais si je place l'appel de la procédure avant la procédure , j'ai un message d'erreur :
---------------------------
PureBasic
---------------------------
Ligne 11: Bad parameter type: a linked list is expected
---------------------------
OK
---------------------------
Ce qui me parait correct.J'aurais peut-être dû avoir aussi ce message dans le code précédent ?

Code : Tout sélectionner

Structure Truc
   X.f
   Y.f
   Z.f
 EndStructure
 
Dim Map.TRuc(20,20)

Declare Toto(Map.Truc())

Toto(Map())

Procedure Toto(Map.Truc(2))
Map(1,2)\x=12
Map(1,2)\y=34
EndProcedure

Debug Map(1,2)\x
Debug Map(1,2)\y

Bref tout ça pour dire que je ne sais pas comment déclarer un tableau en paramètre d'une procédure :?

Publié : jeu. 02/mars/2006 20:00
par LeCyb
Le code du début sans le declare fonctionne très bien.

Code : Tout sélectionner

Dim Map.Point(20,20) 

Procedure Toto(Map.Point(2)) 
Map(1,1)\x=12 
Map(1,1)\y=34 
EndProcedure 

Toto(Map()) 
Debug Map(1,1)\x 
Debug Map(1,1)\y

Publié : jeu. 02/mars/2006 22:24
par comtois
Fred a indiqué sur le forum anglais que le bug était corrigé :)

Publié : ven. 03/mars/2006 14:49
par comtois
tous les codes fonctionnent avec la beta 5 , sauf celui ci

Code : Tout sélectionner

;Deformation Wave  Map isométrique
;Par Cpl.Bator

#TailleMapX=40
#TailleMapY=40

#TailleTileX = 16
#TailleTileY = 8

Structure World
 X.f
 Y.f
 Z.f
 WaveHeight_A.f
 WaveHeight_B.f
 EndStructure

Global WaveSpeed.f = 10

Dim Map.World(#TailleMapX,#TailleMapY)


;-Initialisation des composants DirectX
If InitSprite()=0 Or InitMouse()=0 Or InitKeyboard()=0
 MessageRequester("Erreur","Impossible d'initialiser DirectX")
  End
   EndIf
   
OpenScreen(800 , 600,32,"")

Declare UpdateMap(Map.World(2))
Declare Initialisation_MapIso(Map.World(2))

Procedure UpdateMap(Map.World(2))
  StartDrawing(ScreenOutput())
  DrawingMode(4|1)
  FrontColor($FFFFFF)
  WaveSpeed+0.1
  For Y = 1 To #TailleMapY
    For X = 1 To #TailleMapX
      ;Calcul des vagues, puis affectation à la hauteur (Z).
      Map(x,y)\WaveHeight_A = x*Cos((x*20*2*0.144)+WaveSpeed)
      Map(y,x)\WaveHeight_B = x*Cos((x*20*2*0.144)+WaveSpeed)
      Map(X,Y)\Z = (Map(x,y)\WaveHeight_A + Map(x,y)\WaveHeight_B)/2
      ;Affichage des segments
      If x=>1 And x<#TailleMapX And y=>1 And y<#TailleMapY
        LineXY(352 + Map(X,Y)\X ,150+ Map(X,Y)\Y - Map(X,Y)\Z ,352 + Map(X+1,Y)\X ,150+ Map(X+1,Y)\Y - Map(X+1,Y)\Z)
        LineXY(352 + Map(X,Y)\X ,150+ Map(X,Y)\Y - Map(X,Y)\Z ,352 + Map(X,Y+1)\X ,150+ Map(X,Y+1)\Y - Map(X,Y+1)\Z)
      EndIf
    Next
  Next
  StopDrawing()
EndProcedure

Procedure Initialisation_MapIso(Map.World(2))
  Shared DecalageX.l,DecalageY.l,Offset.l
  For Y = 1 To #TailleMapY
    For X = 1 To #TailleMapX
      DecalageX = DecalageX + (#TailleTileX/2)
      DecalageY = DecalageY + (#TailleTileY/2)
      Map(X,Y)\X = DecalageX
      Map(X,Y)\Y = DecalageY
    Next X
    Offset+1
    DecalageX = -(Offset*(#TailleTileX/2))   
    DecalageY = (#TailleTileY/2)*Offset
  Next Y
EndProcedure

Initialisation_MapIso(Map())

Repeat
  ExamineKeyboard()
  ExamineMouse()
  ClearScreen(0)
  UpdateMap(Map())
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
J'ai toujours ce message d'erreur
---------------------------
PureBasic - Assembler error
---------------------------
PureBasic.asm [1051]:

MP0

error: illegal instruction.


---------------------------
OK
---------------------------
si je commente cette ligne
;Declare Initialisation_MapIso(Map.World(2))
je n'ai plus d'erreur et le code fonctionne bien.

Quelqu'un peut confirmer ?

Publié : sam. 04/mars/2006 22:41
par Guimauve
Confirmé, la déclaration des procédures ne fonctionne pas avec la V4.00 Beta 5

A+
Guimauve