我正在printf
使用S" ..."
字符串调用 C 函数,但遇到了无效的内存地址。将指向在 Forth 端创建的以空字符结尾的字符串的指针传递给 C 的正确方法是什么?
这是 hello world in 的两个版本gforth
,一个使用专用语法来写出文字字符串,另一个使用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 是否使用以空字符结尾的字符串。
在任何情况下,都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
是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
将指向正确的东西?