Variable abfragen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Variable abfragen

Beitrag 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!!! :)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Variable abfragen

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: Variable abfragen

Beitrag 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
(\/) (°,,,°) (\/)
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Re: Variable abfragen

Beitrag von Skiller »

:allright: danke Leute.
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Re: Variable abfragen

Beitrag 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)
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Variable abfragen

Beitrag 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
a²+b²=mc²
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Variable abfragen

Beitrag 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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Re: Variable abfragen

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Variable abfragen

Beitrag 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.
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Re: Variable abfragen

Beitrag 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
Antworten