NicTheQuick hat geschrieben:Außerdem hat freak mal ein Pointertutorial gemacht. Ich weiß
leider nicht, wo man das gerade finden kann, aber es ist auf
jeden Fall Wert es mal durchgelesen und verstanden zu haben.
Aus der FAQ dieses Boards "(PB) Was sind 'Pointer' und wie benutzt man Diese?":
freak hat ein Tutorial über die PureBasic-Pointer geschrieben,
so daß dann keine Frage mehr offen sein sollten.
Das Tutorial findet man auf freaks Homepage im Bereich "Help":
http://freak.purearea.net/
Zaphod hat geschrieben:
wobei mir einfällt, ein unterschied zwischen pointern und
longwerten ist, dass (zumindest in c, ich weiß nicht wie
pure das handhabt) ein pointer immer um den wert einer
ganzen adressierungszelle verschoben wird.
*pointer + 1 währe auf einem 32 bit system also äquivalent
zu longwert + 4, bzw auf einem 64 bit system longwert + 8
Das ist in PureBasic nicht so. Ein "+1" erhöht immer um 1 Byte,
also muß man jedesmal "+ sizeof(POINTER_TYP)" schreiben.
@
Sunny:
Der Unterschied zwischen Long und Pointer ist doch ganz einfach:
Mit den Pointern kann man direkt auf Datenstrukturen zugreifen,
die an der Stelle im Speicher stehen, wo der Pointer hinzeigt.
Ein Pointer macht also nur richtig Sinn, wenn er mit einer Struktur
verknüpft ist.
Um Dein Beispiel zu nehmen:
Jetzt vergiss gleich mal das Du hier eine Variable hast - sieh
das einfach als Speicherbereich an.
Nun nimm einen Pointer und ein Long:
Code: Alles auswählen
*testpointer.BYTE = @testvariable
testpointer_long.l = @testvariable
Wie kommst Du jetzt an den Wert ran, der an der Speicherstelle
steht, wo der Pointer hinzeigen (hier: 34) ?
Mit dem Pointer kannst Du das direkt machen:
Mit dem Long kannst Du aber nicht direkt darauf zugreifen,
sondern musst den Umweg über PeekB() nehmen:
Mit einem (1) Byte ist das allerdings ein ziemlich sinnloses
Beispiel. Wenn Du aber eine richtige Datenstruktur im Speicher
hast, dann sieht das schon anders aus:
Code: Alles auswählen
Structure xyz
v1.b
v2.w
v3.l
s1.s
a1.l[10]
EndStructure
; Speicher reservieren
mem = AllocateMemory( 10 * sizeof(xyz) )
If mem
*p.xyz = mem
For i = 1 To 10
*p\v1 = 12
*p\v2 = 30000
*p\v3 = 2000000
*p\s1 = "Hallo "+Str(i)
For index = 0 To 9
*p\a1[index] = index
Next index
*p + sizeof(xyz)
Next i
EndIf
Warum macht man das ganze direkt über Pointer, und nicht alles
mit PeekB/W/L/S ??
Über die Pointer kann man *direkt* mit dem Speicher arbeiten,
ohne noch extra eine Funktion dafür aufrufen zu müssen.
Das heißt es ist ein Geschwindigkeitsvorteil, da immer der
Aufruf der Peek- und Poke-Funktionen wegfällt.
Das traurige dabei ist aber:
Die letzte Aussage ist allgemein gültig, also für andere Sprachen
wo es optimierende Compiler gibt.
In PureBasic gilt diese Aussage nicht immer, da der Compiler
hier nicht optimiert und langsamen ASM-Output produziert.
Hier muß man das extra austesten, je nachdem was man gerade
macht.
Da man es von anderen Sprachen gewohnt ist, wollte ich auch
mal was mit Pointern beschleunigen... was dann aber in PB
mit Pointern langsamer war als über verschiedene Poke-Funktionen.
War ein weiterer Schock für mich, der die "Qualität" von PB zeigte.
Bei PB muß man also etwas vorsichtig sein und es am besten
immer testen (messen), da die allgemeine Aussage "Pointer
sind immer schneller als über Peek/Poke" hier leider nicht
immer stimmt.
Ein Vorteil ist aber auf jeden Fall die Übersichtlichkeit und
strukturierte Programmierung mit Pointern. Da sieht man auch
sofort das es ein Pointer ist, was man beim Long nicht sieht.
Aber lies Dir erstmal das Tutorial von freak durch... um zu
verstehen wo man Pointer einsetzt, und wie man es benutzt.