将 Rust 变量传递给期望能够修改它的 C 函数

2023-11-24

我正在编写一个安全的 Rust 层,通过它我可以调用 Rust 中的 C 库中的函数。我已经使用生成了不安全的绑定Rust 绑定根,但我对 Rust 和 C 在传递指针方面的工作方式之间的差异感到有点困惑。

C 函数如下所示:

bool imeGet(unsigned char address, int *value);

它读取 I2C 传感器address,将结果存储在value,并返回TRUE关于成功。

Bindgen 的 Rust 函数如下所示:

pub fn imeGet(address: ::std::os::raw::c_uchar,
              value: *mut ::std::os::raw::c_int) -> bool;

我的安全调用者目前看起来像这样:

pub fn ime_get(addr: u8) -> i32 {
    let v: &mut i32 = 0;
    unsafe {
        imeGet(addr, v);
        *v
    }
}

此代码无法编译,因为= 0。当我没有这个时,编译器抱怨v可能尚未初始化。我的目的是处理这个函数中的成功,然后返回i32 value.

我该如何处理对方的行为*mut c_int争论?我试图声明v作为引用并返回其解除引用的值(上面),但这不起作用。我也尝试过返回v,但我真的不希望返回值保持可变。

我对 Rust 还很陌生,但我确实有不错的 C 背景,这可能是我困惑的根源。


但我确实有不错的 C 背景

Rust 代码的道德等价物是:

int *v = NULL;
imeGet(addr, v);
*v

这会出现错误,因为 C 代码可能会取消引用该内容v来存储值,除非你传入了 NULL,所以它更有可能会繁荣。

您需要为该值创建存储,然后向函数提供对该存储的引用:

fn ime_get(addr: u8) -> i32 {
    let mut v = 0;
    unsafe { imeGet(addr, &mut v) };
    v
}

任何指针类型的解决方案都使用ptr::null_mut:

unsafe { 
    let mut v = std::ptr::null_mut();
    takes_a_pointer_pointer(addr, &mut v);
    v
}

适用于任何类型用途的通用解决方案mem::MaybeUninit:

unsafe {
    let mut v = std::mem::MaybeUninit::uninit();
    takes_a_value_pointer(addr, v.as_mut_ptr());
    v.assume_init()
}

为了完整性,您应该检查返回值:

fn ime_get(addr: u8) -> Option<i32> {
    let mut v = 0;
    let success = unsafe { imeGet(addr, &mut v) };

    if success {
        Some(v)
    } else {
        None
    }
}

Rust 和 C 在传递指针方面的工作方式之间的差异。

