Structur wird immer erstellt?

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Structur wird immer erstellt?

Beitrag 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)
Zuletzt geändert von Kai am 08.05.2007 16:38, insgesamt 1-mal geändert.
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag 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.
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag 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:
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag 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.
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Gesperrt