aardio 文档

aardio 范例: 调用 C 语言之弹性数组

//aardio 调用 C 语言之弹性数组 
import tcc; 
tcc.build( "/.flexible_array.dll").code = /** 
#include <stdlib.h>
#include <string.h>

typedef struct{
    int length;
    char bytes[];
} TestStruct;

__declspec(dllexport) TestStruct* createTestStruct(){ 
    TestStruct *ts = (TestStruct *) malloc (sizeof (TestStruct) + 100);
    ts->length = strlen("测试一下");
    strcpy(ts->bytes, "测试一下");
    return ts;
}

__declspec(dllexport) void freeTestStruct(TestStruct* p){
    free(p);
} 
**/

//加载生成的DLL
var dll = raw.loadDll( "/.flexible_array.dll",,"cdecl" );

//方法1
var pStruct = dll.createTestStructP();

    //首先得到弹性数组的长度
    var length = raw.convert(pStruct,{int length}).length;

    //获取弹性数组
    var struct = raw.convert(pStruct,{
        BYTE bytes[/*不能指定变量值*/] = [
            length:length; //弹性数组的长度必须用 length 属性指定
        ]
    },4/*raw.sizeof("int")*/); 

    print( string.pack( struct.bytes ) );

    // 也可以这样写
    // struct = raw.convert( pStruct, raw.array(length,"BYTE","bytes"),4/*raw.sizeof("int")*/ )

    // 或者这样写
    // var bytes = raw.convertArray(pStruct,length,"BYTE",4/*raw.sizeof("int")*/);

    //也可以直接计算指针地址,直接获取数据
    var offset = raw.sizeof({int length});
    var str = raw.tostring(pStruct,offset+1,offset + length);   
    print(str);

dll.freeTestStruct(pStruct);

Markdown 格式