Pointers 如何创建一个Red/System绑定到一个函数,该函数将指针指向一个指针?
我在看Red/System是如何通过Pointers 如何创建一个Red/System绑定到一个函数,该函数将指针指向一个指针?,pointers,shared-libraries,getline,red,red-system,Pointers,Shared Libraries,Getline,Red,Red System,我在看Red/System是如何通过#import语法与Windows DLL、Linux/Android.so共享库和OS/X.dylib中的C库函数相连接的: #import [ "libc.so.6" cdecl [ allocate: "malloc" [ size [integer!] return: [byte-ptr!] ] free: "free" [
#import
语法与Windows DLL、Linux/Android.so共享库和OS/X.dylib中的C库函数相连接的:
#import [
"libc.so.6" cdecl [
allocate: "malloc" [
size [integer!]
return: [byte-ptr!]
]
free: "free" [
block [byte-ptr!]
]
/* ... */
]
适用于所有基本类型,但当函数需要指向指针的指针时,您会怎么做?例如,如果您试图绑定到类似于getline()
的东西,它具有以下原型:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
调用此函数的一种方法(我想这样称呼它…)是传入lineptr不是预分配的缓冲区,而是null
。在本例中,getline为您分配缓冲区并修改char*,使其不再为null
作为第一次尝试,我做到了:
getline: "getline" [
lineptr [byte-ptr!] ;-- char **
n [pointer! [integer!]] ;-- size_t *
stream [byte-ptr!] ;-- FILE *
return: [integer!] ;-- ssize_t
]
但是既然没有指针这样的东西![c-string!]
或类似的,我不知道如何调用它。我可以得到c字符串的地址吗编码>局部变量并将其作为字节ptr传递代码>不知怎的
Red/System [
Title: "derp"
]
#import [
LIBC-file cdecl [
_fdopen: "fdopen" [
fd [integer!]
type [c-string!]
return: [pointer! [byte!]]
]
_getline: "getline" [
line [pointer! [integer!]]
n [pointer! [integer!]]
stream [pointer! [byte!]]
return: [integer!]
]
]
]
getline: func [
stream [pointer! [byte!]]
return: [c-string!]
/local
line [integer!]
n [integer!]
] [
line: 0
n: 0
_getline :line :n stream
as c-string! line
]
stream: _fdopen 0 "r"
line: getline stream
print line
这是可行的。在一个红色小文档的世界中,一个实际文档非常有用,该部分在另一个示例中间接包含了答案:
p: declare pointer! [byte!] ;-- char *p;
这将导致:
getline: "getline" [
lineptr [pointer! [byte!]] ;-- *char *
n [pointer! [integer!]] ;-- *size_t
stream [pointer! [byte!]] ;-- *char
return: [integer!] ;-- ssize_t
]
谢谢这是可行的,尽管LIBC的getline返回的是检索到的行的长度(不是字符串),所以它将是一个整数。。。你可以编辑你的答案(我也可以)。但我会让你做的。:-)很高兴提到这个链接。我想我在这里没有真正了解的主要事情是Red/System对GET-WORD的应用!意思是“地址”。