RustDay06------Exercise[91-100]

91.将指针还原成指定类型

因为指针不知道里面具体有什么,所以一般约定打上unsafe

申明开发者自己对该部分可用性负责,且在调试的时候也能起强调作用

// tests6.rs
//
// In this example we take a shallow dive into the Rust standard library's
// unsafe functions. Fix all the question marks and todos to make the test
// pass.
//
// Execute `rustlings hint tests6` or use the `hint` watch subcommand for a
// hint.// I AM NOT DONEstruct Foo {a: u128,b: Option<String>,
}/// # Safety
///
/// The `ptr` must contain an owned box of `Foo`.
unsafe fn raw_pointer_to_box(ptr: *mut Foo) -> Box<Foo> {// SAFETY: The `ptr` contains an owned box of `Foo` by contract. We// simply reconstruct the box from that pointer.let mut ret: Box<Foo> = unsafe { Box::from_raw(ptr) };// todo!("The rest of the code goes here")ret.b = Some("hello".to_owned());ret
}#[cfg(test)]
mod tests {use super::*;use std::time::Instant;#[test]fn test_success() {let data = Box::new(Foo { a: 1, b: None });let ptr_1 = &data.a as *const u128 as usize;// SAFETY: We pass an owned box of `Foo`.let ret = unsafe { raw_pointer_to_box(Box::into_raw(data)) };let ptr_2 = &ret.a as *const u128 as usize;assert!(ptr_1 == ptr_2);assert!(ret.b == Some("hello".to_owned()));}
}

92.配置本地环境

首先我们得知道配置文件放在build.rs里面!!!

首先参考文档之后写上指令

"rustc-env=TEST_FOO={}",

然后注释掉下面的 your_command变量即可通过test7

93. 函数签名设置编译参数

这个标签指定了编译的配置参数key-value

设置编译的key-value即可,详情参照文档

let your_command = "rustc-cfg=feature = \"pass\"";

 

 94.设置#[link_name = "myName"]和#[no_mangle]获取原汁原味特定的函数名

有时候经过名称修饰或者编译,函数名会发生变化,在同语言下没有影响,但是在不同语言交互的时候可能会找不到指定的函数名,所以将函数名称固定可以避免此种情况发生

// tests9.rs
//
// Rust is highly capable of sharing FFI interfaces with C/C++ and other statically compiled
// languages, and it can even link within the code itself! It makes it through the extern
// block, just like the code below.
//
// The short string after the `extern` keyword indicates which ABI the externally imported
// function would follow. In this exercise, "Rust" is used, while other variants exists like
// "C" for standard C ABI, "stdcall" for the Windows ABI.
//
// The externally imported functions are declared in the extern blocks, with a semicolon to
// mark the end of signature instead of curly braces. Some attributes can be applied to those
// function declarations to modify the linking behavior, such as #[link_name = ".."] to
// modify the actual symbol names.
//
// If you want to export your symbol to the linking environment, the `extern` keyword can
// also be marked before a function definition with the same ABI string note. The default ABI
// for Rust functions is literally "Rust", so if you want to link against pure Rust functions,
// the whole extern term can be omitted.
//
// Rust mangles symbols by default, just like C++ does. To suppress this behavior and make
// those functions addressable by name, the attribute #[no_mangle] can be applied.
//
// In this exercise, your task is to make the testcase able to call the `my_demo_function` in
// module Foo. the `my_demo_function_alias` is an alias for `my_demo_function`, so the two
// line of code in the testcase should call the same function.
//
// You should NOT modify any existing code except for adding two lines of attributes.// I AM NOT DONEextern "Rust" {fn my_demo_function(a: u32) -> u32;#[link_name = "my_demo_function"]fn my_demo_function_alias(a: u32) -> u32;
}mod Foo {#[no_mangle]// No `extern` equals `extern "Rust"`.fn my_demo_function(a: u32) -> u32 {a}
}#[cfg(test)]
mod tests {use super::*;#[test]fn test_success() {// The externally imported functions are UNSAFE by default// because of untrusted source of other languages. You may// wrap them in safe Rust APIs to ease the burden of callers.//// SAFETY: We know those functions are aliases of a safe// Rust function.unsafe {my_demo_function(123);my_demo_function_alias(456);}}
}

