Pointer und Long-Variablen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Pointer und Long-Variablen

Beitrag von Ynnus »

Hallöchen,

ich hab mal wieder eine schlaue Frage.^^
Mir ist ein wenig der Sinn der Verwendung von Pointern unklar, da man doch auch Long-Variablen verwenden kann und dort Speicheradressen hineinschreiben kann.

Beispiel:

Code: Alles auswählen

testvariable.b = 34

*testpointer = @testvariable
testpointer_long.l = @testvariable
Debug *testpointer
Debug @testvariable
Debug testpointer_long
Das ist alles die selbe Adresse. Warum dann also extra Pointer einführen wenn es auch mit Longs geht? Haben Pointer da irgendwelche besonderen Vorteile oder so?

mfg.

Sunny
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

nein, ein pointer ist ein wert vom typ long (auf x86/win32), in dem eine adresse steht. es ist aber nett wenn man auf einen blick sieht, ob der wert als pointer verwendet wird oder nicht. die meißten compiler benutzen diese unterscheidung auch zur fehlervermeidung, pb aber glaube ich nicht.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Blödes Beispiel, aber das geht mit Pointern nicht.

Code: Alles auswählen

Procedure LeseArray(*Element.LONG, Anzahl.l)
  Protected a.l
  For a = 1 To Anzahl
    Debug *Element\l
    *Element + 4
  Next
EndProcedure

Dim Array.l(50)  ;Anzahl = 51

For a.l = 0 To 50
  Array(a) = a + 1
Next

LeseArray(@Array(), 51)
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.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

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
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

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:

Code: Alles auswählen

testvariable.b = 34
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:

Code: Alles auswählen

Debug *testpointer\b
Mit dem Long kannst Du aber nicht direkt darauf zugreifen,
sondern musst den Umweg über PeekB() nehmen:

Code: Alles auswählen

Debug PeekB(testpointer_long)
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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten