CMU15-445 2022 Fall 通关记录 —— Project 0

news2024/12/24 8:56:39

Project 0

Project #0 - C++ Primer | CMU 15-445/645 :: Intro to Database Systems (Fall 2022) — 项目 #0 - C++ 入门 | CMU 15-445/645 :: 数据库系统简介(2022 年秋季)

前期准备

为完成该项目做的一些准备:

  • 创建个人项目FarewellYi/BusTub-private: My CMU 15-445 2022 Fall course homework (github.com)

  • clone到本地,并pull 2022 Fall的原BusTubcmu-db/bustub at v20221128-2022fall (github.com)

    期间遇到main和master分支不兼容的问题,于是删除已拉取的BusTub-private并重新拉取master版本;

    可以使用如下命令拉取2022Fall版本:

    git clone --branch v20221128-2022fall https://github.com/cmu-db/bustub.git
    

    但是如果按照BusTub的如下说明:

    image-20230530095035653

    相当于把本地仓库连接到远程的bustub下,本地会自动更新为最新的commit版本(大概,由于我也不是很会用git,缺点暴露);

    于是我只能重新拉取个人仓库中的2022Fall版本,就此正式开始我的通关之旅。

  • 编译BusTub环境

    期间遇到无法安装clang-14依赖的问题

    • 尝试更新软件包,并通过llvm密钥配置下载路径,但遇到众多依赖包版本不匹配的问题

    • 尝试从llvm下载二进制源码并置为环境变量,但是貌似并没有被主机识别到

    • 根据stack overflow上的某位回答,ubuntu18.04版本默认不支持clang-14,可以考虑将系统更新至20.04或者22.04版本,由于本人使用的环境是虚拟机,影响也不大,所以将系统备份后更新至20.04版本

      经验证,重启后依旧无法直接通过bustub提供的packages脚本完成所有package的依赖安装

      在Ubuntu上配置clang-14的环境_5436649486的博客-CSDN博客

      根据上面这位博主的建议,通过wget获取llvm的软件包,再按照BusTub中Readme的步骤,则不会出现依赖不匹配的问题

  • 按照BusTub Readme中的说明,build 项目,最终使用以下命令

    $ cd build
    $ make check-tests
    

    检查环境的搭建情况(虽然本意并非如此,而是检查各个模块的完成情况的)

  • 拟采用VS Code + SSH 本地虚拟机的方式完成本项目,有关如何配置VSCode,可以参考下面这篇文章

    CMU 15445 vscode/clion clang12 cmake环境配置 - 知乎 (zhihu.com)

    由于2022 Fall中要求的使用clang-14完成编译,因此我的工具选择的是下图中底部蓝框所示的clang-14;

    安装cmake后,可以使用CMakeLists.txt或者是选择底部蓝框右边的bulid完成构建,其中使用到的编译选项如图中蓝框所示,各选项的含义如下:

     /usr/bin/cmake --no-warn-unused-cli 
     -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE 
     -DCMAKE_BUILD_TYPE:STRING=Debug            		// Debug模式, Release模式Debug改Release即可
     -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/clang-12  	// 编译器路径,不指定默认gnu /usr/bin/gcc
     -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/clang++-12  // 同上 默认/usr/bin/g++
     -S/home/wxx/bustub                     			// 要构建的cmake项目根目录 
     -B/home/wxx/bustub/build                			// 构建目标目录   
     -G "Unix Makefiles"                     			// 生成器 generators
    

    image-20230530103323990

    CMake时遇到四个警告,如下图所示:

    image-20230530105044690

    且不论第一个,因为即使默认选用clang12,但是并不影响编译;后面三个警告的意思就是没有找到这些包,以下是这些包的作用:

    1. clang-format:clang-format是一个用于代码格式化的工具。它基于一组配置规则,可以自动调整源代码的排版和格式,使其符合统一的风格和标准。使用clang-format可以帮助团队在代码库中保持一致的代码风格,提高代码的可读性和维护性。
    2. clang-tidy:clang-tidy是一个静态分析工具,用于检查C++代码中的潜在问题和常见错误。它基于一系列的检查器(checks),可以对代码进行静态分析,并给出相关的警告或建议。clang-tidy可以帮助开发者发现潜在的bug、不良的编码实践和可改进的代码片段,从而提高代码质量和可靠性(强大的工具,虽然有时有种矫枉过正的感觉)。
    3. clang-apply-replacements:clang-apply-replacements是一个用于应用由clang-tidy或其他工具生成的修复建议的工具。当clang-tidy检测到问题并给出修复建议时,这些建议通常以修复补丁(replacements)的形式提供。clang-apply-replacements可以接收这些修复补丁,并将其应用到源代码文件中,实现自动修复。

    使用常规的装包命令装一下,重启窗口,这些警告就不复存在了。

  • 拟计划采用VSCode在Windows端远程虚拟机完成编码,在Ubuntu端通过CLion完成独立test的调试


