编程开发
文章平均质量分 65
牧羊女说
有马甲线的女程序猿、攻城狮、加班狗~
展开
-
pyx文件在Python中的应用
简单示例说明pyx文件在python中的使用。原创 2024-04-03 16:10:41 · 1931 阅读 · 1 评论 -
Windows动态链接库的生成和使用
Windows上编译并调用C++动态链接库的方法。原创 2023-06-03 19:09:11 · 2331 阅读 · 0 评论 -
C++使用filesystem的directory_iterator遍历文件
使用filesystem实现指定目录的文件遍历。原创 2023-05-17 17:48:53 · 6270 阅读 · 0 评论 -
Ubuntu系统为程序创建桌面快捷方式
Ubuntu为程序创建桌面快捷方式的方法原创 2023-02-15 10:43:03 · 3009 阅读 · 0 评论 -
C4996 ‘localtime‘: This function or variable may be unsafe.
解决C4996 localtime错误的方法。原创 2022-10-21 12:02:23 · 3762 阅读 · 0 评论 -
C++可变参数模板初探
可变参数模板的基本使用方法。原创 2022-09-28 10:40:10 · 486 阅读 · 0 评论 -
通过jsoncpp读取JSON文件
jsoncpp读取JSON文件的基本方法。原创 2022-09-20 18:14:24 · 2466 阅读 · 0 评论 -
在Ubuntu上安装LibRaw
在Utuntu上通过源码安装LibRaw时出现的问题及解决方法。原创 2022-08-23 17:12:55 · 1411 阅读 · 2 评论 -
Python调用C/C++动态链接库
Python调用C库的方法原创 2022-07-16 19:27:34 · 5661 阅读 · 0 评论 -
cppcms读取multipart/form-data
前段时间研究了一下怎样通过cppcms框架读取multipart/form-data类型的请求,由于网上资料较少,只能花了一些时间阅读源代码,了解了基本的使用方法,写个小例子测试一下。该例子中涉及到的请求数据包括:一般的string、浮点型数组、图像数据,其中,浮点型数组也是以字符串形式传输,图像数据则是以文件形式传输。字符串传输的数组数据,需要还原成原始的浮点型数组,本例中是自己写的字符串解析函数实现,也可以通过其他方式实现,比如转成JSON格式等。/* 定义一个服务类,用于接收和处理HTTP.原创 2021-05-15 16:39:44 · 424 阅读 · 0 评论 -
Lua可变参数函数的使用
随着对Lua使用的增加,开始关注很多该语言的细节,例如,怎样向Lua函数传递不同种类、不同数量的参数,怎样返回多种参数等等。今天主要介绍Lua函数的基本用法,包括可变参数的使用。1. Lua函数格式Lua函数定义格式如下:optional_function_scope function function_name( argument1, argument2, argument3..., argumentn) function_body return result_params_原创 2021-03-28 19:15:39 · 2203 阅读 · 0 评论 -
C++向Lua传递二维数组或向量
刚刚整理了C++向Lua通过表的方式传递一维数组或向量,这篇继续补充C++如何通过表的方式向Lua传递二维数组或向量。在上例程之前,先介绍一下关键函数lua_settable()的工作机理:void lua_settable (lua_State *L, int index);英文释义:Does the equivalent tot[k] = v, wheretis the value at the given index,vis the value at the top of th...原创 2021-05-26 14:48:15 · 1034 阅读 · 2 评论 -
C++向Lua传递数组或向量
最近研究如何通过C++将数组或向量数据压入Lua栈,然后通过Lua对数组或向量进行处理之后,返回处理结果给C++。使用Userdata当然是一种选择,但是需要在C++中为Lua定义操作Userdata的接口,比较麻烦。最后还是决定用Lua Table来实现。在Lua中,table是一种很强大的存在,可以用来处理数组、向量、字典等常用数据结构,并且可以使用nil之外的任意类型的值做索引,且可根据需要动态扩容。前面的文章已经分享了如何通过C++遍历Lua表中的数据进行处理:lua_next()函数遍历l原创 2021-05-26 10:57:52 · 1951 阅读 · 0 评论 -
lua_next()函数遍历lua表
最近研究了一下通过lua_next()函数获取Lua表内容的实现过程,记录一下:先贴一段从网上看到的lua_next()工作过程,大致如下:lua_next() 函数的工作过程是:1) 先从栈顶弹出一个 key;2) 从栈指定位置的 table 里获取下一对 key-value,然后将 key 入栈,再将 value 入栈;3) 如果第 2 步成功则返回非 0 值,否则返回 0,并且不向栈中压入任何值。第一遍看这个过程有点云里雾里,于是写了一个例程来验证。该例程有两个功能,分别读取一.原创 2021-05-12 21:41:59 · 2038 阅读 · 0 评论 -
Lua操作C语言用户自定义类型数据Userdata I
前面的文章分享了通过Lua操作整数、浮点数、字符串、布尔型、表等数据结构,使用起来非常方便,如果可以通过Lua操作用户自定义的数据类型,那么就可以极大扩展脚本的能力,可以在不改变系统核心模块的基础上(即无需修改核心代码,无需编译已上线系统),丰富系统的功能。Lua的C API已经为我们开放了这样的接口,即用户数据Userdata。userdata可以用来存储任何类型的数据,而没有预定义的操作,对数据的操作需要用户自定义。函数lua_newuserdata()用来分配一块指定大小的内存区域,然后将相应原创 2021-06-22 20:52:17 · 1123 阅读 · 2 评论 -
C++向Lua传递多种数据类型的统一接口
有时候我们需要通过C++向Lua传递包含多种类型数据的参数,但这些参数又没办法提前预知,也就是说,应用可能会有不同类型的参数,这些参数需要统一传入Lua进行处理。很显然,如果每次都要去判断每一个参数的类型,并调用不同的传递函数lua_push***,在代码上就显得拖沓冗余,并且效率低下。那么有没有办法定义一个统一的接口,能够接收常用的数据类型,并统一传给Lua呢?可以利用类的多态性实现。假如我们传递的数据类型包括int、double、bool、string,那么,让我们来定义一个基类和若干子类。原创 2021-05-27 18:53:55 · 598 阅读 · 0 评论 -
初识Renode
1. 简介Renode是Antmicro公司发布的一个开发框架,使得开发人员通过模拟物理硬件系统(包括CPU、外围设备、传感器、环境以及节点之间的有线或无线介质),加速物联网和嵌入式系统的开发。它可在PC上通过软件对嵌入式设备进行模拟,可模拟Cortex-M、Cortex-A、RISC-V和其他CPU,并可模拟外设以及各种通信总线和接口。其指令模拟器使用C语言开发,外设模拟器使用C#语言开发,测试及输出层面的内容则用python编写。Renode官网:Renodehttps://renode.io/原创 2021-09-17 14:25:52 · 3348 阅读 · 0 评论 -
C++自动打印进出函数的方法
调试的时候有个小需求,就是能自动打印程序执行过程中进出的函数名,以便定位问题。其实很好实现,利用类的构造和析构就可以实现。然后通过向类传入函数名作为打印信息,就可以自动打印进出的每个函数。...原创 2021-06-10 16:59:30 · 1743 阅读 · 0 评论 -
基于spdlog实现日志控制台输出、文件输出或控制台+文件同时输出
基于spdlog封装了一套接口,可实现控制台log输出、文件log输出,或控制台+文件同时输出,根据自己需求自由切换。亲测OK,分享一下。头文件定义基类HrgLogger和三个子类原创 2021-06-09 10:49:32 · 8810 阅读 · 19 评论 -
大小端序与端序转换
最近在做客户项目的时候,遇到了不同厂家的安防相机输出的数据大小端序不一致的情况,导致在使用同一种方式处理时,出现了错误。虽然问题已经解决,还是顺手把大小端序的知识简单梳理一下。1. 大端序和小端序的概念我们知道,计算机在存储数据时,是以字节为单位的,每个地址对应一个字节。但在现代编程语言中,使用的数据类型往往需要1、2、4、8个字节,那么就涉及到这些数据在内存中如何存储的问题。除此之外,不同位数的处理器(如16位、32位、64位)其寄存器的宽度也不同,因此也会涉及到字节顺序的问题。不同的处理器或者不原创 2021-04-17 18:27:43 · 2919 阅读 · 1 评论 -
Lua调用C++动态链接库.so
上一篇介绍了如何在C++中调用Lua函数:C++调用Lua函数本篇介绍反方向调用:通过Lua调用C++动态库中的函数。1. 例程定义一套C++函数,我们给它取名叫cpp_lib.cpp:// testlib.cpp#include <iostream>#include "cpp_lib.h"using namespace std;/* 定义C++的Average 函数 */int average(lua_State *L){ int num = lua_ge原创 2021-03-05 18:40:53 · 1478 阅读 · 0 评论 -
第一个C++调用Lua程序
Lua最大的优势就是可以和C/C++互相嵌入,为不同的项目实现提供了充分的灵活性。项目开发中,可以使用C++编写核心模块,而暴露核心接口给Lua脚本层,核心模块编译完成后无需频繁修改编译,变化部分交由Lua脚本层完成。开发者可以不再将大量精力放在开发语言本身的问题,而可以集中精力处理业务逻辑,从而极大提高业务开发的效率和门槛。今天写了一个C++程序调用Lua函数的demo,来感受一下它的魅力。在Lua脚本中定义一个函数,供C++调用,param_in是函数的参数,不限类型。function c原创 2021-03-04 18:38:59 · 370 阅读 · 1 评论 -
Ubuntu安装Lua
最近被Lua语言吸引了,当然,最重要的还是项目需要,不得不研究,哈哈。就如同某位作者说的,Lua语言用道德经里的一句形容最恰当:上善若水,水善利万物而不争。克制、简洁、轻量、可移植、可嵌入、可扩展是它的特性,作为一个胶水语言,甘心做一个配角,与C/C++良好的融合性,刚好满足我的设计目标。言归正传,本篇记录Ubuntu 18.04系统安装Lua的步骤。下载并安装:curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gztar zxf lua-5.3原创 2021-03-01 20:48:24 · 2172 阅读 · 0 评论 -
类继承中的缺省参数值
写这篇是因为发现了类继承中一个有趣的现象。我们都知道,C++类中的virtual函数是动态绑定的,那么virtual函数的缺省参数呢?想必大家对动态绑定和静态绑定都不陌生了吧?简单来说,动态绑定就是运行期决定执行的函数(或行为),静态绑定则是编译期确定的,或者声明时确定的。virtual函数是动态绑定的,而缺省参数却是静态绑定。为了说明这个问题,先看一个再简单不过的例子:#include <iostream>using namespace std;class Base{原创 2020-11-16 21:12:05 · 496 阅读 · 0 评论 -
java.lang.UnsatisfiedLinkError: Error looking up function 错误处理
写了份C++视频流录制接口给Java调用,结果出现了运行期报错:“java.lang.UnsatisfiedLinkError: Error looking up function”。跟Java的同事分析,确定原因是JNA无法读取到库文件中的正确函数名。例如,我提供的头文件如下:#ifndef __RECORDER_API_H__#define __RECORDER_API_H__#include <iostream>#include <cstring>#includ原创 2020-11-04 18:14:15 · 13582 阅读 · 13 评论 -
用cmake编译依赖ffmpeg动态库的工程
这两天碰到一个工程用cmake编译,于是简单研究了一下cmake,只看文档其实印象并不深刻,于是拿了一份之前写的推流代码来做个简单的应用,该份代码依赖OpenCV库和FFMPEG库,测试了一下,通过cmake中的find_package可以直接找到OpenCV,但找不到FFMPEG,于是找了另外一种方式实现。我的CMakeLists.txt如下:# cmake 最低版本号要求cmake_minimum_required(VERSION 2.8)#设置project nameproject(te原创 2020-10-23 21:43:18 · 7640 阅读 · 0 评论 -
C++程序改善之——将new对象的智能指针托管放在独立语句中
Scott Meyers在《Effective C++》中,对C++程序设计提出了很多良好的建议,这些建议很多都是在我们编程过程中容易忽略但又很可能导致未定义行为的细节,值得我们格外注意。本篇想记录一个关于智能指针shared_ptr作为函数输入时的推荐用法。在陈述这一原则之前,先简单说一下智能指针吧。之前抽空写了一篇智能指针auto_ptr的博客:聊聊auto_ptr。由于auto_ptr的设计并不是特别符合对象管理的一贯认知,一不小心容易掉坑里,因此编程中不太推荐使用,相对来说,shared_p原创 2020-10-16 21:05:21 · 405 阅读 · 0 评论 -
mutable关键字
今天是第一次使用mutable这个关键字。mutable是用来修饰类中的non-static成员变量,目的是为了使这些成员变量在被const关键字修饰的成员函数中使用时,可以被修改。如果不希望类成员函数修改类对象的状态,那么这个成员函数一般会被const修饰。如果我们需要在const成员函数中修改一些与类对象状态无关的成员变量,就可以用mutable来将这些成员变量修改为可变的。举个例子。在下面代码中我们定义一个类CTestBlock,在被const修饰的成员函数length_of_test()原创 2020-08-14 20:52:14 · 1027 阅读 · 0 评论 -
聊聊auto_ptr
虽然在C++11中,auto_ptr已经不推荐使用了,代之以功能类似的unique_ptr。但作为曾经的一个C++重要存在,还是来简单了解一下吧。一、auto_ptr简介auto_ptr是C++的一个类,它的设计初衷是,动态分配对象以及当对象不再需要时能够自动进行内存回收,为动态分配的对象提供异常安全。auto_ptr类定义在memory头文件中,使用时需要#include <memory>。智能指针的用法如下:auto_ptr<T> ap; // 创建名为ap的原创 2020-06-27 18:58:33 · 528 阅读 · 0 评论 -
STL容器vector、list和deque的区别
容器用得太频繁了,就开始关注效率的问题,在某些地方开始寻求替代方案。最近常用的几个容器就是vector、list和deque。vector和数组类似,拥有连续的内存空间,其起始地址是固定不变的,因此能支持很好地随机存取,也就是能像数组一样通过[]来访问其元素。vector使用动态数组的方式实现,其内部已经集成了内存管理功能(内部使用allocator类进行内存管理),包括内存的分配、释放、自动回收等,因此,可以让程序员把大部分精力放在业务本身,而不用过度关心内存管理方面的问题。当使用insert或p原创 2020-06-20 17:11:06 · 383 阅读 · 3 评论 -
如何在类中定义线程函数
在类里面定义了几个线程函数,用以访问类成员,编译的时候遇到了“error: invalid use of non-static member function”。测试代码如下:#include <iostream>#include <pthread.h>#include <unistd.h>class MyClass{public: MyCl...原创 2020-03-27 20:05:53 · 1280 阅读 · 0 评论 -
.cc与.cpp源文件混合编译
工程中包含了两个子目录,include和source,分别存放了头文件和源文件,头文件和源文件都包含多种类型,头文件包含了.h和.hpp,源文件包含了.cc和.cpp。在这种情况下,Makefile应该怎么组织呢?|——————/include/ .h .hpp||——————/source/ .cc .cpp||——————Makefile我使用了比较笨的方法,将.cc和.cpp...原创 2020-03-24 20:06:02 · 1271 阅读 · 0 评论 -
使用Makefile编译带源码路径的工程
昨天编译一个工程,Makefile放在工程目录,.cpp文件放在/source目录下,头文件.h放在/include目录下。遇到了几个问题,一番修改,终于改好,整理如下:出问题的Makefile如下:INC = -I./includeCFLAGS := -O0 -g $(INC)SOURCE = $(wildcard ./source/*.cpp)CPPFILES = $(not...原创 2020-03-24 14:13:12 · 1669 阅读 · 0 评论 -
求两个矩形之间的最小距离
正在参与的工程里有一个小功能是求两个矩形之间的最小距离。大致翻了一下OpenCV,貌似没看到现成的函数,那就自己写一个好了。一个画面中,两个矩形的几何关系大致可分为如下几种,以C1为参考,分别是:(1) 不相交,但在X或Y轴方向上有部分重合坐标,比如矩形1和2,此时,最小距离为两个矩形之间的最小平行距离或垂直距离,如图中红色箭线D12所示。(2) 不相交,在X和Y轴方向上均无重合坐标,...原创 2020-03-13 11:38:59 · 7234 阅读 · 14 评论 -
浅谈面向对象编程相对于面向过程编程的优势
最近在设计一个项目的二期方案。相对于一期过程驱动的实现,二期则更加模糊了过程的边界,需要通过分析业务的当前状态和历史状态去推理上下文,虽然硬件上相对简单了,但对于软件逻辑来说,却提出了更多挑战。所以原来偏重于面向过程风格的实现方法显得有点力不从心,是时候“面向对象”了,呵呵。我们知道,现有的编程范式主要是:面向过程编程、面向对象编程、函数式编程(也有的书上将面向过程编程用结构化编程替代)。函数...原创 2020-01-09 15:49:35 · 4540 阅读 · 0 评论 -
在软件版本号中插入编译时间和日期
手动维护软件版本号和发布时间是一件比较麻烦的事情,尤其是当大版本不变,但子版本迭代频繁的时候,常常忘记更新发布时间,导致版本管理混乱。因此,最方便的方法就是自动嵌入版本编译时间。标准C中定义了一些预定义宏,以双下划线“__”开头和结尾,中间字母全部大写。如下几种预定义宏是C中常用的几个:__FILE__ 当前源代码文件名__LINE__ 当前源代码行号__DATE...原创 2019-12-02 18:14:42 · 1717 阅读 · 1 评论 -
Linux C 实现文件复制、文件及文件夹删除功能
Linux下的文件操作其实是个很普通的小功能,Linux C提供了一些系统函数可以调用,我们使用的时候只需按照自己的需要封装一下即可。1. 文件复制实现文件从一个目录复制到另外一个目录,以下是最简单的操作,正式的工程中为了严谨起见,尽量加上错误检查。#include <stdio.h>#include <stdlib.h>//#include <st...原创 2019-11-24 20:27:21 · 894 阅读 · 1 评论 -
pkg-config的作用和用法
以前不习惯用pkg-config,喜欢在Makefile中指定程序的依赖项。但是这样做存在一个问题,即当你的机器上安装了同一名称但不同版本的依赖库时,就有可能导致链接失败。这时,pkg-config就显示了它的优势:使编译选项简洁明了。那么pkg-config是干啥的呢?按照官方说法,它用来返回已安装库的基本信息。pkg-config的参数有如下一堆,想获得更全的参数及用法,可以通过执行“...原创 2019-10-31 19:03:47 · 15695 阅读 · 1 评论 -
在Linux系统中安装nginx
最近要在Linux系统中实现推流和解码,需要安装nginx,研究了一天,终于安装成功了,记录一下。因为不通外网,所以我是直接下载源码,然后上传到服务器上,再配置并安装的。步骤如下:1. 安装OpenSSLOpenSSL是什么东东?下面是来自百度百科的一个定义:OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的...原创 2018-03-01 15:08:39 · 371 阅读 · 0 评论 -
记一次Windows向Linux的代码移植
前几天完成了一次Windows向Linux的代码移植,由于在Windows上开发时没有考虑到兼容性,所以移植的时候还是碰到了不少的问题,今天专门抽时间把问题和解决方法整理出来,作为经验,以备将来查阅。1. 包含的头文件名称大小写问题例如decode_test_utils.cpp:1:20: fatal error: StdAfx.h: No such file or directory #inc...原创 2018-03-24 16:49:18 · 2923 阅读 · 0 评论