- 博客(143)
- 收藏
- 关注
原创 CL11命令行解析使用实例
CLI11提供了您在强大的命令行解析器中所期望的所有功能,具有美观、简洁的语法,并且以单个文件的形式提供,便于包含在项目中。这很容易适用于小型项目,但功能强大,足以支持复杂的命令行项目,并且可以针对框架进行定制。本来准备使用Boost库中program_options,不过boost整个头文件就有170MB,对于小小项目来说使用成本很高,还得编译boost库,感觉不划算。CLI11功能强大可以直接包含头文件使用,对小项目很友好。本文后面讲述CLL11的使用实例。
2024-07-18 16:02:14
330
原创 Linux下编译boost1.85
Boost提供免费的同行评审的可移植C++源库。我们强调与C++标准库配合良好的库。Boost库旨在广泛使用,并可在广泛的应用程序中使用。Boost许可证鼓励所有用户以最小的限制使用Boost库。我们的目标是建立“现有实践”并提供参考实现,以便Boost库适合最终的标准化。从库技术报告(TR1)中包含的十个Boost库开始,再到自2011年以来ISO C++标准的每次发布,C++标准委员会一直将Boost作为添加标准C++库的宝贵来源。
2024-07-18 13:51:09
272
原创 Xilinx Vitis 2020工程源目录修改
Xilinx Vitis可以做standalone程序开发,不过其工程中使用的路径为绝对路径。工程更换位置后编译将会显示错误。例如:源目录为D:/work,复制到同事电脑上放到C:/work(同事电脑只有一个C盘)。利用Vitis打开工程编译会有一堆错误,提示文件找不到。可以通过手动修改以上文件是可以解决问题,不过手动修改容易出错误。更好的方式是写一脚本来做文件路径替换,这个脚本需要处理xml和json文件。Python语言内置xml和json库,是理想语言选择。
2024-07-09 14:54:45
698
原创 扫描服务器端口(Python)
如果只知道服务器的地址,不知道其提供服务端口号,可以通过扫描所有端口方式发现服务器提供哪些端口。下面使用Python编写脚本扫描服务器端口。采用单线程扫描1-65535时间比较长,可以缩小搜索范围例如(1-10000)或采样下面多线程方式。服务器有效端口1-65535。
2024-07-09 14:34:29
328
原创 Qt调用Matlab(一)
MATLAB是MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。在本文利用Qt通过C/C++来访问Matlab功能。
2024-07-05 10:55:52
830
原创 Ubuntu20.04更新GLIBC到2.35版本
Ubuntu20.04默认GLIBC库版本是2.31.今天碰到一个软件需要2.35版本的GLIBC。需要升级到2.35版本。
2024-07-03 17:02:32
859
原创 Modbus RTU协议简介及CRC算法实现
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。Modbus协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本。大多数Modbus设备通信通过串口EIA-485物理层进行。对于串行连接,存在两个变种,它们在数值数据表示不同和协议细节上略有不同。
2024-07-03 16:26:16
741
原创 Linux动态库查询路径设置(LD_LIBRARY_PATH)
Linux下动态库查询路径与Windows不同,即使动态库文件与可执行程序在相同目录下也是找不到的。请注意,修改系统级的动态库路径需要谨慎,因为这会影响到系统中所有使用动态链接器的程序。
2024-07-01 15:11:08
1138
原创 Linux CMakeLists编写之可执行程序
编译工具有很多(make/cmake/BJam)。cmake是跨平台,使用cmake编译需要编写CMakeLists.txt。本文编写CMakeLists.txt来生成C++可执行程序。
2024-07-01 14:45:57
405
原创 Linux CMakeLists编写之静态库
编译工具有很多(make/cmake/BJam)。cmake是跨平台,使用cmake编译需要编写CMakeLists.txt。本文编写CMakeLists.txt来生成C++静态库。
2024-06-27 14:38:37
388
原创 CPPTest设计分析
CppTest是一个可移植、功能强大但简单的单元测试框架,用于处理C++中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式,并且可以轻松添加新的输出格式。CppTest下载地址Github地址下面对其设计进行分析,已更好对其使用。
2024-06-27 09:41:00
891
原创 为Ubuntu18.04云服务器修改用户shell
在Ubuntu18.04的云服务器,创建一个普通账户,登录进行发现使用shell是sh而不是bash,sh对终端命令支持很不好,将用户的shell修改为bash.
2024-06-26 11:12:54
320
原创 CppTest单元测试框架(更新)
中讲述利用宏ADD_SUITE将测试用例自动增加到测试框架中。但在使用中发现一个问题,就是通过宏ADD_SUITE增加多个测试Suite时,每次运行时都是所有测试Suite都运行,有的Suite运行比较慢,这对边写测试用例边编译运行时效率很低。于是就在原来测试框架下作出修改,即默认运行所有测试用例,不过可以通过命令指定测试用例来运行
2024-06-26 10:29:03
810
原创 C++并发之环形队列(ring,queue)
最近研究了C++11的并发编程的线程/互斥/锁/条件变量,利用互斥/锁/条件变量实现一个支持多线程并发的环形队列,队列大小通过模板参数传递。环形队列是一个模板类,有两个模块参数,参数1是元素类型,参数2是队列大小,默认是10。入队操作如果队列满阻塞,出队操作如果队列为空则阻塞。
2024-06-25 16:50:26
564
原创 C++并发之阻塞队列(block,queue)
最近研究了C++11的并发编程的线程/互斥/锁/条件变量,利用互斥/锁/条件变量实现一个支持多线程并发的阻塞队列,队列大小没有限制。阻塞队列是一个模板类,有两个模块参数,参数1是元素类型,参数2是容器类型,可以是std::deque和std::list,默认是std::deque。入队操作没有阻塞,出队操作如果队列为空则阻塞。
2024-06-25 16:34:27
510
原创 C++并发之协程实例(四)(通过迭代器访问生成器序列)
协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。
2024-06-24 17:09:36
201
翻译 我的C++20协程教程
粗略地说,协程是可以相互调用但不共享堆栈的函数,因此可以在任何时候灵活地暂停执行以进入不同的协程。在C++的真正精神中,C++20协程被实现为一个埋在垃圾堆下面的漂亮的小金块,你必须费力才能访问到漂亮的部分。坦率地说,我对这个设计感到失望,因为最近的其他语言变化都做得更有品味,但遗憾的是,没有协同工作。进一步混淆协程的是,C++标准库实际上并没有提供访问协程所需的垃圾堆,所以你实际上必须滚动自己的垃圾,然后费力地浏览它。无论如何,无论如何,我会尽量把任何进一步的评论留到这篇博客文章的结尾…
2024-06-24 16:23:39
23
原创 C++并发之协程实例(三)(co_await)
协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。
2024-06-23 15:07:19
262
原创 C++并发之协程实例(二)(计算斐波那契序列)
协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。斐波那契数列是一位意大利的数学家,他闲着没事去研究兔子繁殖的过程,研究着就发现,可以写成这么一个序列:1,1,2,3,5,8,13,21…也就是每个数等于它前两个数之和。那么给你第 n 个数,问 F (n) 是多少。用数学公式表示很简单: f(n) = f(n-1) + f(n-2)
2024-06-21 12:50:27
388
翻译 C++并发之协程(Coroutines,co_await,co_yield, co_return)
协程(Coroutines )是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。
2024-06-20 10:39:58
145
原创 C++并发之协程实例(一)(coroutine, std::coroutine_handle, std::suspend_never, std::suspend_always)
协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。
2024-06-18 17:33:23
548
原创 C++并发之原子操作(std::atomic)
原子类型是封装一个值的类型,该值的访问保证不会导致数据争用,并且可以用于同步不同线程之间的内存访问。这个头文件(atomic)声明了两个C++类,atomic和atomic_flag,它们在自包含类中实现原子类型的所有特性。头文件(atomic)还声明了一整套与C中的原子支持兼容的C样式类型和函数。
2024-06-17 16:12:45
908
原创 undefined reference to `__atomic_is_lock_free‘
看来标准库std::atomic的实现,除部分在头文件实现外,还有部分在库文件中实现。
2024-06-17 15:59:00
190
原创 C++并发之Future(std::future, std::promise, std::packaged_task, std::async)
Future允许异步访问特定提供程序设置的值的功能,这可能在不同的线程中。这些提供程序(providers)中的每一个(要么是promise对象,要么是package_task对象,要么调用async)都与Future对象共享对共享状态的访问:提供程序使共享状态就绪的点与Future对象访问共享状态的点同步。
2024-06-14 18:14:41
987
原创 C++并发之条件变量(std::condition_variable)
条件变量是一个能够阻塞调用线程直到被通知恢复的对象。当调用其中一个等待函数时,它使用unique_lock(通过互斥锁)来锁定线程。线程保持阻塞状态,直到被另一个调用同一condition_variable对象上的通知函数的线程唤醒。条件变量类型的对象总是使用unique_lock来等待.
2024-06-14 18:10:15
445
原创 C++并发之锁(std::lock_guard,std::unique_lock)
锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。在构造时,互斥对象被调用线程锁定,在析构时,互斥被解锁。它是最简单的锁,作为一个具有自动持续时间的对象特别有用,该对象会持续到其上下文结束。通过这种方式,它可以保证互斥对象在抛出异常时正确解锁。但请注意,lock_guard对象不会以任何方式管理互斥对象的生存期:互斥对象的持续时间应至少延长到锁定它的lock_guad被析构为止。唯一锁是一个在锁定和未锁定两种状态下管理具有唯一所有权的互斥对象的对象。
2024-06-12 18:18:54
1175
原创 C++并发之定时互斥(std::timed_mutex)
定时互斥是一种时间可锁定的对象,它设计用于在代码的关键部分需要独占访问时发出信号,就像常规互斥一样,但还支持定时尝试锁定请求。因此,timed_mutex有两个额外的成员:try_lock_for和try_lock_until。它保证是一个标准布局类。标准布局类型是一种具有简单线性数据结构和访问控制的类型,可以很容易地用于与用其他编程语言(如C)编写的代码进行通信.
2024-06-12 17:54:42
315
原创 C++容器之概览
在C++标准库中容器是通过模板实现的数据结构,多数可以通过迭代器统一访问,如vector、list、deque、set、map等。
2024-06-05 16:56:07
946
原创 C++并发之互斥(std::mutex)
互斥锁是一个可锁定的对象,用于在代码的关键部分需要独占访问时发出信号,防止具有相同保护的其他线程同时执行并访问相同的内存位置。互斥对象提供独占所有权,不支持递归性(即,线程不应锁定其已经拥有的互斥对象)——请参阅recursive_mutex,以获取可以锁定的替代类。
2024-06-04 17:47:09
140
原创 C++并发之线程(std::thread)
类来表示执行的各个线程。执行线程是指可以在多线程环境中与其他此类序列同时执行的指令序列,同时共享相同的地址空间。初始化的线程对象表示执行的活动线程;这样的线程对象是可连接(joinable)的,并且具有唯一的线程id。默认构造(未初始化)的线程对象是不可连接的,其线程id对于所有不可连接线程都是通用的。如果移动赋值,或者对可连接线程调用join或detach,则可连接(joinable)线程将变为不可连接线程。
2024-06-04 15:47:31
428
原创 为Ubuntu18.04云服务器创建sudo用户
昨天购买了一个Ubuntu18.04的云服务器,登录进去只有root账号,新建一账号james,用james账号登录后,提示没有james主目录,进入/home目录一看,还真没有。如上所示在/etc/sudoers文件找到如上所示代码行,将%sudo修改为james保存。重新登录james就可以使用sudo命令了(输入密码为james的用户密码)。上面输入密码是james的密码,看来james密码目前不是sudo密码。通过查资料发现需要修改/etc/sudoers可以设置sudo密码。
2024-06-03 10:06:21
385
原创 C++容器之迭代器(iterator)
迭代器是指任何指向元素范围(如数组或容器)中某个元素的对象,该对象能够使用一组运算符(至少使用增量(++)和取消引用(*)运算符)在该范围的元素中进行迭代。迭代器最明显的形式是指针:指针可以指向数组中的元素,并可以使用增量运算符(++)对它们进行迭代。但是其他类型的迭代器也是可能的。例如,每个容器类型(如列表)都有一个特定的迭代器类型,用于遍历其元素。请注意,虽然指针是迭代器的一种形式,但并非所有迭代器都具有相同的指针功能;
2024-05-30 14:41:56
774
原创 C++容器之前向链表(std::forward_list)
前向列表是序列容器,允许在序列中的任何位置进行恒定时间的插入和擦除操作。前向列表被实现为单链表;单链表可以将它们所包含的每个元素存储在不同且不相关的存储位置。通过与序列中下一个元素的链接的每个元素的关联来保持排序。forward_list容器和list容器之间的主要设计区别在于,前者在内部只保留一个到下一个元素的链接,而后者为每个元素保留两个链接:一个指向下一个元件,一个指向前一个元件。这允许在两个方向上进行高效迭代,但每个元件消耗额外的存储空间,插入和删除元件的时间开销略高。
2024-05-30 14:37:11
842
原创 C++容器之队列(std::queue)
队列是一种容器适配器,专门设计用于在FIFO上下文(先进先出)中操作,其中元素被插入容器的一端并从另一端提取。队列被实现为容器适配器,容器适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。元素被推入特定容器的“后部”,并从其“前部”弹出。底层容器可以是标准容器类模板或某些其他专门设计的容器类之一。empty 是否为空size 队列大小front 队首元素back 队尾元素push_back 入队pop_front 出队。
2024-05-29 09:28:52
158
原创 C++容器之链表(std::list)
列表是序列容器,允许在序列中的任何位置进行恒定时间的插入和擦除操作,以及双向迭代。列表容器被实现为双链表;双链接列表可以将它们所包含的每个元素存储在不同且不相关的存储位置。排序是通过与每个元素的关联在内部保持的,其中链接到它前面的元素,链接到它后面的元素。它们与forward_list非常相似:主要区别在于forward_liist对象是单链表,因此它们只能向前迭代,以换取更小、更高效。
2024-05-29 09:26:14
937
原创 C++容器之栈(std::stack)
堆栈是一种容器适配器,专门设计用于在后进先出(后进先出)环境中操作,其中元素仅从容器的一端插入和提取。堆栈被实现为容器适配器,容器适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。元素是从特定容器的“后部”推/弹出的,即堆栈的顶部。底层容器可以是任何标准容器类模板或某些其他专门设计的容器类。empty 是否为空size 栈大小back 栈顶元素push_back 入栈pop_back 出栈。
2024-05-28 14:07:05
327
泰坦尼克号上乘客数据集
2024-07-09
Xilinx Vitis 2020工程源目录修改
2024-07-08
FFMPEG C++封装
2024-07-08
Qt调用Matlab实例
2024-07-03
MODBUS-RTU协议CRC算法
2024-07-03
百度翻译桌面端Windows
2024-06-27
C++11标准库中多线程测试用例
2024-06-18
libssh的C++封装源码及单元测试用例
2024-05-17
在嵌入式开发中,经常会利用命令行交互系统测试功能,本文描述使用C++语言开发的一个命令行交互系统,支持命令注册(C或C++格式)
2024-05-09
Qt实现的Kermit协议源码
2024-03-28
Qt实现的XModem和YModem协议源码
2024-03-28
FFMPEG C++封装库使用示例之初始化
2024-03-27
C++封装例程(class,struct,public,protected,private,friend)
2024-03-25
基于Qt5.12实现TFTP的Server和Client
2024-03-22
Qt显示桌面菜单,包括此电脑/库目录
2024-03-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人