本项目的main target 是使用C++17完成一个Trie类,分为以下两个部分

TASK #1:Templated Trie

可以看到源文件中给出了三个类

image-20230530110836081

说明也给的很清楚(这一点太强了,通过注释引导学生,就不会有从零开始的那种望而生畏感)。

官方文档关于如何做,一步一步写的都很清楚(一步一步坐下来只会有种爽快感)。

而且通过此次测试,才发现clang这个工具的强大。

本课的测试代码皆使用Google Test进行编写,在Clion环境中,可以进行每个Task的单元测试,如下图所示:

image-20230530200108767

原本在函数TrieNodeInsertTest前还会有一个前缀DISABLED_,删去即可测试。

在VS Code中,看网上其他人的博客,完成整个Task之后才可以进行测试,根据下图,可以看出该Task一共有五个测试单元:

image-20230530195138526

执行下面代码即可单独测试该Task:

$ cd build
$ make starter_trie_test
$ ./test/starter_trie_test

经我的实验,修改DISABLED_选项后,重新编译该测试脚本,即可完成不同单元的测试。当我完成Task1之后,关闭了最后一个ConcurrentTest1,测试结果如下:

image-20230530201236502

所以使用VSCode测试也没有那么网上其他人说的那么麻烦。

此处有一点我要说明,我在实现Trie类中的Insert函数时,说明中有一点,当插入的key对应的最后一个结点是TrieNode时,应当修改为TrieNodeWithValue,当我使用make_unique构造TrieNodeWithValue时,调用的构造函数如下所示:

TrieNodeWithValue(TrieNode &&trieNode, T value);

我一开始使用的语句是:

std::make_unique<TrieNodeWithValue<T>>(std::move((*cur).get()), value);

因为文档中有提示,说使用std:unique_prt<TrieNode>* ,即一个指向unique_ptr对象的指针,可以一定程度上避免拷贝的问题,因此上文中的cur对应一个指向unique_ptr对象的指针,解引用后则是unique_ptr对象,我起初向使用get方法获取unique_ptr管理的原对象,但是忘记了此处获取的是指针而非TrieNode,导致编译报错,理应如下:

std::make_unique<TrieNodeWithValue<T>>(std::move(*((*cur).get())), value);

这样写是没错的,但是clang-tidy会提示存在冗余,因此可以依赖clang修复为如下所示:

std::make_unique<TrieNodeWithValue<T>>(std::move(*(*cur)), value);

TASK #2:Concurrent Trie

可以使用Trie类中提供的读写锁ReaderWriterLatch latch_来完成加锁


经过语法检查(所幸平时我的代码风格就是google的风格,在clang的帮助下,也是可以即使排查出它认为的不合理之处),首次提交到gradescope后,提示错误如下图所示:

image-20230530220343029

之后所有的测试用例都是红框中所示的问题。

经过一番检查后,问题在于TrieNodeWithValue类的某个构造函数中,忘记用列表初始化构造父类TrieNode(这个错误在本地测试的时候竟然没有被检查出来)

