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
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Wie soll man es denn sonst machen? Glaubst du, jeder Entwickler hat auf seinem PC ein dutzend Windows-Versionen installiert?!
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Wunderbar, dann sind sich ja jetzt eigentlich alle einig?
Macht nix, bis morgen fällt mir bestimmt ein neues Streitthema ein...
Glaubst du, jeder Entwickler hat auf seinem PC ein dutzend Windows-Versionen installiert?!
Was soll das denn? GPI sagt doch schon seit Ewigkeiten, dass man sowas nachschlagen soll. Plötzlich stimmst du ihm zu, aber nicht so, dass ers gleich merken kann, und regst dich dann dauf, wenn er sich wiederholt...


:?
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Ich reg mich doch nicht auf... Ausserdem war (bisher) KEIN EINZIGES meiner Postings in irgendeiner Weise "bösartig" gemeint. Aber wenn irgendjemand das hier so interpretiert haben sollte:
Vertragen wir uns wieder, GPI! :wink: :D
So, jetzt dürfte hier hoffentlich wieder "FriedeFreudeEierkuchen" herrschen... <)

cya
Pascal
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Das hätt ich fast vergessen:
- 'a' liefert ASCII-Code
Anstatt mit Asc("c") kann man auch ganz einfach 'c' verwenden.
Bsp:
String.s = "hallo"
*p.BYTE = @String

While *p\b
If *p\b = 'l'
Debug Chr(*p\b)
EndIf

*p + 1
Wend


Man kann bis zu 4 Zeichen (4 Bytes) innerhalb der '' schreiben (die 4 Bytes werden in umgekehrter Reihenfolge gespeichert).
Bsp:
a.l = 'abcd'
For z = 0 To 3
Debug Chr(PeekB(@a + z))
Next
Benutzeravatar
Kiffi
Beiträge: 10713
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

ebenfalls nicht dokumentiert:

Wird Str() auf einen String angewendet, so liefert die Funktion den Zeiger der
Variable zurück.

Code: Alles auswählen

sDummy.s = "Hallo"

Debug Str(sDummy)
Debug @sDummy
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Kiffi hat geschrieben:Wird Str() auf einen String angewendet, so liefert die Funktion den Zeiger der Variable zurück.
Ach, das ist absicht o_O? Das ist mir schon öfters aufgefallen... Hab es für ein Schönheitsfehler gehalten...
Bild
Benutzeravatar
Kiffi
Beiträge: 10713
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Ach, das ist absicht o_O?

keine Ahnung. Es ist aber undokumentiert ;)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Nochmal eine Zusammenfassung bzgl. Array (Size/Typ/Procedureparameter incl. OutOfBounds-Debuggen)

Code: Alles auswählen

;- Array-Size
Dim A.l(9)
Dim B.l(9,9)
Dim C.l(9,9,9)

Debug "ARRAY-SIZE"
Debug "Size (9) : " + Str(PeekL(@A()-8))
Debug "Size (9,9) : " + Str(PeekL(@B()-8))
Debug "Size (9,9,9) : " + Str(PeekL(@C()-8))
Debug ""

;- Array-Type
Dim ArrayB.b(0)
Dim ArrayW.w(0)
Dim ArrayL.l(0)
Dim ArrayF.f(0)
Dim ArrayS.s(0)
Dim ArrayPOINT.POINT(0)
Dim ArrayLONG.LONG(0)

Debug "ARRAY-TYPE"
Debug "Byte: " + Str(PeekL(@ArrayB()-4))
Debug "Word: " + Str(PeekL(@ArrayW()-4))
Debug "Long: " + Str(PeekL(@ArrayL()-4))
Debug "Float: " + Str(PeekL(@ArrayF()-4))
Debug "String: " + Str(PeekL(@ArrayS()-4))
Debug "Structure: " + Str(PeekL(@ArrayPOINT()-4))
Debug "Structure: " + Str(PeekL(@ArrayLONG()-4))

;/ the values of the types:
#Array_Type_Byte      = 1
#Array_Type_Word      = 3
#Array_Type_Long      = 5
#Array_Type_Float     = 9
#Array_Type_String    = 8
#Array_Type_Structure = 7

;- Array as Procedure-Parameter (of fixed type, but changeable size)
Procedure TestProc(*arr.l)
  Dim LocalArray.l(0)             ; dimensionate it to 0
  FreeMemory(@LocalArray()-16)    ; free it (these few bytes ;-) )
  LocalArray() = *arr             ; let it point to the overgiven array
 
  Debug LocalArray(12)            ; play with it (OutOfBounds is caught by the debugger!)
EndProcedure

Dim MyArray.l(20)

MyArray(12) = 777
TestProc(@MyArray())

MyArray(12) = 888
TestProc(@MyArray()) 
Alternativ kann man auch (um ein neudimensionieren bei jedem Prozeduraufruf zu sparen), natürlich irgendwo anders oberhalb und außerhalb der Prozedur einfach ein

Code: Alles auswählen

    Dim LocalArray.l(0)
    FreeMemory(@LocalArray()-16)    ; optional
setzen, da Arrays sowieso immer global sind.
Zuletzt geändert von Froggerprogger am 17.02.2005 17:05, insgesamt 3-mal geändert.
!UD2
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Kiffi hat geschrieben:> Ach, das ist absicht o_O?

keine Ahnung. Es ist aber undokumentiert ;)

Grüße ... Kiffi
Soweit ich weiß, wird es für einige Libs so benötigt.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Ist doch logisch das Str() auf einen String den Pointer zurückgibt, schließlich wird, wenn man einen String an eine Proc übergibt nicht der String in den Stack (bzw. Eax-Register) geladen sondern der Pointer. Ist also genau das selbe wie Str(@string.s). Und dass das den Pointer zurückgibt dürfte jedem klar sein, der Pointer ist ja auch nur ein long wie jede andere Zahl auch.
Desswegen kann es auch kein Schönheitsfehler der Proc sein. Diese kann ja schlecht unterscheiden ob eine Zahl eine Zahl sein soll oder ein Pointer, man könnte höchstens verhindern das man Strings anstelle von longs angeben kann, aber das funktioniert ja bei jeder anderen Proc auch.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten