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

news2024/12/25 12:48:44

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 DONE

struct 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 DONE

extern "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.coloradmin.cn/o/1120229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大疆智图(PC):新一代高效率高精度摄影测量软件

大疆智图是一款以二维正射影像与三维模型重建为主的软件&#xff0c;同时提供二维多光谱重建、激光雷达点云处理、精细化巡检等功能。它能够将无人机采集的数据可视化&#xff0c;实时生成高精度、高质量三维模型&#xff0c;满足事故现场、工程监测、电力巡线等场景的展示与精…

42914-2023 铝合金产品断裂韧度试验方法

1 范围 本文件描述了铝合金产品断裂韧度的试验方法。 本文件适用于铝合金轧制板材、挤压棒材、挤压板材、挤压管材、挤压型材和锻件产品的平面应变断 裂韧度和平面应力断裂韧度的测定。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款…

Bootstrap的卡片组件相关知识

Bootstrap的卡片组件 01-卡片介绍及常用场合 Bootstrap的卡片组件&#xff08;Card&#xff09;是一种常用的UI元素&#xff0c;或者也可称为一种常用的结构&#xff0c;用于呈现信息和内容&#xff0c;通常在网页和应用程序中用于以下情况&#xff1a; 博客文章和新闻文章&a…

Linux自有服务与软件包管理

服务是一些特定的进程&#xff0c;自有服务就是系统开机后就自动运行的一些进程&#xff0c;一旦客户发出请求&#xff0c;这些进程就自动为他们提供服务&#xff0c;windows系统中&#xff0c;把这些自动运行的进程&#xff0c;称为"服务" 举例&#xff1a;当我们使…

经管博士科研基础【27】如何判断正定矩阵或者负定矩阵?

在【26】一章中,我们学习到可以通过判断海塞矩阵是正定矩阵或负定矩阵来判断函数的极值问题,为此,我们今天就回顾一下怎么判断海塞矩阵或者说任意一个矩阵是一个正定矩阵或者负定矩阵。 一、正定矩阵的定义 其实,我们可以看到上面的任意非零向量x可以更换为“单位向量”。…

多继承的实例介绍

一、多继承同名覆盖 子类中的成员与父类中的成员同名问题&#xff0c;通过作用域分辨符&#xff08;&#xff1a;&#xff1a;&#xff09;进行限定类的访问&#xff0c;从而实现对不同类中的同名成员各自赋值。 #include<iostream> using namespace std; class A{//父…

一起学数据结构(10)——排序

从本文开始&#xff0c;通过若干篇文章展开对于数据结构中——排序的介绍。 1. 排序的概念&#xff1a; 将一堆杂乱无章的数据&#xff0c;通过一定的规律顺序排列起来。即将一个无序序列排列成一个有序序&#xff08;由小到大或者由大到小&#xff09;的运算。 在数据的排序中…

小微企业需要认定吗?怎么认定?

小微企业在方便人民群众生活&#xff0c;解决就业&#xff0c;活跃市场经济方面发挥了巨大作用。我国对小微企业也有相应的划分标准和税收优惠政策&#xff0c;那么小微企业需要认定吗&#xff1f;认定小微企业需要哪些资料&#xff1f;下面玖邀开业小编给大家做一个简单说明。…

BUUCTF N种方法解决 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 下载附件&#xff0c;解压得到一个.exe文件 密文&#xff1a; 解题思路&#xff1a; 1、双击.exe文件&#xff0c;出现一个错误&#xff0c;切换其他的方法。 2、将KEY.exe文件放到010 Editor&#xff0c;分析这个…

Delphi : 在 SDK 管理器中添加其他 iOS 框架

在用Delphi开发IOS程序时&#xff0c;有时候需要添加其他的iOS框架&#xff0c;也就是说在默认的SDK中没有包含的iOS框架&#xff08;frameworks&#xff09;。 如果您希望利用 Delphi 提供支持之外的 iOS 框架&#xff0c;则需要在 SDK 管理器中添加框架的路径。 为此&#…