ok完结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/169023.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[yolo系列:YOLOV7改进-添加CoordConv,SAConv.]

文章目录 概要CoordConvSAConv 概要 CoordConv&#xff08;Coordinate Convolution&#xff09;和SAConv&#xff08;Spatial Attention Convolution&#xff09;是两种用于神经网络中的特殊卷积操作&#xff0c;用于处理图像数据或其他多维数据。以下是它们的简要介绍&#x…

【RNA structures】RNA-seq 分析: RNA转录的重构和前沿测序技术

文章目录 RNA转录重建1 先简单介绍一下测序相关技术2 Map to Genome Methods2.1 Step1 Mapping reads to the genome2.2 Step2 Deal with spliced reads2.3 Step 3 Resolve individual transcripts and their expression levels 3 Align-de-novo approaches3.1 Step 1: Generat…

2023年中国调速器产量、销量及市场规模分析[图]

调速器行业是指生产、销售和维修各种调速器设备的行业。调速器是一种能够改变机械传动系统输出转速的装置&#xff0c;通过调整输入和输出的转速比来实现转速调节的功能。 调速器行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随着工业自动化程度…

C语言代码把时间戳字符串转换成日期时间格式以及修正bug的测试方法

时间戳是一种用来表示日期和时间的数字格式&#xff0c;在不同的编程语言里时间戳的长度和单位都不一样&#xff1a; C&#xff1a;以秒为单位&#xff0c;目前的时间戳是10位数。 Python&#xff1a;以秒为单位并且有精确到7位小数的毫秒&#xff0c;目前的时间戳整数部分是…

基于springboot小区团购管理系统

基于springboot小区团购管理系统的设计与实现 摘要 小区团购管理系统是一款基于Spring Boot框架的Web应用&#xff0c;为小区居民提供了一个方便的平台&#xff0c;以协调和管理各种团购活动。该系统的主要目标是促进小区居民之间的互助合作&#xff0c;通过集中采购来降低商品…

Ubuntu 22.04 中安装 fcitx5

Ubuntu 22.04 中安装 fcitx5 可以按照以下步骤进行&#xff1a; 添加 fcitx5 的 PPA 首先&#xff0c;添加 fcitx5 的官方 PPA&#xff1a; sudo add-apt-repository ppa:fcitx-team/fcitx5更新软件包列表 sudo apt update安装 fcitx5 sudo apt install fcitx5 fcitx5-conf…

【JavaEE初阶】 CAS详解

文章目录 &#x1f332;什么是 CAS&#x1f6a9;CAS伪代码 &#x1f38b;CAS 是怎么实现的&#x1f333;CAS的应用&#x1f6a9;实现原子类&#x1f6a9;实现自旋锁 &#x1f384;CAS 的 ABA 问题&#x1f6a9;什么是 ABA 问题&#x1f6a9;ABA 问题引来的 BUG&#x1f6a9;解决…

Mac安装nginx(Homebrew)

文章目录 nginx 安装nginx 反向代理nginx 反向代理配置nginx 负载均衡配置 nginx 安装 查看需要安装 nginx 的信息 brew info nginxDocroot 默认为 /usr/local/var/www 在 /opt/homebrew/etc/nginx/nginx.conf 配置文件中默认端口被配置为8080&#xff0c;从而使 nginx 运行…

常用Win32 API的简单介绍

目录 前言&#xff1a; 控制控制台程序窗口的指令&#xff1a; system函数&#xff1a; COORD函数&#xff1a; GetStdHandle函数&#xff1a; GetConsoleCursorInfo函数&#xff1a; CONSOLE_CURSOR_INFO函数&#xff1a; SetConsoleCursorInfo函数&#xff1a; SetC…

Vue 实战项目(智慧商城项目): 完整的订单购物管理功能 内涵资源代码 基于Vant组件库 Vuex态管理 基于企业级项目开发规范

