Datentypen bei Aufruf oder Rückgabe der PB-Funktionen

Anfängerfragen zum Programmieren mit PureBasic.
hoerbie
Beiträge: 37
Registriert: 06.12.2013 13:53

Datentypen bei Aufruf oder Rückgabe der PB-Funktionen

Beitrag von hoerbie »

Hallo,

ich komme ganz prima voran mit dem Einfinden in Purebasic, stolpere aber leider immer wieder über meiner Meinung nach Lücken in der (deutschen) PB-Doku/-Hilfe. In den meisten mir bekannten Entwicklungssystemen ist z.B. bei jeder Funktion, die einen Wert zurückliefert, klar dokumentiert, welchen Typ der Rückgabewert hat (Word, Long etc.), bzw. auch wenn man Werte an Funktionen übergibt, welchen Typ der Wert haben darf.

Da ich natürlich im Sinne eines ordentlichen Programms mit EnableExplicit arbeite, stellt sich mir aber nun oft die Frage, was für einen Typ gibt mir Purebasic da eigentlich zurück, bzw. was für einen Typ kann Purebasic da von mir verarbeiten?

Beispielsweise würden mich fürs Zwischenspeichern in Variablen die Funktionen EventGadget, EventMenu, EventTimer, EventType oder EventWindow, WaitWindowEvent, oder auch banale Funktionen wie GetFileAttributes interessieren.

Genauso dann die Frage, welche Werte darf ich denn beispielsweise bei OpenWindow für das #Window oder beim Anlegen eines Gadgets für das #Gadget verwenden, ohne mir irgendwelche Probleme einzuhandeln usw. usf.?

Und noch ein Thema, direkt zu Windows und Gadgets: Ich kenne es vom bisher viel benutzten GFA so, daß ich in jedem Fenster/Dialog die dortigen Controls (Gadgets) unter denselben Nummern anlegen kann, und ich dann in meiner Event-Behandlung zunächst schaue, zu welchem Fenster/Dialog die Message gehört, und dann in der jeweiligen Dialog-Behandlung erst die einzelnen Controls (Gadgets) behandle. Z.B. habe ich in GFA den OK-Button immer auf der #Gadget Nr 150 oder so. Ebenso habe ich in einem größeren Programm, weil GFA nur 31 verschiedene Dialognummern konnte, mit einer zusätzlichen Variable unterschieden, welcher Dialog Nr. 11 gerade offen ist, weil ich diese Nummern mehrfach (aber natürlich nicht gleichzeitig) genutzt habe.
Geht das in PB genauso? Irgendwo hier im Forum hab ich Beispiele gefunden, wo für die Gadgets wohl immer andere Nummern benutzt werden sollen?

Ebenso habe ich bisher leider keine Liste gefunden, welche #PB_* Konstanten welchen Zahlenwert haben, wie das z.B. bei der WinApi für die ganzen WM_* existiert.

Fragen über Fragen, deren Antworten mir hoffentlich beim Erkennen einiger nun auftretender Probleme helfen, daher vielen Dank im Voraus.

Gruß, Hoerbie
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: Datentypen bei Aufruf oder Rückgabe der PB-Funktionen

Beitrag von Andreas21 »

hoerbie hat geschrieben:Ebenso habe ich bisher leider keine Liste gefunden, welche #PB_* Konstanten welchen Zahlenwert haben, wie das z.B. bei der WinApi für die ganzen WM_* existiert.
Geh oben in PB auf Werkzeuge->Strukturverzeichnis und da auf Konstanten.
Dort findest du sie unter P. z.b. #PB_Entity_SphereBody = 3
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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: Datentypen bei Aufruf oder Rückgabe der PB-Funktionen

Beitrag von NicTheQuick »