修改后二次上传,最终百分之百通过,如下图所示:

image-20230530221755983

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

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

相关文章

【半监督医学图像分割 2023 CVPR】BCP

【半监督医学图像分割 2023 CVPR】BCP 论文题目&#xff1a;Bidirectional Copy-Paste for Semi-Supervised Medical Image Segmentation 中文题目&#xff1a;双向复制粘贴半监督医学图像分割 论文链接&#xff1a;https://arxiv.org/abs/2305.00673 论文代码&#xff1a;http…

EXCEL和VBA里的通配符和转义符

1 EXCEL里的通配符 1.1 EXCEL里常见通配符 通配符必须是英文半角的&#xff0c;中文输入下的不行&#xff01;* 可代表任意数量的字符&#xff1f; 可代表任一个的字符 1.2 使用举例 EXCEL的查找框&#xff0c;也可以使用 通配符只有部分内置函数可…

如何做架构设计?

也许您对软件设计存在一些疑惑&#xff0c;或者缺乏明确思路&#xff0c;那么本文将非常适合您。 1、设计很重要 我们可以看一下周边的事物&#xff0c;那些好的东西&#xff0c;他们并不会天然存在&#xff0c;都是被设计出来的&#xff0c;因此设计就是创造和改善事物的重要…

JavaSE03_流程控制语句

JavaSE-03 [流程控制语句] 第一章 流程控制 1.1 流程概述 在一个程序执行的过程中&#xff0c;每条语句的执行顺序对程序的结果是由直接影响的&#xff0c;也就是&#xff0c;语句的流程对运行结果有着直接的影响&#xff0c;所以&#xff0c;必须清楚知道每条语句的执行流程…

【Python】Python系列教程-- Python3 命名空间和作用域(二十九)

文章目录 前言作用域全局变量和局部变量global 和 nonlocal关键字 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&#xff09;Python系列教程–Python3 VScode&#xff08;三&#xff09…

Vue.js 中的 v-bind 和 v-on 简写

Vue.js 中的 v-bind 和 v-on 简写 在 Vue.js 中&#xff0c;v-bind 和 v-on 是两个常用的指令&#xff0c;用于绑定属性和事件。在本文中&#xff0c;我们将介绍 v-bind 和 v-on 的简写形式&#xff0c;以及如何使用它们。 v-bind 简写形式 在 Vue.js 中&#xff0c;v-bind 用…

Java 进阶—死锁造成原因及其解决

今天我们来了解一下线程死锁&#xff0c;死锁很好理解&#xff0c;从字面上来看就是锁死了&#xff0c;解不开&#xff0c;在大街上看到一对卧龙凤雏的情侣&#xff0c;怎么说&#xff0c;你们给我锁死&#xff0c;不要分开去霍霍别人 之前我们不是说过&#xff0c;解决线程安…

GoogleTest之创建Mock

目录 MOCK_METHODmock方法的访问属性mock非虚函数mock自由函数Nice/Strict/Naggymock方法简化参数mock具体类的替代方法代理给fake mock是用来模拟对象&#xff0c;隔离边界的一种测试方法&#xff0c;以便在开发阶段不需要依赖第三方或其他依赖项可以进行独立的测试。 MOCK_ME…

MySQL调优系列(六)——查询优化

一、查询慢的原因 查询速率受网络、CPU、IO、上下文切换、系统调用、生成统计信息、锁等待时间等因素影响。 举个常见面试题&#xff1a; 一个表非常非常大&#xff0c;上亿级别的数据&#xff0c;性能会变慢嘛&#xff1f;如果表有索引 答&#xff1a;增删改会变慢。&#xf…

Python可视化分析项目高分课设

今天给大家分享一个基于python的django框架结合爬虫以及数据可视化和数据库的项目&#xff0c;该项目总体来说还是挺不错的&#xff0c;下面针对这个项目做具体介绍。 1&#xff1a;项目涉及技术&#xff1a; 项目后端语言&#xff1a;python 项目页面布局展现&#xff1a;前…

