Я вызываю функцию C printf
со строкой S" ..."
и натыкаюсь на недопустимый адрес памяти. Как правильно передать указатель на строку с завершающим нулем, созданную на стороне Forth, в C.
Вот две версии hello world в 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 и помещает указатель на нее в стек. Это также может быть более богатый объект, чем этот, я не знаю, использует ли Форт строки с завершающим нулем.
В любом случае, 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
указывал на нужную вещь?