Seite 1 von 2

Variable abfragen

Verfasst: 21.10.2013 00:19
von Skiller
Hi Folks,

Code: Alles auswählen

Procedure P_action(index)
  If Not MyArray(0) ;..????.. Wie kann ich hier abfragen, ob MyArray überhaupt existiert??
     Global Dim MyArray(0)   
  EndIf
     
  ReDim MyArray(index)
  
  ;usw....
EndProcedure

P_action(1)
P_action(2)
P_action(3)
DANKE!!! :)

Re: Variable abfragen

Verfasst: 21.10.2013 00:46
von STARGÅTE
Nun ja, das Schlüsselwort Global wird so oder so schon zu Compilerzeiten gelesen und ausgeführt und macht das Array MyArray ab der Zeile des Aufrufs sowieso global.
Diese Definition gehört also außerhalb der Prozedure.

Unabhängig davon kannst du

Code: Alles auswählen

CompilerIf Defined(MyArray, #PB_Array) = #False
     Global Dim MyArray(0)   
  CompilerEndIf
nutzen, um Doppeldefinitionen zu vermeiden.

Re: Variable abfragen

Verfasst: 21.10.2013 02:09
von KeyKon
Zur Laufzeit hilft dir da auch ArraySize(MyArray()) weiter. Das gibt -1 zurück wenn es noch nicht exisitiert bzw. beim Anlegen einen Fehler gab (z.B. zu groß)
Desweiteren gibt es natürlich die aktuelle Größe des Arrays zurück, was du vll auch gebrauchen kannst.

LG KeyKon

Re: Variable abfragen

Verfasst: 21.10.2013 10:46
von Skiller
:allright: danke Leute.

Re: Variable abfragen

Verfasst: 21.10.2013 11:28
von Skiller
Hallo nochmal,
sah erst sehr vielversprechend aus, funzt allerdings beides nicht. :cry:
Was ist noch möglich ?

Code: Alles auswählen

Procedure P_action(index_)
  
  ; Versuch 1
  If Defined(MyArray1, #PB_Array) = #False
    Global Dim MyArray1(0)   
    Debug index_  
  EndIf
  
    ; Versuch 2
  CompilerIf Defined(MyArray2, #PB_Array) = #False
    Global Dim MyArray2(0)   
    Debug index_  
  CompilerEndIf
  
    ;Versuch 3  FEHLER!!!!
  If ArraySize(MyArray3()) = -1
     Global Dim MyArray3(0)   
     Debug index_    
  EndIf
  
EndProcedure

P_action(1)
P_action(2)
P_action(3)
P_action(4)

Re: Variable abfragen

Verfasst: 21.10.2013 11:40
von Kiffi
Skiller hat geschrieben:Was ist noch möglich ?
wieso nicht so?

Code: Alles auswählen

Global Dim MyArray1(0)

Procedure P_action(index_)
 [...]  
EndProcedure

P_action(1)
P_action(2)
P_action(3)
P_action(4)
Grüße ... Kiffi

Re: Variable abfragen

Verfasst: 21.10.2013 12:27
von STARGÅTE
@Skiller:

Hab ich mir fast gedacht, was du da machen willst, aber das geht nun mal nicht, weil dein Global immer ausgeführt wird, egal ob die Prozedur aufgerufen wird oder nicht!

Die Frage die sich mir nun auch stellt ist, warum nimmst du nicht die normale Variante, wie Kiffi vorschlägt?

Und wenn es dir um Arrayvergrößerung geht:

Code: Alles auswählen

Global Dim MyArray1(0)

Procedure P_action(index_)
  
  If ArraySize(MyArray1()) < index_
     ReDim MyArray1(index_)   
     Debug index_
  EndIf
  
EndProcedure

P_action(17)
P_action(11)
P_action(5)
P_action(30)

Re: Variable abfragen

Verfasst: 21.10.2013 15:09
von Skiller
Hallo Kiffi,
Deshalb...

Code: Alles auswählen

Procedure P_Create_MyBox(index)
  CompilerIf Defined(S_Box.S_Box, #PB_Array) = #False
    Global Dim S_Box.S_Box(0)
    Debug index_  
  CompilerEndIf
 
  Redim S_Box.S_Box(index)

  ; ..usw
Endprocedure

Procedure P_Create_MyBall(index)
  CompilerIf Defined(S_Ball.S_Ball, #PB_Array) = #False
    Global Dim S_Ball.S_Ball(0)
    Debug index_  
  CompilerEndIf
 
   Redim S_Ball.S_Ball(index)

; ..usw
Endprocedure

P_Create_MyBox(0)
P_Create_MyBox(1)
P_Create_MyBox(2)

P_Create_MyBall(0)
P_Create_MyBall(1)
P_Create_MyBall(2)
Ich will ja nicht jedes Mal Meshes extra global deklaireren . Es wäre also so viel komfortabler.
Ok Stargate, ist das wirklich Dein letztes Wort??!!! :o Gruß Skiller

Re: Variable abfragen

Verfasst: 21.10.2013 15:51
von NicTheQuick
Was stört dich an 'Static'?

Code: Alles auswählen

Structure S_Box
EndStructure
Structure S_Ball
EndStructure

Procedure P_Create_MyBox(index)
	Static Dim S_Box.S_Box(0)
	Debug index
	
	
	ReDim S_Box.S_Box(index)
	
	; ..usw
EndProcedure

Procedure P_Create_MyBall(index)
	Static Dim S_Ball.S_Ball(0)
	Debug index
	
	ReDim S_Ball.S_Ball(index)
	
	; ..usw
EndProcedure

P_Create_MyBox(0)
P_Create_MyBox(1)
P_Create_MyBox(2)

P_Create_MyBall(0)
P_Create_MyBall(1)
P_Create_MyBall(2) 
Und warum hinter dem 'index' ein Unterstrich war, hab ich auch nicht verstanden.

Re: Variable abfragen

Verfasst: 21.10.2013 18:45
von Skiller
Hi, Nick
ich brauche aber global, weil ich von extern aufrufen muss. Danke trotzdem. Ich hab noch ´nen bischen gegrübelt und das hier rausbekommen. Vielleicht könnt Ihr es ja noch ein weinig feinschleifen bzw. mögliche Fehler finden. Danke !!!

Code: Alles auswählen

EnableExplicit
Global Dim StructAbfrage(0)

Procedure P_Struct()
  
 Structure S_Box
  TestBox.i 
 EndStructure
 
 Structure S_Ball
   TestBall.i   
 EndStructure
 
EndProcedure

Procedure P_Create_MyBox(index)
 
 Protected MeshID = 1 
  
 ReDim StructAbfrage(MeshID) 
 
 If Defined(P_Struct, #PB_Procedure) <> StructAbfrage(MeshID) 
     StructAbfrage(MeshID) = #True
     Global Dim S_Box.S_Box(0)
     Debug "#######"          
     Debug index
     Debug "#######"     
     Debug " "  
   EndIf 
  
 ReDim S_Box.S_Box(index)
 
 S_Box.S_Box(index)\TestBox = 88*index
 
EndProcedure

Procedure P_Create_MyBall(index)
  
 Protected MeshID = 2
 
 ReDim StructAbfrage(MeshID) 
 
 If Defined(P_Struct, #PB_Procedure) <> StructAbfrage(MeshID) 
    StructAbfrage(MeshID) = #True
    Global Dim S_Ball.S_Ball(0)
    Debug "#######"     
    Debug index
    Debug "#######"     
 EndIf 
 
  ReDim S_Ball.S_Ball(index)
 
  S_Ball.S_Ball(index)\TestBall = 7*index
  
EndProcedure

P_Create_MyBox(1)
P_Create_MyBox(2)
P_Create_MyBox(3)

P_Create_MyBall(1)
P_Create_MyBall(2)
P_Create_MyBall(3)
;--------------------------------------------------
Define i
For i = 1 To 3
  Debug "-------------"
  Debug S_Box.S_Box(i)\TestBox 
  Debug S_Ball.S_Ball(i)\TestBall 
Next
beste Güße Skiller :D