使用Python打造微信高效自动化操作教程

引言 在如今数字化时代&#xff0c;人们对于效率的追求越来越强烈&#xff0c;尤其是在工作和学习中。自动化操作成为了提高生产力的有效途径之一&#xff0c;而PyAutoGUI和Pyperclip作为Python中的两个强大库&#xff0c;为我们实现自动化操作提供了便利。本文将向大家介绍如…

抖音热搜榜:探索热门话题的奥秘

抖音热搜榜是抖音平台根据用户观看、点赞、评论、分享等行为数据&#xff0c;综合计算得出的热门话题排行榜。它反映了当前平台上最热门、最受欢迎的话题和内容。抖音热搜榜有以下几个作用和意义&#xff1a; 1. 满足用户需求&#xff1a;抖音热搜榜为用户提供了丰富的热门话题…

前端如何直接上传文件夹

前面写了一篇仿写el-upload组件&#xff0c;彻底搞懂文件上传&#xff0c;实现了选择/拖拽文件上传&#xff0c;我们经常看到一些网站支持直接选择整个文件夹上传&#xff0c;例如&#xff1a;宝塔面板、cloudflare托管、对象存储网站等等需要模拟文件路径存储文件的场景。那是…

每日刷题|贪心算法初识

食用指南&#xff1a;本文为作者刷题中认为有必要记录的题目 推荐专栏&#xff1a;每日刷题 ♈️今日夜电波&#xff1a;悬溺—葛东琪 0:34 ━━━━━━️&#x1f49f;──────── 3:17 &#x1f…

递福巴士是不是骗局呢?

递福巴士的背景介绍 递福巴士是社区服务机构软件。递福巴士是一家提供公益服务的平台&#xff0c;为社区居民提供各种服务和支持的软件。多年来&#xff0c;递福巴士一直致力于社区服务和社会公益&#xff0c;积极推动社区的发展&#xff0c;改善社区居民的生活质量。 递福巴士…

震坤行、西域和京东工业三大工业电商平台API接口详解和说明

一、震坤行 震坤行是中国领先的B2B电子商务平台之一&#xff0c;主要面向全国的制造商、供应商和采购商&#xff0c;提供物流、供应链等。万邦科技联手震坤行&#xff0c;全面拓展电商业务。电商数据API接口平台新增震坤行接口&#xff0c;可帮助客户轻松查询震坤行网站上的商…

Leetcode—34.在排序数组中查找元素的第一个和最后一个位置【中等】

2023每日刷题&#xff08;六&#xff09; Leetcode—34.在排序数组中查找元素的第一个和最后一个位置 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int lower_bound(int *arr, int numsSize, int target) {// 左闭右开区间[lef…

Windows 下载编译chromium源码

前言 本文介绍如何下载并编译chromium源码。相关前置条件可参考官方文档。 环境 &#xff1a; Windows 11VS 2022 环境设置 打开cmd&#xff0c;设置代理 set http_proxyhttp://127.0.0.1:7890 & set https_proxyhttp://127.0.0.1:7890注意&#xff1a;使用cmd命令行…

设计链表复习

设计链表 class ListNode {int val;ListNode next;public ListNode() {}public ListNode(int val) {this.val val;}public ListNode(int val, ListNode next) {this.val val;this.next next;}}class MyLinkedList {//size存储链表元素的个数int size;//虚拟头节点ListNode…

十四天学会C++之第七天:STL(标准模板库)

1. STL容器 什么是STL容器&#xff0c;为什么使用它们。向量&#xff08;vector&#xff09;&#xff1a;使用向量存储数据。列表&#xff08;list&#xff09;&#xff1a;使用列表实现双向链表。映射&#xff08;map&#xff09;&#xff1a;使用映射实现键值对存储。 什么…