数据结构--队列

文章目录 队列基础队列的实现链表实现环形数组实现tail一直加的问题容量处理 队列的使用 队列基础 queue 是以顺序的方式维护的一组数据集合 相对于链表来说&#xff0c;队列操作数据的位置是固定的只能2端操作。 在一端添加数据&#xff0c;从另一端移除数据。习惯来说&#…

高完整性系统(3):Threat Modelling

文章目录 基础安全性质保密性&#xff08;Confidentiality&#xff09;完整性&#xff08;Integrity&#xff09;可用性&#xff08;Availability&#xff09;认证&#xff08;Authentication&#xff09;不可抵赖性&#xff08;Non-repudiation&#xff09;访问控制&#xff0…

从开源软件看动态内存分配

动态内存分配 我们通常在C里面动态分配内存&#xff0c;会写出下面这样的代码&#xff1a; struct header {size_t len;unsigned char *data; }; 随后为data malloc一段内存出来&#xff0c;那么还有其他办法吗&#xff1f; 那便是弹性数组&#xff01;在阐述本节之前&#xff…

数据安全有隐患?金仓数据60秒邀你闯关破题赢奖品

数字时代 数据成为宝贵资产 数据的安全 更是关乎行业可持续发展 关乎社会的稳定和国家战略 数据库作为 数据安全的首要防线 如何纵深防御 保障数据安全合规 满足新应用新场景下的安全防护要求 金仓数据60秒 发布多个视频为您详细剖析 同时&#xff0c;小编发起“闯关挑战”活动…

【Linux】14. 文件缓冲区

1. 文件缓冲区的引出 如上现象&#xff0c;在学习完文件缓冲区之后即可解释 2. 认识缓冲区 缓冲区的本质就是内存当中的一部分&#xff0c;那么是谁向内存申请的&#xff1f; 是属于谁的&#xff1f; 为什么要存在缓冲区呢&#xff1f; 道理是如此&#xff0c;在之前的学习过…

基于matlab仿真带有飞机的虚拟场景

一、前言 此示例演示如何通过 MATLAB接口使用空间鼠标。 开始此示例后&#xff0c;带有飞机的虚拟场景将显示在 Simulink 3D 动画查看器中。您可以使用空格鼠标在场景中导航平面。通过按下设备按钮 1&#xff0c;您可以在当前平面位置放置标记。 此示例需要空间鼠标或其他兼容设…

Neuralangelo AI - 视频生成3D模型

NVIDIA Research 宣布了 Neuralangelo&#xff0c;这是一种创新的 AI 模型&#xff0c;它利用神经网络的力量从 2D 视频剪辑中重建详细的 3D 结构。 Neuralangelo 能够生成逼真的建筑物、雕塑和其他现实世界物体的虚拟复制品&#xff0c;展示了 AI 在 3D 重建领域的非凡潜力。…

十个国内可用的智能AI模型

AI语言模型&#xff0c;就是一种利用机器学习和自然语言处理技术进行文本生成的算法。其基于大量已有的语料库进行训练&#xff0c;建立出一个能够理解自然语言规律和特征的语言模型。对于输入的文本、任务和目标&#xff0c;AI语言模型可以快速生成对应的结果。 在实际应用中&…

Flume入门监控端口数据官方案例

Flume安装部署 相关地址 Flume官网地址&#xff1a;http://flume.apache.org/文档查看地址&#xff1a;http://flume.apache.org/FlumeUserGuide.html下载地址&#xff1a;http://archive.apache.org/dist/flume/ 安装 将apache-flume-1.9.0-bin.tar.gz上传到linux的/opt/s…

责任链模式的学习与使用

1、责任链模式的学习 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许你将请求沿着处理链进行传递&#xff0c;直到有一个处理者能够处理该请求。责任链模式将请求的发送者和接收者解耦&#xff0c;使多个对象都有机…