Je sais, la question a souvent été posée dans le passé et peut-être que les informations sont données dans les publications précédentes de Stack Overflow. Mais apprendre Forth est une tâche très compliquée et la répétition aide à comprendre les avantages d'un langage de programmation concaténatif par rapport aux langages alternatifs comme C.
Ce que j'ai appris des didacticiels Forth, c'est que Forth ne fournit pas de commandes pour créer un tableau 2D, mais l'utilisateur doit tout réaliser à partir de zéro dans le programme. J'ai trouvé deux options pour occuper la mémoire dans Forth. Dans un premier temps en créant un nouveau mot:
create temperature 10 allot temperature 10 cells dump
ou deuxièmement par l'instruction CREATE:
: namelist sâ helloâ sâ worldâ ;
Jusqu'ici tout va bien; nous avons créé un tableau de 10 cellules dans lequel des variables entières peuvent être stockées. Mais qu'est-ce que c'est, si j'ai besoin d'enregistrer des nombres flottants? Dois-je toujours convertir float en int ou peuvent-ils être enregistrés dans les cellules normales?
Un autre problème ouvert est de savoir comment stocker les valeurs de chaîne dans le tableau. Autant que je sache, une chaîne contient un pointeur plus une taille. Donc, en théorie, je ne peux stocker que 5 chaînes dans un tableau de 10 cellules et j'ai également besoin de mémoire ailleurs qui contient la chaîne elle-même. Cela n'a pas beaucoup de sens.
Existe-t-il une sorte d'abstraction plus élevée disponible pour stocker des valeurs dans des tableaux qui peuvent être utilisées pour écrire des programmes faciles à lire? Je veux dire, si chaque programmeur utilise sa propre méthode Forth pour stocker quelque chose dans la mémoire, les autres programmeurs auront du mal à lire le code.
3 Réponses :
create
crée un mot qui renvoie l'adresse d'un tampon dans le dictionnaire (espace de données); sa longueur initiale est nulle, vous devez donc réserver immédiatement l'espace requis.
allot
réserve l'espace qui est mesuré en unités d'adresse (généralement en octets), vous devez donc calculer la taille requise en octets.
Par exemple:
: create-floats-array ( length "name" -- ) create floats allot does> swap 1- floats + ; 10 create-floats-array c 0.35e 3 c f! \ store the float number into third item (1-based indexing) 3 c f@ f. \ print float number form third item
Ce ne sont que des tampons, et vous devez toujours gérer l'arithmétique des pointeurs pour obtenir ou définir un élément, par exemple:
0.35e 2 floats b + f! \ store the float number into third item (0-based indexing)
Exemple de mot qui crée un tableau de flottants dans le dictionnaire:
create a 10 cells allot create b 10 floats allot
Si vous avez besoin de plusieurs tableaux et beaucoup de chaînes, il est préférable d'utiliser les bibliothèques appropriées. Par exemple, consultez Module de tableau de cellules et Module de chaîne de texte dynamique de Forth Foundation Bibliothèque .
Vous êtes confus au sujet des chaînes. La chaîne va juste en mémoire et la mémoire à cette adresse est allouée pour cette chaîne, et elle est là pour toujours (sauf si vous changez cela).
Donc, si vous vouliez stocker 5 chaînes (c-addr u) dans un bloc de mémoire alloué (l'appeler un tableau est un peu extensible), vous pouvez simplement stocker le c-addr dans la cellule n et la longueur u dans la cellule n + 1 .
Si vous craignez que 10 cellules représentent beaucoup d'espace (il n'y a vraiment pas de quoi s'inquiéter) et que vous ne voulez utiliser que 5 cellules, vous pouvez stocker vos chaînes sous forme de chaînes comptées, en utilisant des mots comme C "< / code> - les chaînes comptées stockent la longueur dans le premier octet, chaque octet suivant est un caractère.
De plus, vous pouvez stocker des éléments dans le dictionnaire à la dp
actuelle en utilisant le mot ,
(virgule).
Un tableau 2 généralisé d'éléments. Prend la taille de l'élément comme paramètre
20 constant /record 10 200 /record 2darray 2000records
Exemples
50 40 /float 2darray 50x40floats 50 40 2 cells 2darray 50x40stringpairs
même
\ size is the per element multiplier \ n size * is the per_row factor \ m n size * * is the total space required : 2darray \ create> m n size -- ; does> mix nix -- a \ size is the number of bytes for one element \ create 2dup * , \ multiplier to apply to m index dup , \ multiplier to apply to n index * * allot \ calculate total bytes and allot them does> \ mix nix -- a >r r@ cell+ @ * \ offset from n index swap r@ @ * + \ offset with m index r> + 2 cells+ \ 2 cells offset for the 'admin' cells ;
p >
Quelle quatrième version utilisez-vous?
10 create allot;
est incorrect, cela devrait être quelque chose commecreate x 10 allot
qui réserve 10 unités d'adresse (généralement des octets, pas des cellules).@ruvim Vous avez raison, la syntaxe de création a besoin d'un nom. Je l'ai corrigé dans le code source.