首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Vapi定义中用于通过引用传递数组的参数

在Vapi定义中用于通过引用传递数组的参数
EN

Stack Overflow用户
提问于 2013-05-28 03:38:28
回答 1查看 382关注 0票数 3

我有以下C代码,它使用libmodbus通过ModbusTCP读取单个设备寄存器:

代码语言:javascript
运行
复制
modbus_t *ctx;
uint16_t tab_reg[16];

ctx = modbus_new_tcp("10.0.1.77", 502);
modbus_read_registers(ctx, 0x20, 2, tab_reg);

printf("reg = %d (0x%X)\n", tab_reg[0], tab_reg[0]);
printf("reg = %d (0x%X)\n", tab_reg[1], tab_reg[1]);

现在尝试使用我生成的Vapi将其切换到Vala,new和read的内容如下:

代码语言:javascript
运行
复制
[CCode (cheader_filename = "modbus.h", cname = "modbus_new_tcp")]
public static unowned Modbus.modbus_t create_tcp (string ip_address, int port);

public static int read_registers (Modbus.modbus_t ctx, int addr, int nb, uint16 dest);
[CCode (cheader_filename = "modbus.h")]

翻译后的Vala程序是:

代码语言:javascript
运行
复制
class ModbusReadTest : GLib.Object {

    unowned Modbus.modbus_t ctx;

    public void run () {
        uint16 reg = 0x00;

        ctx = create_tcp ("10.0.1.77", 502);
        Modbus.read_registers (ctx, 0x20, 2, reg);

        message ("reg = %d (0x%X)", reg, reg);

        Modbus.close(ctx);
    }
}

巧合的是,当我把这段代码编译成C代码,然后用gcc编译成二进制文件时,我得到了这个错误:

代码语言:javascript
运行
复制
read-registers-test.c:71:2: warning: passing argument 4 of ‘modbus_read_registers’ makes pointer from integer without a cast [enabled by default]

这并不令人惊讶。但我不确定我应该如何修改Vapi内容,以便与libmodbus头文件中的原型更接近:

代码语言:javascript
运行
复制
int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);

我尝试过混合使用数组选项和'out',但是一次只能获得一个双字节的寄存器。

谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-28 05:53:28

read_registers可能应该是一个实例方法(在Modbus.modbus_t上),而不是静态方法,Modbus.modbus_t可能应该重命名为类似Modbus.Context的名称,create_tcp可能应该是一个构造函数,Modbus.close应该是Modbus.Context紧凑类上的一个免费函数,但这不是这个问题的重点(如果您在irc.gnome.org上访问#vala,您可以获得有关该内容的帮助)。

你可能想把它变成一个数组:

代码语言:javascript
运行
复制
public static int read_registers (Modbus.modbus_t ctx, int addr, [CCode (array_length_pos = 2.5)] uint16[] dest);

然后,您可以在Vala中执行以下操作:

代码语言:javascript
运行
复制
public void run () {
    uint16 reg[2];

    ctx = create_tcp ("10.0.1.77", 502);
    Modbus.read_registers (ctx, 0x20, reg);

    message ("reg = %d (0x%X)", reg, reg);

    Modbus.close(ctx);
}

对于更忠实于原始C的端口(其中tab_reg有16个元素而不是2个),您可以使用数组切片:

代码语言:javascript
运行
复制
public void run () {
    uint16 reg[16];

    ctx = create_tcp ("10.0.1.77", 502);
    Modbus.read_registers (ctx, 0x20, reg[0:2]);

    stdout.printf ("reg = %d (0x%X)\n", reg, reg);

    Modbus.close(ctx);
}

请注意,如果将其设置为实例方法,则需要将array_length_pos更改为1.5。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16779527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档