就这个级别来说,确实没有。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Rust 变量传递给期望能够修改它的 C 函数 的相关文章

  • #include 在 ubuntu 中“没有这样的文件”

    当使用 g std c 0x Wall test cc o hello 编译时 输出致命错误 cstdatomic 没有这样的文件或直接 哪里不见了 包含内容应该是 include
  • 无法在更新面板中找到上传的文件

    aspx
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 函数原型和数组参数

    我正在学习 C 语法 并且已经开始研究数组了 我想问你一个问题 但首先让我回顾一下 这样我就知道我已经弄清楚了 我知道您可以使用以下语法将变量定义为数组 name
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • ObservableCollection 上的“Cascade”绑定,包含其他 ObservableCollection

    我有一个项目需要显示合同列表 Class Affaire 每个合约都有一个阶段列表 类别阶段 我使用绑定在 2 个不同的 ListView 中显示它们中的每一个 问题是当我从 ListView 中删除一个 Phase 时 显示 Phases
  • ResourceDictionary 源中的 Uri 语法(通用 Windows 平台)

    我正在迁移我的Windows 8 1项目到Windows 10 通用 Windows 平台 这时我被拦住了ResourceDictionary改变在UWP 为了简单起见 我有包含 2 个项目的 Windows 8 1 解决方案 App pr
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • 了解 MVC-5 身份

    我创建了一个新的ASP NET MVC 5申请与Individual User Accounts然后更新了所有的Nuget packages在解决方案中 现在我尝试遵循一些教程中显示的一些指南 但遇到了一些问题 第一个是一个名为Applic
  • 表单.位置不起作用

    我之前问过这个问题 以为我已经解决了 但它仍然不起作用 Form Show 稍微移动表单位置 https stackoverflow com questions 1214014 form show moves form position s
  • 带有 Unicode 字符的主机名在 Windows 8 中有效

    Uri CheckHostName 回报UriHostNameType Unknown到处都是 但在 Windows 8 上 它又回来了UriHostNameType Dns 为什么突然间带有 Unicode 西里尔字符的主机名在 Wind
  • 一个对大文件有效的轻量级 XML 解析器?

    我需要解析潜在的巨大 XML 文件 所以我猜这排除了 DOM 解析器 是否有任何优秀的 C 轻量级 SAX 解析器 在占用空间上可与 TinyXML 相媲美 XML的结构非常简单 不需要诸如命名空间和DTD之类的高级东西 只是元素 属性和
  • C语言中如何将整数转换为字符? [复制]

    这个问题在这里已经有答案了 C语言中如何将整数转换为字符 C 中的字符已经是数字 字符的 ASCII 代码 无需转换 如果要将数字转换为相应的字符 只需添加 0 即可 c i 0 0 是 ASCii 表中的一个字符
  • 在发送传出请求之前将新的 SoapClient 绑定到特定 IP 地址

    假设应用程序所在的计算机具有 SoapClient 具体来说 我正在使用 Microsoft Web Service3 Messaging SoapClient 它通过发送传出请求并获取 SoapEnvelope 作为回报 完善的流程 与远
  • IntoIterator 类型的特征对象可以装箱并保存在结构内部吗?

    可以特征类型的对象IntoIterator装箱并保存在结构内部 我有一种情况 我想存储一个可以转换为迭代器的对象向量 我的尝试是代码 struct Foo foo Vec
  • 序列化时如何跳过 xml 声明?

    我正在尝试输出一个没有 xml 头的 xml 文件 例如 我试过 Type t obj GetType XmlSerializer xs new XmlSerializer t XmlWriter xw XmlWriter Create c
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • MonoGame 中的 ContentLoadException

    我一直在尝试使用 Xamarin Studio 在 MonoGame 中加载纹理 我的代码设置如下 region Using Statements using System using Microsoft Xna Framework usi
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On

