Seite 2 von 2

Re: Struktur-Variable über Funktion per Zeiger kopieren

Verfasst: 08.02.2017 21:02
von NicTheQuick
Dein C-Code würde so übersetzt werden:

Code: Alles auswählen

; int a;
Define a.l
; a = 5;
a = 5
; int *zeiger;
Define *zeiger.Long
;zeiger = &a;
*zeiger = @a

Debug *zeiger\l
Long deshalb, weil int in C immer 32 Bit hat.

Re: Struktur-Variable über Funktion per Zeiger kopieren

Verfasst: 08.02.2017 21:23
von Beefi
Ja genau, was ich jedoch meinte:

Code: Alles auswählen

define *a.l
*a = 5
Also einen Zeiger, der "irgendwo" hinzeigt und dort eben die 5 speichert.
Hatte mich aber vertan...der Speicherbereich wird in den hier genannten Beispielen ja mit AllocateMemory() reserviert, ich bin heute wohl zu müde :oops:
Also alles gut :allright:

Re: Struktur-Variable über Funktion per Zeiger kopieren

Verfasst: 08.02.2017 23:21
von ts-soft
Beefi hat geschrieben:Ja genau, was ich jedoch meinte:

Code: Alles auswählen

define *a.l
*a = 5
Das ist so nicht erlaubt, bzw. nicht mehr!

Ein Pointer (Zeiger) ist niemals von einem nativem Typ, also es gibt kein *a.l sondern nur *a (ohne .nativer Typ).
Die einzigen Typen, die erlaubt sind, dienen der Strukturierung des Memories, also *a.long oder *a.integer usw.,
hiermit ist dann die Strukture Long bzw. Integer gemeint, nicht der native Typ .l oder .i,
damit dann z.B. über Ihre Strukture per *a\l = 5 erreicht werden!
Dein obiger Code würde also lauten:

Code: Alles auswählen

Define a.l
Define *a.Long = @a
*a\l = 5
Gruß
Thomas

Re: Struktur-Variable über Funktion per Zeiger kopieren

Verfasst: 08.02.2017 23:26
von Sicro
Beefi hat geschrieben:@Sicro:
[...]das mit der Angabe von Map in den Parametern habe ich noch nirgends in der Hilfe gesehen.[...]
PB-Hilfe => Prozeduren-Unterstützung => Procedure : EndProcedure
Arrays können mit Hilfe des Schlüsselworts Array als Parameter übergeben werden, verknüpfte Listen mittels des Schlüsselworts List und Maps mittels Schlüsselworts Map.

Re: Struktur-Variable über Funktion per Zeiger kopieren

Verfasst: 09.02.2017 12:37
von #NULL
@beefi
in verbindung mit dem CopyStructure() würde es gehen, ich empfehle dir dann aber die sauberere variante 1) von helpy, bzw generell sogar eher die von sicro, ganz ohne pointer.
Beefi hat geschrieben: Also wenn ich das mal in C als Beispiel nehme:

Code: Alles auswählen

int a;
a = 5;
int *zeiger;
zeiger = &a;
...hier zeigt "*zeiger" jetzt auf die Variable "a" (also auf 5), bzw. "zeiger" beinhaltet die Adresse zu "a".


Es würde auch gehen (wie in PureBasic):

Code: Alles auswählen

int *zeiger;
*zeiger = 5;
Aber meines Wissens ist der Speicher dann ja nicht reserviert und es führt unter Umständen zu nem Programm-Crash.
Ist das in PureBasic nicht so?
das asterisk ist in pb kein dereference operator, und addresse 5 ist natürlich blödsinn, deshalb der umweg über structure wie im beispiel von NicTheQuick (oder mittels Peek/Poke).
bei *zeiger\l ist das * auch keine dereferenzierung, aber der zugriff auf das strukturfeld kommt effektiv einer gleich.