Undokumentierte Features von PB

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Undokumentierte Features von PB

Beitrag von remi_meier »

Hi
Mal ne kleine Liste, die sicher noch ergänzt werden kann:
Inline Asm mit ! am Anfang:
Einige sehen es als selbstverständlich an (ich auch), aber gehört auch dazu!
Wenn man nicht die Inline Assembler Option für den Compiler wählen will, dann kann man auch direkt Assembler in den Code eingeben. Dieser Assembler Code wird dann direkt, ohne von PB angefasst zu werden, in den AsmOutput eingesetzt. Man muss nur ein ! vor jeder Asm Zeile schreiben und noch einiges beachten :wink: :

###Variablen können nicht einfach so eingegeben werden wie beim Inline Asm von PB###
Bsp.:
;--------------------------
a.l
!MOV eax, [v_a]
*p
!MOV eax, [p_p]
!JMP l_label
label:
Procedure t()
k.l
k = 4
!MOV eax, [esp]
!MOV [v_a], eax

ProcedureReturn
EndProcedure

Debug t()
Debug a
;--------------------
Ausserdem sollten Push und Pop nur wohlbedacht in Prozeduren verwendet werden! Alle lokalen Variablen in der Prozedur sind auf dem Stack. Alle anderen Variablen sind global.
Array() = *pointer
Ein viel anwendbarer Trick um einen Speicherbereich als Array zu benutzen.
Man muss das Array zuerst deklarieren (mit einem Dim Array.typ(0)) und kann ihm dann einen Speicherbereich per Pointer zuweisen (mit Array() = Adresse).
Bsp. (Variables Array in Structure):
;--------------------------------
Structure Test
*Array
anzahlElemente.l
EndStructure

k.Test
k\anzahlElemente = 5
k\array = AllocateMemory(k\anzahlElemente * 4)

Dim Array2.l(0) ;Array für zugriff deklarieren
Array2() = k\array ;Array2 pointer auf structure array umbiegen
Array2(1) = 3 ;ganz normal wie ein array benutzen
Array2(2) = 54 ;er wird einfach in die structure geschrieben

SortArray(Array2(), 1,0,5) ;optionale parameter müssen angegeben werden, da PB hier die Grösse nicht weiss

Debug "----"
For z = 0 To k\anzahlElemente-1
Debug PeekL(k\array + z * 4)
Next
;--------------------------------

oder String auf Array aufsplitten:
;--------------------------------
String.s = "hallo"
Dim Array.b(0)
Array() = @String

For z = 0 To Len(String) - 1
Debug Chr(Array(z))
Next
;--------------------------------

Das Ganze funktioniert einfach so, dass PB bei Array() = addr einfach die Startadresse des Arrays auf die angegebene Adresse ändert, so kann man den Speicherbereich nun einfach als Array benutzen.

ACHTUNG: PB weiss jetzt die grösse des Arrays nicht mehr, deshalb kann der Debugger nicht vor Übertretung der Arraygrösse schützen. Die Anz. Elemente wäre bei der Adresse @Array()-8 gespeichert (ev. kann man sie dort angeben und der Debugger kann wieder Fehler abfangen, nicht getestet).
EventLParam()/EventWParam()
Ein Verweis auf http://www.purearea.net/pb/download/tut ... ndling.htm sollte genügen :D
OpenComPort(): leider k.A. ob oder wie es funktioniert
KeyboardMode(): leider auch k.A.
Bitte um Mithilfe noch mehr zu finden und die gefundenen noch zu dokumentieren!

greetz
remi

Achtung: Einige Features sind nicht ohne Grund undokumentiert und können ev. auch wieder in zukünftigen Versionen von PB verschwinden!

Die ersten 2 Features stufe ich aber als "sicher" ein.
Zuletzt geändert von remi_meier am 10.02.2005 20:19, insgesamt 1-mal geändert.
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag von Stefan »

Code: Alles auswählen

OnErrorExit() ;beendet das Programm, wenn ein Fehler auftritt.
:mrgreen:

Gruß
Stefan
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Elemente wäre bei der Adresse @Array()-8 gespeichert (ev. kann man sie dort angeben und der Debugger kann wieder Fehler abfangen, nicht getestet).

für wieviele dimensionen gilt das -8 ? für zwei?

ich würde 4byte pro dimension erwarten....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Für die gesamte eindimensionale Länge, glaube also es funktioniert nicht...

Code: Alles auswählen

Dim Array.l(3,3)

Debug PeekL(@Array()-8)
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

ImageGadget() - Laut Doku:

#PB_Image_Border : stellt einen vertieften Rand rings um das Bild dar.

Code: Alles auswählen

ImageGadget(0, 10, 10, 42, 42, UseImage(0), #PB_Image_Border)

'1' (und viele andere Werte) stellen das Image durch Zufall mit einem erhöhten Rand dar:

Code: Alles auswählen

ImageGadget(0, 10, 10, 42, 42, UseImage(0),  1)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

traumatic hat geschrieben:'1' (und viele andere Werte) stellen das Image durch Zufall mit einem erhöhten Rand dar:

Code: Alles auswählen

ImageGadget(0, 10, 10, 42, 42, UseImage(0),  1)
Sowas ist übrigends sehr gefährlich. Kann zu völlig unerwarteten Resultaten in verschiedenen Windows-Versionen führen. Nie einfach so irgendwelche Werte eintragen.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Wieso denn? Die Konstanten, die in PB benutzt werden, werden doch wie ganz normale Zahlen und nicht wie Variabeln behandelt, oder? Soll heissen, dass die Konstante eigetnlich nur der "Kosmetik"/Codestrukturierung dient, wenn ich mich nicht wieder mal irre?
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

hardfalcon hat geschrieben:Wieso denn? Die Konstanten, die in PB benutzt werden, werden doch wie ganz normale Zahlen und nicht wie Variabeln behandelt, oder? Soll heissen, dass die Konstante eigetnlich nur der "Kosmetik"/Codestrukturierung dient, wenn ich mich nicht wieder mal irre?
Das nicht, aber du setzt irgendwelche Werte und weißt nicht, was genau sie machen. Wenn du die Werte nachgeschlagen hast in der SDK/MSDN, dann klappen sie definitiv in allen Windows-Versionen so (bzw. du kriegst die einschränkungen in SDK/MSDN mitgeteilt).

Sollange du das nicht machst, dann ist das resultat einfach nicht allgemein gültig, sondern mehr zufall.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Achso, du meinst, dass ein Wert nicht von allen Windowsversionen "interpretiert" wird. Da hast du natürlich Recht. Ich hatte nicht an die möglichkeit gedacht, dass ein Prameter, den die Windows-Version nicht kennt, "überlebenswichtig" sein könnte. Dann muss man halt (sollte man eh immer, ich bin bloss zu faul :mrgreen: ) die unterstützten Windows-Versionen angeben...
cya
PAscal
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

oder in der API nachschlagen, welche Werte erlaubt sind...
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten