gpt4 book ai didi

在 Forth 中对字符串数组进行排序

转载 作者:行者123 更新时间:2023-12-02 10:16:14 29 4
gpt4 key购买 nike

我用过CREATE创建字符串数组:

create mystringarray s" This" , s" is" , s" a", s" list" ,

我想按升序对其进行排序。我在网上找到了一些汇编语言的教程,但我想用 Forth 来做。最佳实践方法是什么?

最佳答案

您需要首先确保您的数据表示准确。

Forth 中的文字字符串是使用单词 s" 获得的,因此您可以这样写:

s" This"  ok

输入后,如果执行.s,您将看到两个值:

.s <2> 7791776 4  ok

这是一个指向实际字符串(字符数组)的指针,以及字符串中字符数的计数。 Forth 中的某些单词理解这种字符串表示形式。 type 就是其中之一。如果您现在输入type,您将在显示屏上看到键入的字符串:

type This ok

现在您知道您需要两个单元格来表示由s"获得的字符串。您的create需要考虑到这一点并且使用 2, 单词为每个条目存储 2 个单元格,而不是仅存储一个单元格的 ,:

create myStringArray
s" This" 2,
s" is" 2,
s" an" 2,
s" array" 2,
s" of" 2,
s" strings" 2,

这是字符串的地址/计数对的数组。如果您想访问其中之一,可以按如下方式操作:

: myString ( u1 -- caddr u1 )  \ given the index, get the string address/count
\ fetch 2 cells from myStringArray + (sizeof 2 cells)*index
myStringArray swap 2 cells * + 2@ ;

将其分解,您需要获取数组变量 myStringArray 的基数,并向其添加所需字符串地址/计数的正确偏移量。该偏移量是数组条目的大小(2 个单元)乘以索引(位于数据堆栈上)。因此,表达式 myStringArray swap 2 cells * +。接下来是 2@,它检索该位置的双字(地址和计数)。

投入使用...

3 myString type array ok
0 myString type This ok

等等...

现在您已经了解了数组索引的基础知识,那么排序的“最佳实践”将遵循为您希望排序的数组类型选择排序算法的正常最佳实践。在这种情况下,冒泡排序可能适合非常小的字符串数组。 You would use the compare word to compare two strings.例如:

s" This" 0 myString compare .s <1> 0  ok

结果是0,表示字符串相等。

关于在 Forth 中对字符串数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49533788/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com