hoerbie hat geschrieben:Und noch ein Thema, direkt zu Windows und Gadgets: Ich kenne es vom bisher viel benutzten GFA so, daß ich in jedem Fenster/Dialog die dortigen Controls (Gadgets) unter denselben Nummern anlegen kann, und ich dann in meiner Event-Behandlung zunächst schaue, zu welchem Fenster/Dialog die Message gehört, und dann in der jeweiligen Dialog-Behandlung erst die einzelnen Controls (Gadgets) behandle. Z.B. habe ich in GFA den OK-Button immer auf der #Gadget Nr 150 oder so. Ebenso habe ich in einem größeren Programm, weil GFA nur 31 verschiedene Dialognummern konnte, mit einer zusätzlichen Variable unterschieden, welcher Dialog Nr. 11 gerade offen ist, weil ich diese Nummern mehrfach (aber natürlich nicht gleichzeitig) genutzt habe.
Geht das in PB genauso? Irgendwo hier im Forum hab ich Beispiele gefunden, wo für die Gadgets wohl immer andere Nummern benutzt werden sollen?
PB-Hilfe hat geschrieben:PureBasic Objekte

I. Indexierte Nummerierung
Der statische bzw. indexierte Weg ermöglicht Ihnen, auf ein Objekt durch einen vordefinierten numerischen Wert zu verweisen. Die erste verfügbare Index-Zahl ist 0, weitere Indizes werden anschließend fortlaufend (sequentiell) zugeordnet. Dies bedeutet, wenn Sie die Index-Nummer 0 und dann die Nummer 1000 verwenden, werden 1001 Indizes reserviert und 999 (von 1 bis 999) bleiben unbenutzt, welches keine effiziente Art und Weise zur Benutzung von indexierten Objekten darstellt. Wenn Sie eine flexiblere Methode brauchen, verwenden Sie die dynamische Art zum Zuordnen von Objekten, wie im Abschnitt II. beschrieben.
PB-Hilfe hat geschrieben:Handles und Nummern
Die Zahlen, die man Objekten zuweist, müssen keine Konstanten sein, sie müssen aber für jedes Objekt einmalig sein. (Ein Bild kann z.B. aber die gleiche Zahl wie ein Gadget haben, weil dies ja unterschiedliche Dinge sind.) Diese Nummern werden benötigt, um die Objekte später im Programm anzusprechen.
hoerbie hat geschrieben:Ebenso habe ich bisher leider keine Liste gefunden, welche #PB_* Konstanten welchen Zahlenwert haben, wie das z.B. bei der WinApi für die ganzen WM_* existiert.
Was willst du mit dieser Liste denn erreichen? Ich hoffe du willst nicht damit anfangen Zahlenwerte statt Konstanten zu verwenden.
hoerbie hat geschrieben:Da ich natürlich im Sinne eines ordentlichen Programms mit EnableExplicit arbeite, stellt sich mir aber nun oft die Frage, was für einen Typ gibt mir Purebasic da eigentlich zurück, bzw. was für einen Typ kann Purebasic da von mir verarbeiten?
Grundsätzlich gilt als Standardtyp "Integer", also ".i". Alles andere wird notfalls angegeben.
Weitere häufig genutzte Typen sind natürlich "String (.s)", "Quad (.q)", "Character (.c)", "Float (.f)" und "Double (.d)". Alle anderen Typen haben meistens nur Sinn in bestimmten Strukturen. Wenn man Ganzzahlen nutzen möchte, die nicht größer als 2³¹ -1 werden, dann nutzte man Integer. Für größere nimmt man Quad. Integer wird bevorzugt, weil das die Größe eines CPU-Registers ist und die CPU damit am schnellsten rechnen kann.
hoerbie
Beiträge: 37
Registriert: 06.12.2013 13:53

Re: Datentypen bei Aufruf oder Rückgabe der PB-Funktionen

Beitrag von hoerbie »

Hallo!

@Andreas21: Danke für den Tip, da hab ich echt noch nicht gesucht.
NicTheQuick / PB-Hilfe hat geschrieben: PureBasic Objekte
I. Indexierte Nummerierung
Der statische bzw. indexierte Weg ermöglicht Ihnen, auf ein Objekt durch einen vordefinierten numerischen Wert zu verweisen. Die erste verfügbare Index-Zahl ist 0, weitere Indizes werden anschließend fortlaufend (sequentiell) zugeordnet. Dies bedeutet, wenn Sie die Index-Nummer 0 und dann die Nummer 1000 verwenden, werden 1001 Indizes reserviert und 999 (von 1 bis 999) bleiben unbenutzt, welches keine effiziente Art und Weise zur Benutzung von indexierten Objekten darstellt. Wenn Sie eine flexiblere Methode brauchen, verwenden Sie die dynamische Art zum Zuordnen von Objekten, wie im Abschnitt II. beschrieben.
Handles und Nummern
Die Zahlen, die man Objekten zuweist, müssen keine Konstanten sein, sie müssen aber für jedes Objekt einmalig sein. (Ein Bild kann z.B. aber die gleiche Zahl wie ein Gadget haben, weil dies ja unterschiedliche Dinge sind.) Diese Nummern werden benötigt, um die Objekte später im Programm anzusprechen.
Danke, das hab ich in der Hilfedatei nicht gefunden. Das heißt also je Gadget, egal in welchem Window, eine eigene Nummer. Na toll, das macht dann aber reichlich Mehrarbeit bei der Portierung und den Quelltext nicht gerade übersichtlicher. Da hätte ich mehr erwartet von einer Hochsprache, zumal PB intern doch wohl eh die eindeutigen Nummern des jeweiligen Betriebssystems nutzen wird, naja, mal ein Punkt wo GFA in den 90ern schon weiter war...
NicTheQuick hat geschrieben:Was willst du mit dieser Liste denn erreichen? Ich hoffe du willst nicht damit anfangen Zahlenwerte statt Konstanten zu verwenden.
Um Gottes Willen, bloß nicht, der Sinn der Konstanten erschließt sich mir da voll! Ich fragte nach der Liste, weil ich verstehen will, was mir PB da alles so an Events schickt. Diesbezüglich ist auch der Hinweis von Andreas21 leider nur bedingt brauchbar, da ich unter Werkzeuge offensichtlich nicht nach den Zahlenwerten suchen kann. Und eine Umkehrfunktion zu den Konstanten seh ich auch nicht, also z.B. GetNameOfPBEventCode(15) -> #PB_Event_Repaint oder sowas.

Denn ich bin z.B. auch sehr überrascht, daß PB mir neben seinen eigenen Events auch die ganzen WM_* von Windows weiterschickt, obwohl die teilweise dasselbe bedeuten. Und bei anderen Events kommt nur eine Message, wo dann #PB und WM_ denselben Wert haben.
NicTheQuick hat geschrieben:Grundsätzlich gilt als Standardtyp "Integer", also ".i". Alles andere wird notfalls angegeben.
Weitere häufig genutzte Typen sind natürlich "String (.s)", "Quad (.q)", "Character (.c)", "Float (.f)" und "Double (.d)". Alle anderen Typen haben meistens nur Sinn in bestimmten Strukturen. Wenn man Ganzzahlen nutzen möchte, die nicht größer als 2³¹ -1 werden, dann nutzte man Integer. Für größere nimmt man Quad. Integer wird bevorzugt, weil das die Größe eines CPU-Registers ist und die CPU damit am schnellsten rechnen kann.
Danke. Das heißt dann ja für mich, wenn ich für die Nummern bei Funktionen, Windows, Gadgets, Bildern, etc. - sofern nix anderes dokumentiert ist - immer den Typ Integer .i nehme, welcher dann ja CPU-abhängig jeweils passend Long oder Quad bedeutet, kann ich nix verkehrt machen.

Gruß, Hoerbie
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

Re: Datentypen bei Aufruf oder Rückgabe der PB-Funktionen

Beitrag von ts-soft »

hoerbie hat geschrieben:Da hätte ich mehr erwartet von einer Hochsprache, zumal PB intern doch wohl eh die eindeutigen Nummern des jeweiligen Betriebssystems nutzen wird, naja, mal ein Punkt wo GFA in den 90ern schon weiter war...
oder auch nicht. Kann ja keiner was dafür, wenn Du den Sinn der einheitlichen Objektverwaltung von PB nicht verstehst. Unter anderem, wäre
es nicht möglich, Mithilfe des hWnd aufeinanderfolgende Nummerierung zu erhalten, z.B. For i = #Gadget_Bla to #Gadget_Blub usw.
Nur um ein Beispiel zu erwähnen.

