Seite 1 von 4

Undokumentierte Features von PB

Verfasst: 09.02.2005 19:59
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.

Verfasst: 09.02.2005 20:25
von Stefan

Code: Alles auswählen

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

Gruß
Stefan

Verfasst: 10.02.2005 18:21
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....

Verfasst: 10.02.2005 18:24
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)

Verfasst: 10.02.2005 19:26
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)

Verfasst: 10.02.2005 19:54
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.

Verfasst: 12.02.2005 23:10
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?

Verfasst: 12.02.2005 23:48
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.

Verfasst: 14.02.2005 07:58
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

Verfasst: 14.02.2005 21:15
von GPI
oder in der API nachschlagen, welche Werte erlaubt sind...