随机推荐

  • 模型上的猫鼬 findOne 是否返回承诺?

    我有一个简单的 Node 模块 它导出一个进行数据库查询的函数 问题是该函数在数据库查询完成之前返回 use strict var mongoose require mongoose Model require entities user
  • 安装的python3.9在linux中不显示

    我按照此中的步骤安装了 python 3 9link sudo apt update sudo apt install python3 9 python3 9 sudo update alternatives install usr bin
  • 如何确定嵌入式系统中的最大堆栈使用率?

    当我给Keil编译器 callgraph 选项时 它为我静态计算准确的 最大堆栈使用量 唉 今天它给了我一条 最大堆栈使用量 284 字节 未知 没有堆栈大小的函数 消息 以及 没有堆栈信息的函数 列表 Nigel Jones 表示递归在嵌
  • 我是否需要在生产服务器上安装 Node.js 来托管 Angular 2?

    我正在尝试在我们的实时服务器 Windows 2008R2 IIS 7 5 服务器 上部署我的第一个 Angular 2 应用程序 MVC部分运行良好 我可以看到登录用户名并显示 MVC 布局的框架 但它总是将我重定向到 Error csh
  • 在“_strong id”类型的对象上找不到属性“标签”

    我正在根据本教程构建一个应用程序 http bit ly NI9kQe 它使用自定义 Web api 连接到 Web 服务器 要求之一是检测是否已点击 登录 或 注册 按钮 这是使用在界面生成器中为按钮设置的 标签 来完成的 注册按钮的标签
  • 绘图类绘制直线而不是曲线

    我有下面的代码 使用 UIBezierPath 绘制线条 代码使用addCurveToPoint它应该使用三次贝塞尔路径绘制曲线 但是代码的最终结果是绘制连接的直线 但是addLineToPoint没有被使用 可能发生了什么 为什么代码不绘
  • system() 的退出代码不符合预期

    system 函数返回的退出代码似乎是我从它调用的进程中获得的退出代码的 128 倍 从手册页 返回值 出错时返回的值为 1 例如 fork 2 失败 以及命令的返回状态 other 明智的 这是我所得到的 ls tinker c tink
  • 当项目具有复选框时,RecyclerView 项目不显示波纹/触摸反馈

    我希望 RecyclerView 中的项目在按下时有触摸反馈或波纹 但它们似乎不起作用 我认为这是因为复选框的原因 只有长按时才会出现波纹 简单按下则不会出现 有人可以帮我解决它吗 提前致谢 PD 我使用的是 ListView 项目布局父级
  • MSMQ - 无法从多播队列接收

    我试图了解多播在 MSMQ 中的工作原理 但我根本无法接收消息 即使是来自同一台计算机 我显然做错了什么 但看不出是什么 这就是我所在的地方 我手动创建了一个名为的非事务性专用队列MulticastTest然后将多播地址设置为234 1 1
  • 将值列表从 Python 传递到 SQL 查询的 IN 子句

    我正在尝试将如下列表传递给 sql 查询 x 1000000000164774783 1000000000253252111 我在用sqlalchemy and pyodbc连接到sql import pandas as pd from p
  • PHP html 电子邮件,使用 html 模板

    所以我正在尝试做一个 html 邮件系统 我的 html 我想成为一个模板 存储在一个单独的文件中 例如 div div div class content div div class footer div 当我想发送邮件时 我希望我的邮件
  • 使用 POST 重定向到 POST 响应的 JQuery 表单插件文件上传

    请大家帮忙 这是一个主要的拦截器 我有一个使用 NodeJS 的项目jQuery 表单插件 我正在尝试在其中上传文件的打字稿 文件上传后 服务器会向屏幕上呈现的 POST 消息发送响应 在 POST 响应呈现在屏幕上之前 文件确实已成功且完
  • Android Gradle 插件(警告)API“variant.getMergeResources()”已过时,已替换为“variant.getMergeResourcesProvider()”

    我正在尝试构建并运行这个存储库增强图像我遇到了这个错误 引起原因 java lang RuntimeException 创建 sfa 时出错 哪个深入到这个警告警告 应用程序编程接口 variant getMergeResources is
  • OS X 上的 HAXM 不断消失

    我最近使用 El Capitan 将我的 Android 开发环境转移到了 OS X 上 一切都按预期进行 我发现的唯一问题是 每次重新启动 PC 后 HAXM 都会从 dev 中消失 并且 Android Studio 在使用 HAXM
  • 不规则形状的碰撞检测

    我知道如何检查圆是否即将与正方形碰撞 并且我知道如何检测正方形是否即将与正方形碰撞 但是我将如何检测多边形是否即将与正方形碰撞 或者更好的是 当一个多边形即将与另一个多边形碰撞时 或者更好的是 当由不直的线条组成的形状与另一个相似的形状 多
  • 在 R 中绘制回归线

    我想在 R 中绘制一条简单的回归线 我已经输入了数据 但回归线似乎不正确 有人可以帮忙吗 x lt c 10 20 30 40 50 60 70 80 90 100 110 120 y lt c 10 18 25 29 30 28 25 2
  • Scipy sigmoid曲线拟合

    我有一些数据点 想找到一个拟合函数 我想累积高斯 sigmoid 函数会适合 但我真的不知道如何实现这一点 这就是我现在所拥有的 import numpy as np import pylab from scipy optimize imp
  • 来自 Alfresco 中 WebScript 的 HTTP 请求

    我正在使用 JS 控制器在 Alfresco 中编写 WebScript 并且想向本地 HTTP 资源发出 HTTP 请求 该资源是一个基于 Java 的应用程序 并为我提供了自己的 REST API 我的 WebScript 不是共享组件
  • 如何使用 Html Agility Pack 使请求超时

    我正在向当前离线 故意 的远程 Web 服务器发出请求 我想找出使请求超时的最佳方法 基本上 如果请求运行时间超过 X 毫秒 则退出请求并返回null回复 目前 网络请求只是坐在那里等待响应 我该如何最好地解决这个问题 这是当前的代码片段
  • 将 Rust 变量传递给期望能够修改它的 C 函数

    我正在编写一个安全的 Rust 层 通过它我可以调用 Rust 中的 C 库中的函数 我已经使用生成了不安全的绑定Rust 绑定根 但我对 Rust 和 C 在传递指针方面的工作方式之间的差异感到有点困惑 C 函数如下所示 bool ime