Pointer dereferenzieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Re: Pointer dereferenzieren

Beitrag von Josef Sniatecki »

Ich selbst habe nichts dagegen, dass nur ein einziges Sternchen für Zeigernamen möglich ist. Nur das diese für Member einer Struktur ignoriert werden ist natürlich... unsystematisch :mrgreen:

Würde zwar eine gigantische Umgewöhnung sein, aber ich bin eher ein Fan davon, dass ein Sternchen nur bei der Deklaration einer Variable benutzt wird und danach der Compiler selbst zwischen einem Pointer und einer normalen Variable unterscheidet, ohne ständig ein Sternchen bei der Verwendung anzuhängen.
In C setzt man ja nur eines, um auf den Inhalt der Adresse eines Zeigers zuzugreifen.

Würde also folgendermaßen aussehen:

Code: Alles auswählen

Define Number.i = 42
Define *Pointer.Integer = @Number

Debug Pointer\i ;= 42
; oder noch besser (was ich in Operno erlaubt habe)
Debug Pointer\ ;= 42 - weil nur ein Member vorhanden ist
Aber wie gesagt: Eine solche Änderung wäre wirklich gewöhnungsbedürftig.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Pointer dereferenzieren

Beitrag von PMV »

STARGÅTE hat geschrieben:Das war auch für mich am anfang unverständlich, warum einerseits:

Code: Alles auswählen

*Test = 1
Test = 2
Bei Structuren aber das * "einfach weggelassen wird" und es somit nicht möglich ist:

Code: Alles auswählen

Structure Uii
 *Test
 Test.i
EndStructure
Vermutlich wegen der Lesbarkeit. Ich zumindest find es so am praktischsten,
letzten endes ist es aber wohl ne einfache Meinungsfrage und damit obliegt es
der Entscheidung des Entwicklers (Fred), was er uns präsentiert. <)

Wichtig ist nur, das man bedenken muss, das ein Zeiger bei der definition
immer nur den Speicher für den Zeiger reserviert, aber nicht für die dahinter
liegende Struktur.

Code: Alles auswählen

Structure MeineStructure
  Quad.q
  Long.l
  Word.w
  Byte.b
EndStructure
Structure PointerTest
 *pTest.MeineStructure
EndStructure

Structure ValueTest
 Test.MeineStructure
EndStructure

Debug SizeOf(PointerTest)
Debug SizeOf(ValueTest)
wegen den *** ... , jo wäre schön,
Aber derzeit kann man sich ja auch mit __ zufrieden geben:

Code: Alles auswählen

Define *Pointer.Integer = @Integer
Define *_Pointer.AllTypes = @*Pointer
Define *__Pointer.AllTypes = @*_Pointer
Es geht vermutlich nicht, weil das * genauso wir das $ bei Strings nichtim eigentlichen Sinne zum Variablennamen gehört, also kein zugelassenes Zeichen ist wie zb der Unterstrich.
Das * ist in C im prinzip ein extra Datentyp, nur behandelt C diesen so wie
PB Strukturen. Gibt man bei der Variablendefinition in C zusätzlich ein * an,
referenziert C gleich zwei Speicherblöcke, ein mal den Zeigern und ein mal
die tatsächlichen Daten, wobei der Zeiger natürlich auf die Speicheradresse
der Daten verweist. Während man in C somit einfach

Code: Alles auswählen

int *width
*width = 34
schreiben kann, muss man in PB

Code: Alles auswählen

*width.INTEGER = AllocateMemory(Sizeof(Integer))
*width\i = 34
schreiben. Das * bei PB ist somit eher ein einfacher Datentyp wie .i oder .s.
Eine Variable kann immer nur einen einfachen Datentyp haben, deswegen
ist ein *Variable.i auch nach wie vor Quatsch und ein Zeiger kann auch nicht
gleichzeitig zu zwei unterschiedlichen Speicheradressen zeigen. :wink: Das *
hat in C eine Sonderrolle, während PB das * nur in verbindung mit komplexen
Datentypen (Strukturen) eine Sonderrolle zu spricht.

Der @-Operator kann ebenfalls nicht verdoppelt werden, weil dieser die
Adresse der dahinter stehenden Variable zurück gibt. Und eine
Speicheradresse selber hat meist keine weitere Adresse, aber selbst wenn,
so weis die Speicheradresse garantiert nicht, welche Zeiger auf sie verweisen.
:mrgreen:

Konnte mir irgend jemand folgen? :lamer:
>:)

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Marvin
Beiträge: 497
Registriert: 17.07.2005 14:42
Wohnort: Krikkit

Re: Pointer dereferenzieren

Beitrag von Marvin »

PMV hat geschrieben:Während man in C somit einfach

Code: Alles auswählen

