gpt4 book ai didi

c - gforth 用字符串调用 C 函数 printf

转载 作者:太空宇宙 更新时间:2023-11-04 03:15:59 24 4
gpt4 key购买 nike

我正在使用 S"..." 字符串调用 C 函数 printf,但我遇到了一个无效的内存地址。将在 Forth 端创建的以 null 结尾的字符串的指针传递给 C 的正确方法是什么。

gforth 中有两个版本的 hello world,一个使用专用语法写出文字字符串,另一个使用 type 并将字符串存储为值(虽然微不足道)

这是helloworld.fs

#! /usr/bin/env gforth
.( Hello, world!)
CR
bye

helloworld2.fs

#! /usr/bin/env gforth
S" Hello, world!" type
CR
bye

据我所知,语法 S"Hello, world" 在 Forth 运行时的某个全局区域中创建了一个新字符串,并将指向它的指针压入堆栈。它也可能是一个比那更丰富的对象,我不知道 Forth 是否使用以 null 结尾的字符串。

无论如何,gforth暴露了一些调用C函数的语句,这里是hello_world_c.fs

#! /usr/bin/env gforth
\c #include <stdio.h>
c-function printf- printf a -- n

S" hello" printf-
CR

bye

我希望这个脚本在运行时打印 hello 然后换行。 printf 函数的原型(prototype)是 a -- n ... 意味着它接受一个地址并返回与 int 大小相同的内容。单一格式字符串绝对是传递给 printf 的可接受参数集合。

但是,它会产生错误:

$ ./hello_world_c.fs
ar: `u' modifier ignored since `D' is the default (see `U')

in file included from *OS command line*:-1
hello_world_c.fs:5: Invalid memory address
S" hello" >>>printf-<<<
Backtrace:
$7F3A14D65018 call-c
$763A14D64F50 execute

我猜这里的问题来自于 S"hello" 并不是真正的指针,而是其他东西。有没有办法将它转换为指针,以便对 printf 的调用指向正确的东西?

最佳答案

事实证明,S" 不会创建以 null 结尾的字符串,也不会专门将地址压入堆栈。

S" 创建一个临时位置(看起来至少在下一次调用 S" 之前存在)并将长度和地址压入堆栈。

调用S"后长度在栈顶,这个顺序很重要。

这是一个使用 gforth 的示例交互 session ,为清楚起见插入了注释和提示 (>)。

$ gforth
> S" a" ( define a new string, push length and addr )
> .s ( display size of stack and contents of stack )
<2> 22565888 1
> . ( print and drop top item of stack )
1
> .s ( display size and contents of stack again )
<1> 22565888
bye

单词 s\" 类似于 S",除了它支持 C 风格的字符串转义。它以与 S" 相同的方式劫持“读者”,但执行一些翻译。

牢记所有这些,下面是正确调用 printf- 的脚本实现。

#! /usr/bin/env gforth

\c #include <stdio.h>
c-function printf- printf a -- n

( synonym for drop for documentation purposes.
remove the initial length of a length, bytes pair created by
S" or s\" )
: drop-cstr-length drop ;

s\" hello world\n\0" drop-cstr-length
printf-

bye

打印 hello world 然后正常退出。

关于c - gforth 用字符串调用 C 函数 printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51797042/

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