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.
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 :
###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
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).
Sowas ist übrigends sehr gefährlich. Kann zu völlig unerwarteten Resultaten in verschiedenen Windows-Versionen führen. Nie einfach so irgendwelche Werte eintragen.
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?
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.
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 ) die unterstützten Windows-Versionen angeben...
cya
PAscal