int *width
*width = 34
schreiben kann
Man kanns zumindest versuchen…

Erinnert mich an dieses Lied:
„Got a segfault—and you're to blame, darling, coding in C is a damn shame!“


EDIT: Und natürlich (wie konnte ich das vergessen) an: Pointer Fun with Binky
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Pointer dereferenzieren

Beitrag von DarkDragon »

mk-soft hat geschrieben:Ich finde wie es in PB ist voll logisch...

Code: Alles auswählen

; Pointer
Define *pValue, *ppValue
; Value
Define Value.i = 100

; Adresse von Value
*pValue = @Value

; Adresse von Pointer auf Adresse von Value
*ppValue = @*pValue

Debug Value
Debug PeekI(*pValue)
Debug PeekI(PeekI(*ppValue))
Was ist denn das für ein gemischter Code-Stil? Da kann man ja gleich allen Religionen gleichzeitig zugehören :lol: . Statt dem doppelten p wär mir ein weiterer Stern lieber. Und so mag ich keinen Code haben wenn er bei manchen Variablennamen klein anfängt und bei anderen groß.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Pointer dereferenzieren

Beitrag von mk-soft »

@DarkDragon

Au man,

Das ist doch nur ein Beispiel...
... p für Pointer und pp für pointer auf ein Pointer.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Re: Pointer dereferenzieren

Beitrag von inc. »

*pointer = Zeiger
**pointer = meist Zeiger auf ein Array an Zeigern

Code: Alles auswählen

Structure pArray
  *p[0]
EndStructure

*p.pArray

*p\p[x] = *Pointer_an_Stelle_x
Hier gibts die OOP Option für PureBasic.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Pointer dereferenzieren

Beitrag von DarkDragon »

mk-soft hat geschrieben:@DarkDragon

Au man,

Das ist doch nur ein Beispiel...
... p für Pointer und pp für pointer auf ein Pointer.
Ja klar, aber dennoch geht es hier um die Darstellung von Zeiger auf Zeiger auf Zeiger auf ... und deine Darstellung ist eben nicht einheitlich, desshalb würde ich es begrüßen, wenn man mehrere Sterne zulassen würde.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: Pointer dereferenzieren

Beitrag von es_91 »

Ich hoffe, die Frage ist nicht zu absurd. Entschuldige mich für's Ausgraben recht alter Threads! 8)

Ich glaube, im Text vor mir wurden strukturierte Typen nicht angesprochen. Gibt es denn eine Chance, strukturierte Daten aufzeigende Pointer ebenfalls zu dereferenzieren?

Wie like...

Code: Alles auswählen

structure stringShadow
  text. s
  memory. i
endStructure

procedure stringOut (*myString.stringShadow)

  debug *myString\ text
  debug peekS (*myString\ memory)
  
  ; /?/ meineZeichenfolge.stringShadow = *myString\ ; ?
  ; debug meineZeichenfolge\ text
  ; debug peekS (meineZeichenfolge\ memory)
endProcedure

newString. stringShadow
newString\ memory = @"Hallo, Welt!"
newString\ text = peeks (newString\ memory)

stringOut (newString)
; End.
Habe ich einen Denkfehler und geht's hier nur um die Form? Ist das vielleicht gar nicht notwendig?

In PureBasic lassen sich, glaube ich, Pointer wie Variablen handhaben. Aber in C gibt es doch auch einen dereferenzierenden Weg. Warum, wenn es keine Vorteile bringt, frag ich mich?

*Anfänger ^^..
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Pointer dereferenzieren

Beitrag von Nino »

es_91 hat geschrieben:Gibt es denn eine Chance, strukturierte Daten aufzeigende Pointer ebenfalls zu dereferenzieren?
Ich werde aus deinem gesamten Beitrag nicht ganz schlau, aber vielleicht suchst du sowas?

Code: Alles auswählen

Structure Person
   Name$
   Age.b
EndStructure

Define.Person Fred, *any

Fred\Name$ = "Fred"
Fred\Age = 25

*any = @Fred
Debug *any\Name$
Debug *any\Age
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: Pointer dereferenzieren

Beitrag von es_91 »

Nino hat geschrieben:

Code: Alles auswählen

*any = @Fred
Debug *any\Name$
Debug *any\Age
Hey!

Was Du da oben macht nennt man doch Referenzierung, oder irre ich?

Was ich suche währe das:

Code: Alles auswählen

Fred2 = peekStruct(*any)
debug Fred2\Name$
debug Fred2\Age
Geht das?

---------------

Mir fällt gerade mal so eine Lösung ein ... Makros.

Code: Alles auswählen

macro Fred2: *any: endMacro
Das wäre aber ja immernoch keine Dereferenzierung?
Antworten