GFA Basic war zu seiner Zeit sicher eine gute Programmiersprache, aber Syntaktisch weder Einheitlich noch Einsteigerfreundlich.
Nur weil Du da mehr Übung hast, heisst es nicht, das die schon weiter waren :mrgreen:
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
NicTheQuick
Ein Admin
Beiträge: 8809
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: Datentypen bei Aufruf oder Rückgabe der PB-Funktionen

Beitrag von NicTheQuick »

Ich stehe ja sowieso eher darauf #PB_Any zu nutzen. Damit bekomme ich dynamische IDs zurück, die ich dann je nach Anwendungsgebiet in einfachen Variablen speichere oder in Strukturen oder Listen.
hoerbie
Beiträge: 37
Registriert: 06.12.2013 13:53

Re: Datentypen bei Aufruf oder Rückgabe der PB-Funktionen

Beitrag von hoerbie »

Hallo,
NicTheQuick hat geschrieben:Ich stehe ja sowieso eher darauf #PB_Any zu nutzen. Damit bekomme ich dynamische IDs zurück, die ich dann je nach Anwendungsgebiet in einfachen Variablen speichere oder in Strukturen oder Listen.
Das schwebt mir nun auch vor, da kann ich mir mit Strukturen/Arrays/Listen ja wieder sowas bauen, wie ich es gewohnt bin.
ts-soft hat geschrieben:oder auch nicht. Kann ja keiner was dafür, wenn Du den Sinn der einheitlichen Objektverwaltung von PB nicht verstehst. Unter anderem, wäre es nicht möglich, Mithilfe des hWnd aufeinanderfolgende Nummerierung zu erhalten, z.B. For i = #Gadget_Bla to #Gadget_Blub usw. Nur um ein Beispiel zu erwähnen.
Ich sehe ja, daß da ein gewisser Sinn drin steckt, bei fortlaufender Nummerierung alle zusammengehörenden Gadgets in einer For-Schleife behandeln zu können etc. Das konnte ich in GFA mit je Fenster vergebenen Gadget-Nummern aber auch :D
ts-soft hat geschrieben:GFA Basic war zu seiner Zeit sicher eine gute Programmiersprache, aber Syntaktisch weder Einheitlich noch Einsteigerfreundlich. Nur weil Du da mehr Übung hast, heisst es nicht, das die schon weiter waren
Das hat nur bedingt was mit Übung zu tun, sondern auch mit logischer/hierarchischer Ordnung, in GFA gabs halt als Oberkategorie immer das Fenster/den Dialog, und darin dann erst die jeweiligen Gadgets, und diese Zuordnung fehlt in PB anscheinend ja ganz, obwohl ein Gadget ja immer zu einem Fenster gehört. Und es war da halt schon einfacher, wenn man genau wußte, daß in jedem Dialog das Gadget mit der Nr. 150 halt der OK-Button und mit der 151 der Abbruch-Button oder so war.

Naja, Schwamm drüber, dann bau ich mir halt ein paar Verwaltungsstrukturen drumherum.

Gruß, Hoerbie
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Datentypen bei Aufruf oder Rückgabe der PB-Funktionen

Beitrag von Andesdaf »

du kannst dir ja deine Gadget-Konstanten auch so benennen, dass sie diese Hierarchie quasi wiederspiegeln. Also nennst du beispielsweise
das erste Fenster #WIN_MAIN und alle darin enthaltenen Buttons #BUT_MAIN_<Button>. Insgesamt heißen dann alle Konstanten für die
OK-Buttons halt #BUT_<Window>_OK.
Win11 x64 | PB 6.20
hoerbie
Beiträge: 37
Registriert: 06.12.2013 13:53

Re: Datentypen bei Aufruf oder Rückgabe der PB-Funktionen

Beitrag von hoerbie »

@Andesdaf: Wow, danke für den Tip! Auf die Idee wär ich echt nicht gekommen!
Es kann ja so einfach sein, und ist mit Sicherheit Resourcen-schonender als ein zweidimensionales Array(Fenster,Gadget) oder so.
Antworten