- 博客(405)
- 资源 (25)
- 收藏
- 关注
原创 win11安装matplotlib过程
本文介绍了在Windows 11系统上离线安装Python 3.14的matplotlib库的方法。主要内容包括:1)从PyPI或国内镜像站下载matplotlib及其依赖的whl文件;2)按顺序安装这些whl文件;3)使用pip download命令自动下载依赖文件;4)添加清华镜像源以加快下载速度。文中还列出了具体需要下载的10个依赖文件名称,并提供了两种安装方式:手动安装和自动下载安装。
2025-11-22 15:48:14
406
原创 ‘pip‘不是内部或外部命令的解决方法
文章摘要:Windows 11安装Python 3.14后出现"pip不是内部或外部命令"的解决方法。需要在系统环境变量中添加Python安装路径和Scripts路径:打开"系统信息"→"高级系统设置"→"环境变量",在"系统变量"的Path中添加Python 3.14主目录及其Scripts子目录路径,完成后即可正常使用pip命令。(150字)
2025-11-15 14:53:48
166
原创 装饰器模式(c++版)
装饰器模式是一种动态扩展对象功能的灵活设计模式。它通过组合(has-a)而非继承(is-a)的方式,解决了传统派生方法导致的类膨胀问题。当需要为对象添加新功能时,继承方式会强制创建新子类,导致代码重复和维护困难。装饰器模式则采用可叠加的独立功能模块(装饰器),这些模块可以自由组合,避免了破坏开闭原则。就像活字印刷术中的单个字模可以灵活组合一样,装饰器模式支持按需配置功能,既提高了代码复用性,又符合依赖倒置原则。
2025-10-29 22:17:59
237
原创 ubuntu20.04编译qt源码5.15.3
本文介绍了在Win7宿主机环境下使用VMware 14.1.1和Ubuntu 20.04.6系统编译安装Qt5.15.3的完整流程。主要包括:1) 安装Ubuntu 20.04.6系统;2) 离线安装必要的依赖包;3) 下载并解压Qt源码;4) 修改源码文件后配置编译选项(特别指出需跳过QML相关模块);5) 执行make编译和安装;6) 配置环境变量;7) 通过简单Qt程序验证安装成功。文中特别强调了编译选项设置、依赖包安装顺序以及解决编译错误的技巧,并提供了完整的Qt项目配置示例。整个过程在Carbon
2025-10-03 00:06:24
624
1
原创 make时设置链接器选项的2种方法
文章摘要:探讨在使用make编译时如何指定libc库路径的两种方法。方法1是在Makefile中直接写死链接器选项LDFLAGS;方法2则是在调用make命令时通过命令行参数传入LDFLAGS选项。两种方式都能实现动态链接器和rpath的指定,前者适合固定配置,后者更为灵活。
2025-09-06 14:30:57
279
原创 学习模板元编程(3)enable_if
摘要:std::enable_if是C++模板元编程的重要工具,通过SFINAE机制实现条件编译。当第一个模板参数为true时,其type成员定义为第二个模板参数类型;为false时编译失败。C++14引入的enable_if_t简化了enable_if<T>::type写法。典型应用是在模板函数中通过返回值或参数类型约束模板实例化,但《Effective C++11》建议避免将其用于函数签名。示例展示了enable_if如何根据类型特性选择不同函数重载,但最佳实践推荐使用其他方式实现模板约束。
2025-08-10 21:31:23
479
原创 学习模板元编程(2)std::true_type/false_type
本文介绍了std::true_type和std::false_type的实现原理及其在条件编译中的应用。它们是基于integral_constant模板的特化类型,用于实现编译时的条件判断。通过一个编译失败的例子展示了传统if语句的局限性,并演示了如何使用true_type/false_type通过函数重载实现编译时分支选择,避免运行时错误。文章还阐述了如何利用特化和继承实现类型特征判断(如is_bool),强调了模板匹配原则在指针类型判断中的应用。这些技术为C++模板元编程提供了重要基础。
2025-08-02 17:59:31
811
原创 学习模板元编程(1)integral_constant
本文解析了C++模板元编程中的std::integral_constant实现原理。integral_constant是一个模板类,包含静态常量value、类型别名value_type和自身类型type。重点分析了其类型转换运算符operator value_type()和函数调用运算符operator()的实现细节,解释了它们如何返回value值。文章还强调了模板参数T的限制条件(不能为浮点或类对象类型),并提供了相关技术博客的参考资料。通过源码解析,展现了integral_constant在类型萃取中的
2025-08-02 15:24:28
541
原创 类型转换运算符(conversion operator)
C++支持在结构体/类中定义类型转换运算符,分为隐式和显式两种。隐式转换通过operator T()实现,可直接赋值;显式转换需添加explicit关键字,必须强制类型转换。示例代码展示了两种转换方式:隐式转换允许ST_IC对象直接赋值给int,显式转换需要(int)强制类型转换。这种机制提供了灵活的对象类型转换能力,显式转换可避免意外的隐式转换问题。
2025-08-02 14:34:21
276
原创 CMake学习笔记(六)可以在CMake的function中修改function函数体之外的变量值吗?
本文介绍了三种在CMake中遍历子目录文件并打印内容的方法。方法1使用string(APPEND)和PARENT_SCOPE组合,将文件路径传递给父作用域;方法2利用${}变量替换和PARENT_SCOPE实现参数化文件遍历;方法3通过CACHE和FORCE将变量设为全局可访问。三种方法都能有效获取view和model子目录下的.cpp/.h文件路径,其中方法3还能使变量在项目全局范围内可用。每种方法都附有完整代码示例和详细解释,帮助理解CMake变量作用域机制。
2025-05-25 17:42:39
874
原创 使用arduino控制超声传感器HC-SR04测量距离
这里设置声速350m/s。当物体距离传感器<15cm时,测量值明显偏小,但是>=15cm时测量基本准确。超声波测距传感器HC-SR04,购自某宝,不到6元。arduino leonardo一个。
2025-05-02 19:20:34
408
原创 CMake学习笔记(五)区分PROJECT_SOURCE_DIR, CMAKE_SOURCE_DIR和CMAKE_CURRENT_SOURCE_DIR
2.2 如果子目录的CMakeLists.txt没有使用project命令,则PROJECT_SOURCE_DIR等于上一层CMakeLists.txt的PROJECT_SOURCE_DIR。不论CMakeLists在根目录还是子目录,也不论CMakeLists.txt里面有没有调用project函数,CMAKE_SOURCE_DIR都等于根目录路径。1 根目录下的CMakeLists.txt的PROJECT_SOURCE_DIR等于根目录路径;sub2目录下的CMakeLists.txt。
2025-04-26 17:28:39
616
原创 记一次表格数据排序优化(二)--std::sort + 运行模式光速排序
2 抛开排序之前的预处理遍历不谈,自写的冒泡算法在cache-miss上没有做任何考虑。std::sort在这方面可能也有所优化。沿着前面博客的思路,现在用std::sort代替自己写的冒泡算法。1 sort函数的复杂度是O(nlog(n)),而冒泡算法的复杂度是O(n^2)这里只修改了类ModelFreqDetect。在运行模式下测试,几乎没有任何卡顿。
2025-04-06 14:20:10
436
原创 记一次表格数据排序优化(一)--排序30000条数据有多卡
1 我的qt程序通过表格显示30000条数据。数据来自udp,udp每隔10秒发一次,一次含两个包。每包含有15000个数据。2 每条数据有三个属性,在表格中通过3列显示这三个属性。其中一个属性是区分“左”和“右”的。udp发送的两个包,一个包全是“左”属性,另一个包全是"右"属性。3 当用户点击三列中某一列的表头时,触发程序针对该列对应的属性进行排序。排序又分升序和降序。假如某列上一次使用升序排列,那么当用户再次点击该列表头时,该列变为降序排列。
2025-04-05 23:55:45
894
原创 MV结构下设置Qt表格的代理
所谓MV结构,是“model-view”(模型-视图)的简称。也就是说,表格的数据保存在model中,而视图由view实现。在我前面的很多博客,如我已经花了很多笔墨描述Qt表格的软件设计方法。在本篇文章中,我将介绍如何编辑表格--表格代理。
2025-01-28 16:45:50
1455
原创 第一次使用address sanitizer记录
显然,delete 释放的首地址不对,比真正的首地址偏了一字节。于是,asan报错(上图绿色文字): 1 bytes inside of 10-byte region,并指出了错误发生的位置(紫色线标出的文字):main.cpp:6即main.cpp第六行。平台:中标麒麟,gcc 4.9.3。
2024-12-15 14:36:19
196
原创 源码编译glibc2.18过程记录
在某些操作系统里,libc.so.6没有debuginfo,影响我使用valgrind/systemtap调试。为此,我决定用源码编译一个与当前已有的libc.so版本相同的libc.so.6,并附带debuginfo。以下是过程记录。
2024-12-12 18:35:49
664
原创 理解原子变量之四:可见性、memory_order_acquire与 memory_order_release
则b线程读取该原子变量后,不仅可以看到该原子变量的更新值(也就是a线程写入的值),还能看到a线程对该原子变量进行写入之前的所有其他的写操作的效果,不论是针对该原子变量的,还是针对其他变量的,也不论这些变量是不是原子变量,也不论使用何种内存序。里的实例3里面,我们看到,如果在一个线程里修改原子变量done,另一个线程读取done时,就会看到这个变化。这就是原子变量的可见性。1 a线程对某原子变量进行了写入操作,且使用了内存序memory_order_release,最重要的是红线标出的这句话。
2024-11-23 18:51:33
630
原创 理解原子变量之三:原子性与memory_order_relaxed
在一位C++大神 “高效程序员” 的公众号里,有这么一篇文章介绍原子变量《C++11开发中的Atomic原子操作》。里面有这么一段话:“...原子操作,基本都包含...三个方面...的语义:操作本身是不可分割的(Atomicity),一个线程对某个数据的操作何时对另一个线程可见(Visibility),执行的顺序是否可以被重排(Ordering)”。Atomicity翻译过来就是原子性,Visibility翻译过来就是可见性。本文在前面两篇文章的基础上,进一步讲述原子性的含义。
2024-11-23 14:55:34
421
原创 源码编译安装perf
本文介绍如何通过源码编译的方式实现perf的安装。依赖安装完毕后,make clean,然后从新make perf。7 编辑~/.bashrc,在.bashrc的PATH加入/usr/local/bin。6 make结束后,将产生的perf拷贝到/usr/local/bin。在make过程的一开始,可能会检查依赖的情况。如下图所示,这里面,9 检查perf版本,有输出则安装成功perf --version。对于中标麒麟,虚拟机,版本是linux-4.4.13。,通过elfutils安装,参考我的博客。
2024-11-14 22:08:52
1142
原创 理解原子变量之二:从volatile到内存序-进一步的认识
实例1,2,3都是在vs2013下演示的。即使遵循相同的C++标准,不同的编译器对同一个标准的贯彻程度也不一样:有的编译器严格遵循标准,既不多做,也不少做;对照实例1,在不使用volatile的情况下,子线程workerThread对done的修改,没有影响到主线程的while(!编译器意识不到子线程也在改变done的取值,所以就认为done是常量,而不会在运行到while()时读取done的实际值,于是while(!反观实例2和3,子线程修改了done,主线程的运行随之受了影响,这就是可见。
2024-11-03 11:30:09
1119
原创 理解原子变量之一:从互斥锁到原子变量,最粗浅的认识
多线程编程对于程序员来说,是一项非常重要的技能。在C++11标准问世之前,C++标准是不支持多线程的。在C++11出台前,如果你想在linux平台进行多线程编程,就要使用linux的多线程库pthread,而pthread是按照POSIX标准实现的,与C++标准无关。在C++11标准下,你可以使用std::thread,实现多线程编程。但是,多线程编程涉及的不仅仅是thread,编程者也要考虑资源竞争的情形,这就涉及到互斥锁、信号量等。这些也包含在c++11中。
2024-11-01 13:34:34
965
原创 初尝类型萃取--typename、模板偏特化、和traits之(三)类型萃取
本文作者在看过公众号《C++学习与探索》的文章《【一分钟学习C++】萃取机制》后,对类型萃取(type_traits)有了初步的认识,所以写下这篇博客。《【一分钟学习C++】萃取机制》门槛较高,如果没有理解typename和模板偏特化,是难以理解该文意思的。本文以及前面的两篇文章(初尝类型萃取--typename、模板偏特化、和traits之一、二)目的是将萃取涉及的基本知识点,如typename、模板偏特化先讲清楚,然后通过讲解例子的方式,使得类型萃取能被更多读者理解。
2024-10-17 20:32:16
1201
原创 CMake学习笔记(四)cmake --build使用踩坑记录
将在目录中产生结果文件。但是实测发现,这里有坑:如果CMakeCache.txt等文件没有产生在中的话,cmake --build 将报错。只有先在目录下执行cmake ..,使得CMakeCache.txt产生在中,cmake -build 才能起作用。编译结果最终产生在build目录下。
2024-10-10 19:39:05
3651
1
原创 如何在Android Studio中找到CMakeLists.txt的打印信息
的描述,MESSAGE函数打印的STATUS级别的信息在android studio中是看不到的。所以采用WARNING级别打印。下面使用android studio 2023.2.1打印信息。
2024-10-09 22:06:03
809
1
原创 安卓真机调试“no target device found“以及“ INSTALL_FAILED_USER_RESTRICTED“两个问题的解决办法
使用android studio 2023.2.1.23windows版本。手机为小米K70 Pro。
2024-10-03 08:46:21
2207
原创 wireshark使用要点
但是实测wireshark发现,tcp[0:X], tcp[19:X], tcp[21:X]...等过滤效果都一样。ip.addr == XXX.XXX.XXX.XXX显示消息源地址为XXX.XXX.XXX.XXX,或者消息目的地址为XXX.XXX.XXX.XXX的信息。ip.dst == XXX.XXX.XXX.XXX 只显示消息目的地址为XXX.XXX.XXX.XXX的信息。ip.src == XXX.XXX.XXX.XXX 只显示消息源地址为XXX.XXX.XXX.XXX的信息。
2024-09-25 19:02:32
753
原创 比较stl库的ostringstream与Qt的QString::arg(),QString::number()
对于stringstream,使用比较繁琐,要联合使用std::fixed和std::setprecision才能实现固定小数位数显示,qstring则要简单一些。注意,使用qstring的时候,不论使用arg还是number,format输入参数都必须是'f',不能用'g',否则可能无法获得理想的效果。考虑STL库的ostringstream或者Qt的QString::arg(), number。显示一个float或者double类型的数,要求小数点后的数字位数为定值。
2024-09-11 22:07:56
534
原创 std::map 合并
假如map2的某些键也出现在map1里面,则map1中重复的键值对不变,map2中重复的键值对无法覆盖map1。采用insert函数实现两个map的合并。
2024-09-10 17:30:42
429
原创 std::bind与std::ref配合使用时要注意的几个问题
在前面的博客,我们看到假如std::bind的输入函数的输入变量是引用类型,则我们可以在std::bind中用std::ref修饰它们。
2024-06-23 15:52:46
404
原创 浅析std::ref
根据等消息来源的描述,需要std::ref的场景主要是如下三种:假如std::thread需要调用一个函数,且这个函数的输入参数是引用的话,则std::thread对这个参数的调用必须用ref修饰。假如sid::bind需要调用一个函数,且这个函数的输入参数是引用的话,则std::bind对这个参数的调用必须用ref修饰。stl库调用,比如for_each的输入参数里也可以有一个函数指针。假如这个函数的输入参数是一个引用,则函数指针也要用std::ref修饰。下面通过几个实例来验证以上描述的真伪。
2024-06-23 15:31:13
1351
原创 CMake学习笔记(三)区分macro与function
因为macro的set(in "2")又定义了一个新的变量in,并赋值2。在执行set(in "2")之前,message("in = "${in})的内容已经被替换成message("in = 1"),所以set(in "2")对后面的语句没有影响,仍然输出1。(事实上,set(in "2")把in当成了一个新的全局变量,后面还会提到)。这也是set(in "2")起作用的原因。可见,test(1)调用时,in = 1,但是set(in "2")随后将in 改为2.所以接下来打印in = 2。
2024-04-05 18:31:35
868
原创 理解pytorch的广播语义
1 两个tensor都至少有一个维度;2 两个tensor的维度个数要么完全一样,那个维度较少的tensor可以把自己缺少的维度补充为1;3 补齐可以补充多个维度,但是只能发生在所有已有维度的左边,不能插在已有维度之间,也不能出现在已有维度右边。4 假如运算是原位运算,则保存运算结果的变量的尺寸不应在运算前后发生变化。
2024-04-04 11:07:00
1555
assimp 3.1.1的源码以及 用vs2013, vs2019分别编译产生的dll和lib(64位)
2022-04-23
定制QWidget标题栏的示例,并含有qss配置QTabWidget样式的示例
2022-04-10
mfc写入xls文件示例
2018-09-05
CVIEW显示灰度图示例
2018-11-25
基于opengl的曲线绘制示例
2018-10-15
release.rar
2020-02-27
基于qt的程序,演示了如何通过setStyleSheet配置checkbox按钮的外观。
2022-06-25
DXSDK 2010 Redistribution 32位 2010 Redistribution 64位
2022-04-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