鹏鹏老师的实战开发项目 智慧商城项目 接口文档&#xff1a;安全问题&#xff08;需要私信即可&#xff09; 演示地址&#xff1a;跳转项目地址 01. 项目功能演示 1.明确功能模块 启动准备好的代码&#xff0c;演示移动端面经内容&#xff0c;明确功能模块 在这里插入图…

DevExpress WinForms甘特图组件 - 轻松集成项目管理功能到应用

DevExpress WinForms Gantt&#xff08;甘特图&#xff09;控件允许您在下一个WinForms桌面应用程序中快速合并项目规划和任务调度功能。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于…

【超参数研究02】使用随机搜索优化超参数

一、说明 在神经网络训练中&#xff0c;超参数也是需要优化的&#xff0c;然而在超参数较多&#xff08;大于3个&#xff09;后&#xff0c;如果用穷举的&#xff0c;或是通过经验约摸实现就显得费时费力&#xff0c;无论如何&#xff0c;这是需要研究、规范、整合的要点&#…

Banana Pi BPI-M4 Berry 采用全志H618芯片,板载2G RAM和8G eMMC

BPI-M4 Berry 开发板作为一款强大的单板计算机&#xff08;SBC&#xff09;&#xff0c;充分挖掘了全志 H618 系统级芯片&#xff08;SoC&#xff09;的功能&#xff0c;为开发人员提供了令人印象深刻的性能和丰富的特性。与树莓派 4b 类似&#xff0c;BPI-M4 Berry 能够展现与…

网站页脚展示备案号并在新标签页中打开超链接

备案时&#xff0c;我们就注意到&#xff0c;备案成功后需要在网站首页底部展示“备案号”&#xff0c;并将备案号链接至https://beian.miit.gov.cn。 这里我使用了WrodPress中的主题&#xff0c;主题自定义中有提供对页脚文本的编辑&#xff0c;支持用css标签定义样式。若是自…

MySQL MVCC机制探秘:数据一致性与并发处理的完美结合,助你成为数据库高手

一、前言 在分析 MVCC 的原理之前&#xff0c;我们先回顾一下 MySQL 的一些内容以及关于 MVCC 的一些简单介绍。&#xff08;注:下面没有特别说明默认 MySQL 的引擎为 InnoDB &#xff09; 1.1 数据库的并发场景 数据库并发场景有三种&#xff0c;分别是&#xff1a; 读-读…

基于springboot实现广场舞团平台系统项目【项目源码+论文说明】计算机毕业设计

基于SPRINGBOOT实现广场舞团平台系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&am…

算法通关村第十一关青铜挑战——移位运算详解

大家好&#xff0c;我是怒码少年小码。 计算机到底是怎么处理数字的&#xff1f; 数字在计算机中的表示 机器数 一个数在计算机中的二进制表示形式&#xff0c;叫做这个数的机器数。 机器数是带符号的&#xff0c;在计算机用一个数的最高位存放符号&#xff0c;正数为0&am…

Unity之ShaderGraph如何实现全息投影效果

前言 今天我们来实现一个全息投影的效果&#xff0c;如下所示&#xff1a; 主要节点 Position&#xff1a;提供对网格顶点或片段的Position 的访问&#xff0c;具体取决于节点所属图形部分的有效着色器阶段。使用Space下拉参数选择输出值的坐标空间。 Time&#xff1a;提…

C++入门(3):引用,内联函数

一、引用 1.1 引用特性 引用必须初始化 一个变量可以有多个引用 引用一旦引用一个实体&#xff0c;就不能引用其他实体 int main() {int a 10, C 20;int& b a;b c; // 赋值&#xff1f;还是b变成c的别名&#xff1f;return 0; }1.2 常引用 引用权限可以平移或缩小…

ubuntu双系统安装以及启动时卡死解决办法

目录 一.简介 二.安装 如何安装Ubuntu20.04(详细图文教程-CSDN博客 Ubuntu22.04&#xff08;非虚拟机&#xff09;安装教程&#xff08;2023最新最详细&#xff09;-CSDN博客 三.ubuntu双系统启动时卡死解决办法&#xff08;在ubuntu16.04和18.04测试无误&#xff09; 问题…