Seite 1 von 2

Structur wird immer erstellt?

Verfasst: 08.05.2007 13:17
von Kai
Hallöchen,
ich hab da mal eine rein logische Frage,
unzwar habe ich eine Prozedure die eine Structur erstellt,
die jedoch garnicht aufgerufen wird.
Ist es normal das die Structur dann trotzdem existiert?
Und wenn ja, kann mir das mal jemand erklären wieso?

Code: Alles auswählen

Procedure Init()
 Structure MyOwn
  Item1.l
  Item2.s
 EndStructure
EndProcedure

T.MyOwn

Debug Defined(MyOwn, #PB_Structure)

Verfasst: 08.05.2007 13:27
von AND51
Ich vermute mal, das ist wie mit Konstanten, diese kannst du auch innerhalb einer Procedure deklarieren und sind trotzdem überall verfügbar.

Du kannst es aber auch mal andersrum versuchen: Deklarier mal die STruktur außerhalb einer Prozedur und verwende sie dann innerhalb der Prozedur, es geht auch.

Oder hast du schon mal globale Strukturen gesehen? :lol:

Schlißlich gibt's ja ne Menge ordefinierter Sukture (z. B.: PONT) diese sind auch immer und überall verfügbar.

Verfasst: 08.05.2007 13:46
von Kai
Dann versteh ich aber folgendes nicht.
Wieso wird die Prozedur 2 mal aufgerufen?
Mit dem Ergebnis erstellt.. :shock:

Code: Alles auswählen

Procedure Init()
 If Defined(Test, #PB_Structure) = 0
  Structure Test
   Field1.l
   Field2.s
   Field3.b
  EndStructure
  Debug "erstellt"
 EndIf
EndProcedure

Init()
Init()
Ich möchte halt einfach sohne art eigene Befehlslibary schreiben,
die automatisch die Structur ect erstellt falls diese noch nicht existiert.

Verfasst: 08.05.2007 14:13
von AND51
Die Prozedur wird so oder so zwei Mal aufgerufen, das tutst du doch selber.

> die automatisch die Structur ect erstellt falls diese noch nicht existiert
ja, dann bist du mit Defined() doch schon auf dem richtigen Weg!

Verfasst: 08.05.2007 14:31
von Kai
AND51 hat geschrieben:Die Prozedur wird so oder so zwei Mal aufgerufen, das tutst du doch selber.

> die automatisch die Structur ect erstellt falls diese noch nicht existiert
ja, dann bist du mit Defined() doch schon auf dem richtigen Weg!
Erstens.. wer lesen kann ist klar im Vorteil :allright:
Kai hat geschrieben:Wieso wird die Prozedur 2 mal aufgerufen?
Mit dem Ergebnis "erstellt".. Shocked
Und das defined der Richtige Weg ist.. ist mir klar,
nur ist grad dies das Problem, da es anscheinend immer 0 zurückgibt.
Zumindest innerhalb einer Prozedur.

Für mich kann da was nicht stimmen.
Übrigens drück next ma F5 inner IDE bevor du postest, thx :mrgreen:

Verfasst: 08.05.2007 14:39
von a14xerus

Code: Alles auswählen

Procedure Init()
  If Defined(Test, #PB_Structure) = 0
    Structure Test
      Field1.l
      Field2.s
      Field3.b
    EndStructure
    Debug "DEFINED in Proc = 0"
  EndIf
EndProcedure


Init()

If Defined(Test, #PB_Structure) = 0
  Debug "DEFINED außerhalb Proc = 0"
EndIf

Init() 

If Defined(Test, #PB_Structure) = 0
  Debug "DEFINED außerhalb Proc = 0"
EndIf
Grundsätzlich: Definiere in proceduren einfach keine Structuren oder sonstiges.
Structuren sind sowieso immer vorhanden und es geht auc nicht, das eine varilable erst den typ Long hat und dann wird eien Structure erstellt udn die Variable ist ab dann etwas anderes oder so.
Alle Definitionen einfach nach ganz oben ins Programm.
Das hat auch nichts mit einer Initialisation (Init()) zu tun, da Structuren sowieso schon zur Compilezeit "umgewandelt" werden.
Variablen sind ja nur Speicheradressen
Du kannst ja in einer Procedure auch keine andere Procedure machen, so nach dem Motto, das es die Procedure erst geben soll, wenn eine andere aufgerufen wird

Verfasst: 08.05.2007 14:58
von ts-soft

Code: Alles auswählen

Macro MyStructure
  Structure Test
   Field1.l
   Field2.s
   Field3.b
  EndStructure
EndMacro

Define.l result

result = Defined(Test, #PB_Structure)
Debug result

If result = #False
  MyStructure
EndIf

result = Defined(Test, #PB_Structure)
Debug result

Verfasst: 08.05.2007 16:36
von Kai
Hab keinen an der Waffel, das ist mir selber klar a14xerus. :D

Code: Alles auswählen

Procedure IsStruc()
 ProcedureReturn Defined(STest, #PB_Structure)
EndProcedure

Debug IsStruc()

Structure STest
 Field1.l
 Field2.s
EndStructure

Debug Defined(STest, #PB_Structure)
Debug IsStruc()
Für mich läuft da was falsch,
könnt ihr sagen was ihr wollt.

Verfasst: 08.05.2007 17:32
von Ligatur
Da hast du aber jetzt etwas durcheinanderbekommen. Strukturen sind keine Befehle und werden auch nicht in Code umgewandelt. Da Purebasic beim Compilieren nur einen Durchgang benutzt sind Strukturen erst ab dem Moment bekannt, ab denen sie definiert wurden, egal, ob sie nun in Prozeduren stehen (was überhaupt keinen Sinn ergiebt) oder nicht.

Bei

Code: Alles auswählen

Procedure Init() 
 Structure MyOwn 
  Item1.l 
  Item2.s 
 EndStructure 
EndProcedure 

T.MyOwn 

Debug Defined(MyOwn, #PB_Structure)
Steht die Strukturdefinition vor der Debug Defined... Anweisung, deshalb ist sie bekannt, es gibt auch keine lokalen Strukturen, so daß die Plazierung in der Prozedur überhaupt nichts bewirkt (Wie gesagt, Structure ist kein Befehl wie Defined o. ä.)

Bei

Code: Alles auswählen

Procedure IsStruc() 
 ProcedureReturn Defined(STest, #PB_Structure) 
EndProcedure 

Debug IsStruc() 

Structure STest 
 Field1.l 
 Field2.s 
EndStructure 

Debug Defined(STest, #PB_Structure) 
Debug IsStruc()
hingegen ist die Struktur hinter der Prozedur defiiert und somit in dieser noch niht bekannt, die Prozedur gibt somit immer 0 zurück, egal, ob sie vor oder nach der Stukturdefinition aufgerufen wird während das debug defined... 1 ergibt, da es nach der Strukturdefinition steht. Das ist ein korrektes Verhalten und kein Fehler.

Verfasst: 08.05.2007 18:33
von Kaeru Gaman
a14xerus hat geschrieben:Das hat auch nichts mit einer Initialisation (Init()) zu tun, da Structuren sowieso schon zur Compilezeit "umgewandelt" werden.
das genau ist der punkt. eine struct existiert im grunde nur zur compilezeit.
eine struct ist nur eine konstruction, die es dem programmierer ermöglicht,
einfacher mit seinen daten umzugehen.
wenn du includes schreiben möchtest, die spezielle strukturen benutzen,
musst du diese in der ersten include definieren.
wenn du in einer LIB structs benutzen willst, dann muss die definition im
code für die LIB stehen, und ist nur in der LIB verfügbar.
wenn du über eine struct von einem hauptprogramm aus mit einer LIB kommunizieren willst,
musst du diese struct im hauptprogramm nochmal zusätzlich definieren,
so wie du structs der API ebenfalls selber nochmal definieren musst um sie zu nutzen.