2013-06-19 2 views
5

Comment faire un pointeur vers le premier élément d'un tableau dans Red/System?Pointeurs vers un 'tableau' en rouge/système

Attribution d'une adresse à un pointeur est pas un problème:

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

Le tableau est déclaré.

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

mais.

ptr: :buffer 

est pas le chemin, ni est.

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

Quelqu'un sait-il comment faire?

Cordialement,

Arnold

+0

Notez que ':' n'est PAS un * get "operator" *. Ce n'est pas un opérateur du tout. Par conséquent, vous ne pouvez pas combiner des deux-points pour obtenir un get-of-a-get («:: buffer») ni mettre un espace («: buffer»). Cela rejoint pourquoi Rebol et Red sont si différents des autres langues. Un «:» est un signal qui signifie que le symbole que vous décorez est «aromatisé» comme un GET-WORD !. Malgré la disponibilité de ces "saveurs" (plus que Lisp a, de loin), c'est toujours quelque chose qui est traité symboliquement. Rebol/Red les traite d'une manière déguisée comme une langue "normale", mais vos propres dialectes peuvent faire autrement! – HostileFork

Répondre

5

Comme les deux PTR et tampons sont des pointeurs à un nombre entier de données, vous attribuez simplement un à l'autre:

ptr: buffer 

La syntaxe :variable est uniquement nécessaire pour obtenir le adresse de ce que l'on pourrait appeler des types "primitifs" en Java. Cela équivaut à byte !, integer !, float !, float32! et logique! dans la version actuelle de Red/System. Sans le :, le compilateur fournira la valeur stockée dans la variable.

Tous les autres types tels que c-string! et struct! (et donc alias!) sont en fait des pointeurs. Ainsi, le compilateur fournit leur valeur lorsqu'ils sont référencés, ce qui est une adresse mémoire.

Lorsque vous faites référence à un mot, le compilateur rouge/système fournit la valeur stockée dans le:

print i    ;; will print the value stored in i 

Lorsque vous utilisez un jeu de mots (une variable avec un : ajouté au nom), le compilateur stocke une valeur en elle:

i: 1    ;; stores 1 in variable i 

Lorsque vous utilisez un get-mot (une variable avec un : inséré au début du nom), le compilateur fournit l'adresse de la variable.

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