2013-06-19 9 views
5

Wie mache ich einen Zeiger auf das erste Element in einem Array in Red/System?Zeiger auf ein 'Array' in Rot/System

eine Adresse auf einen Zeiger Zuweisen ist kein Problem:

my-integer: 1 
ptr: declare pointer! [integer!] 
ptr: :my-integer 

Das Array deklariert wird.

buffer: as int-ptr! allocate 1009 * size? integer! 

aber.

ptr: :buffer 

ist nicht der Weg, noch ist.

ptr: ::buffer 
ptr: :buffer/1 
ptr: :(buffer/1) 

Wer weiß, wie man das macht?

Grüße,

Arnold

+0

Beachten Sie, dass ':' ist kein * erhalten "Operator" *. Es ist überhaupt kein Operator. Daher können Sie keine Doppelpunkte kombinieren, um einen get-of-a-get zu erhalten (':: buffer'), noch können Sie ein Leerzeichen setzen (': buffer'). Dies führt dazu, dass Rebol und Red den anderen Sprachen so unähnlich sind. Ein führendes ":" ist ein Signal, das bedeutet, dass das Symbol, das du dekorierst, als GET-WORD "gewürzt" wird. Trotz der Verfügbarkeit dieser "Aromen" (mehr als Lisp hat es bei weitem) ist es immer noch etwas, was symbolisch verarbeitet wird. Rebol/Red verarbeitet sie auf eine Weise, die wie eine "normale" Sprache aussieht, aber deine eigenen Dialekte können es anders machen! – HostileFork

Antwort

5

Da beide ptr und Puffer sind Zeiger Daten auf ganzzahlige Sie einfach einen zum anderen zuweisen:

ptr: buffer 

Die :variable Syntax wird nur das bekommen erforderlich Adresse von sogenannten "primitiven" Typen in Java. Das entspricht Byte !, Integer !, Float !, Float32! und Logik! in der aktuellen Version von Red/System. Ohne den führenden : liefert der Compiler den in der Variablen gespeicherten Wert.

Alle anderen Typen wie C-String! und struct! (und damit Alias!) sind tatsächlich Zeiger. Der Compiler liefert also ihren Wert, wenn sie referenziert sind, was eine Speicheradresse ist.

Wenn Sie ein Wort verweisen, bietet das Red/System-Compiler den Wert darin gespeichert:

print i    ;; will print the value stored in i 

Wenn Sie eine Set-Wort (eine Variable mit einem : an den Namen angehängt), der Compiler ein Wert darin speichert:

i: 1    ;; stores 1 in variable i 

Wenn Sie ein get-Wort (eine Variable mit einem am Anfang des Namens eingefügt :) verwenden, der Compiler die Adresse der variablen zur Verfügung stellt.

int-ptr: :i   ;; stores the address of i in int-ptr