Pointers 如何创建一个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" [

我在看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" [
            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的应用!意思是“地址”。