首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Forth中创建数组?

如何在Forth中创建数组?
EN

Stack Overflow用户
提问于 2019-01-09 10:48:37
回答 3查看 1.8K关注 0票数 3

我知道,这个问题在过去经常被问到,也许这些信息是在以前的堆栈溢出帖子中给出的。但是学习Forth是一项非常复杂的任务,重复有助于理解级联编程语言相对于其他语言(如C )的优势。

我从第四教程中学到的是,Forth不提供创建2D数组的命令,但是用户必须在程序中从零开始实现一切。我在Forth的记忆中找到了两种选择。首先,通过创建一个新词:

代码语言:javascript
复制
: namelist s” hello” s” world” ;

或者第二,通过CREATE语句:

代码语言:javascript
复制
create temperature 10 allot
temperature 10 cells dump

到目前为止,我们已经创建了一个由10个单元组成的数组,其中可以存储整数变量。但是,如果我需要保存浮点数,那又是什么呢?我是否必须始终将浮点数转换为int,还是将它们保存到正常的单元格中?

另一个未解决的问题是如何在数组中存储字符串值。据我所知,字符串包含一个指针加上一个大小。因此,理论上,我只能在一个10单元格数组中存储5个字符串,另外,我还需要在其他地方存储该字符串本身的内存。这没什么意义。

是否有某种更高级别的抽象可用于存储数组中的值,这些值可用于编写易于读取的程序?我的意思是,如果每个程序员都使用自己的Forth方法在内存中存储一些东西,其他程序员会发现很难读懂这些代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-23 14:28:55

一种广义的元素。将元素大小作为参数。

代码语言:javascript
复制
\ 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
;

示例

代码语言:javascript
复制
50 40 /float 2darray 50x40floats
50 40 2 cells 2darray 50x40stringpairs

甚至

代码语言:javascript
复制
20 constant /record
10 200 /record 2darray 2000records
票数 4
EN

Stack Overflow用户

发布于 2019-01-09 12:49:46

create创建一个单词,返回字典中缓冲区的地址(数据空间);它最初是零长度,所以您必须立即为它保留所需的空间。

allot保留以地址单位(通常为字节)度量的空间,因此您必须以字节计算所需的大小。

例如:

代码语言:javascript
复制
create a 10 cells allot
create b 10 floats allot

它只是缓冲区,您仍然需要处理指针算法才能获取或设置项,例如:

代码语言:javascript
复制
0.35e  2 floats b +  f! \ store the float number into third item (0-based indexing)

在字典中创建浮点数数组的单词示例:

代码语言:javascript
复制
: 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

如果需要许多数组和字符串,最好使用适当的库。例如,请参阅单元阵列模块第四基础图书馆中的动态文本字符串模块

票数 5
EN

Stack Overflow用户

发布于 2019-01-13 14:49:54

你对弦乐很困惑。字符串只是进入内存,并且在那个地址上的内存被分配给该字符串,并且它永远在那里(除非您更改它)。

因此,如果您想在分配的内存块中存储5( c-addr u)字符串(称它为数组有点牵强),您只需将c-addr存储在单元格n中,长度u存储在单元格n+1中即可。

如果您担心10个单元格很大(实际上不需要担心),并且只想使用5个单元格,则可以将字符串存储为计数字符串,使用像C"计数字符串这样的单词将长度存储在第一个字节中,随后的每个字节都是一个字符。

此外,您还可以使用单词, (逗号)将内容存储到当前,的字典中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54108389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档