
c++
h799710
这个作者很懒,什么都没留下…
展开
-
pthread_exit() 和 pthread_join()
主线程 这里通过了 void *args;获取值( *args =retval)在线程结束时 pthread_exit(retval);,相当于 return retval;主线程可以通过 args 来访问 子线程 的堆数据。原创 2022-11-14 16:13:46 · 420 阅读 · 0 评论 -
inet_ntop4源代码实现
多思考,多实践,多看源码才能找出答案。有时候网络上的答案未必靠谱。原创 2022-10-27 20:29:04 · 471 阅读 · 0 评论 -
安装protobuf(cpp版)
注:访问外网会慢,用迅雷下载再传到你的服务器也是不错的方法。将proto文件编译成 cpp文件。有打印目录就是安装成功了。test.proto文件。原创 2022-10-24 14:31:58 · 584 阅读 · 0 评论 -
版本不兼容导致的undefined reference to `google::protobuf::xxx const‘
解决方法:(以下链接都是我之前写的文章)一、卸载遗留文件,完全卸载protobuf二、安装高版本的protobuf 安装protobuf(cpp版)注:如果非要那个版本的protobuf,那就安装一个低版本的g++,然后重新编译,但是要注意设置优先级升级g++后,设置多版本优先级原创 2022-10-24 11:52:12 · 1152 阅读 · 0 评论 -
安装protobuf(cpp版)
注:访问外网会慢,用迅雷下载再传到你的服务器也是不错的方法。原创 2022-10-24 11:23:11 · 623 阅读 · 0 评论 -
真正的答案,cmake 时,/usr/bin/ld: cannot find -lpthreads问题
## **直接说答案:**1.真的不存在,重装g++/gcc2.cmake 提示问题,查看有无其他报错,没有就不用管,直接make。原创 2022-10-03 19:51:37 · 5046 阅读 · 0 评论 -
protobuf 历史版本链接
https://github.com/protocolbuffers/protobuf/releases/原创 2022-09-08 15:49:42 · 1110 阅读 · 0 评论 -
完全卸载protobuf
【代码】完全卸载protobuf。原创 2022-09-08 12:26:15 · 6889 阅读 · 0 评论 -
cmake 报错:comparison object must be invocable as const
然后在configure 和make 后指定gcc 和g++.g++ 版本兼容问题,用高版本的g++编译低版本源码会报错。用系统原有的低版本g++,或者手动下载低版本g++安装。比如我用的g++11报错, 我这里要指定用g++9.g++ 和 gcc 的位置可用 which 命令查找。具体原因c17 与 c11 在容器上的冲突。原创 2022-09-07 23:39:55 · 694 阅读 · 0 评论 -
cmake 学习笔记
cmake 学习笔记最基础语法:cmake_minimum_required (VERSION 2.8) #设定 cmake 的最低版本要求project (demo) #设定 工程名add_executable(main main.c) #生成名为main的可执行文件, main.c是文件名 如果存在多个源文件,在后面加即可,用空格隔开执行(之后的讲解就不再说执行的这步了) cmake . # 编译原创 2022-01-25 20:11:50 · 827 阅读 · 0 评论 -
sqlite3 c调用运行
一、下载源代码sqlite-amalgamation-3370200.zip二、编写调用代码这段代码其实是官网的案例,我这里稍作了改动。#include <stdio.h>#include <sqlite3.h>//#pragma comment(lib, "sqlite3.lib")// 这个是回调函数,查询成功一行就会调用一次 // argc查询了多少个列, azColName 查询的列名;argv 查询的列的值static int callback(void*原创 2022-01-17 00:15:40 · 712 阅读 · 0 评论 -
c++ 与lua交互报错:error object is not a string
显而易见:就是说你lua_tostring()获得的对象不是字符串;搜索源码可知这句报错出现在 lua.c 的 report() 函数中,函数原型如下:static int report (lua_State *L, int status) { if (status && !lua_isnil(L, -1)) { const char *msg = lua_tostring(L, -1); if (msg == NULL) msg = "(error object原创 2022-01-13 13:19:43 · 402 阅读 · 0 评论 -
lua 调用c++ dll 报错:multiple Lua VMs detected
网上说的原因是:重复加载lib 或者dll文件,导致虚拟机多开。但是经过我的多次测试,和网上答案的搜索。始终不得其解。。最后想到了一个很简单的方法,换版本!!!只要是lua5.4.x的版本就不会报错。吐槽:至于为啥报错了,目测和版本支持的函数有关,当然也不排除项目配置有问题【但是经过多次测试确实没发现问题】。夜已深,先到这了,没必要太折腾,能用就行,等后面用多了也就知道啥问题了。...原创 2022-01-12 03:04:47 · 561 阅读 · 0 评论 -
vs 2022 生成c++ dll, lua调用
前提:需要下载lua源代码,并且获取 lua.lib文件有些lua的源代码已经编译过了,附带lib文件,可直接用;如果没有,可以看这篇文章:静态库编译一、dll 项目创建及项目属性设置查看我的另一篇文章,创建及属性设置都一样。vs2022编译c 动态库,以及调用二、c++ dll 代码这里生成一个可以获取随机数的dll#include<Windows.h>#include "lua.hpp"#include<iostream>#include<time.原创 2022-01-11 11:53:33 · 2797 阅读 · 1 评论 -
lua 调用c++ dll, 提示:%1 不是有效的 Win32 应用程序。
lua 调用c++ dll, 提示:lua: error loading module ‘cppdll2’ from file ‘.\cppdll2.dll’:%1 不是有效的 Win32 应用程序。出现原因:1.lua版本错误比如你用生成dll用的lua源文件和lib 是 lua5.4的版本,但是调用lua用的是lua5.1,那绝对会报错;解决方法:重新生成 lib,dll 和 exe,用对应版本的exe执行lua代码。2.命名错误红框 1 和 3名字一定要相同!!!红框2 的 lua原创 2022-01-10 19:33:53 · 3801 阅读 · 1 评论 -
vs2022编译c 动态库,以及调用
一、编译动态库1.创建动态库项目:2.修改项目属性:2.1 修改配置类型为 动态库:2.2不使用预编译头2.3 预处理定义,在前面加上 _CRT_SECURE_NO_DEPRECATE;2.4.如果需要引入头文件,需要添加目录【这里不用】2.5 如果需要引入静态库,设置目录【这里不用】3.编写代码#include<iostream>using namespace std;//#pragma comment(lib, "file.lib") // 这个是要添加的静原创 2022-01-08 19:41:34 · 4805 阅读 · 3 评论 -
笔记:vs2022 c++调用lua
一、编译lua静态库可以看我的另一篇文章:笔记: vs2022 编译静态库二、编译c++文件(一)、创建项目创建一个控制台项目(c/c++)(二)、设置项目属性:1。创建 test.cpp 源文件2。配置属性->C/C++>预编译头->取消预编译3。配置属性->C/C+±>常规->包含附加目录 : 设置include目录【./h文件目录。别导入,没用。。】4。配置属性->C/C++>高级-> 编译为 c++代码5。配置属性->C原创 2022-01-08 01:23:38 · 1339 阅读 · 0 评论 -
笔记: vs2022 编译lua应用程序
注意:单纯笔记,略显粗糙,但绝对可以用;看不懂可以问我一、创建项目创建一个空项目二、设置属性:1。导入 *.c 文件到源文件2。配置属性->C/C+±>预编译头->取消预编译3。配置属性->C/C+±>常规->包含附加目录 : 设置include目录【./h文件目录。别导入,没用。。】4。配置属性->C/C++>高级-> 编译为 c代码5。配置属性->C/C++>预处理器 中,前面加入 _CRT_SECURE_NO_DEPRE原创 2022-01-08 00:12:08 · 1901 阅读 · 0 评论 -
笔记: vs2022 编译静态库
注意:单纯笔记,略显粗糙,但绝对可以用;看不懂可以问我一、创建项目创建一个空项目二、设置属性:1。导入 *.c 文件到源文件2。配置属性->C/C+±>预编译头->取消预编译3。配置属性->C/C+±>常规->包含附加目录 : 设置include目录【./h文件目录。别导入,没用。。】4。配置属性->C/C++>高级-> 编译为 c代码5。配置属性->C/C++>预处理器 中,前面加入 _CRT_SECURE_NO_DEPRE原创 2022-01-08 00:03:54 · 2342 阅读 · 0 评论 -
c++ 调用lua getglobal() 返回值一直=0
1.先检查加载lua脚本是否成功2.再检查调用的全局变量是否在 lua脚本上。3.最后看是不是,没有运行文件:(只加载没运行)lua_State *L = luaL_newstate();// 只加载lua原创 2022-01-07 19:39:07 · 2743 阅读 · 0 评论 -
进制转换 函数strtol() 返回值大小问题
函数声明如下:long int strtol(const char *nptr,char **endptr,int base);参数说明:nptr(需要转化的字符串的指针), endptr(不能转化的部分字符串的指针的指针), base(nptr的进制数)strtol 函数,可以将 2 -36进制的字符串转化为 long int 类型的10进制数。如果超出 long int 范围为 -2^31 ~ (2^31 -1),如果超出会溢出导致数值不对。解决: 自己写一个如,将16进制转化为10进制:原创 2021-03-29 20:16:47 · 813 阅读 · 1 评论 -
c/c++ 和 lua 负数求余的区别
通用公式:这三种语言中,求余的公式都是如下:int y = a - floor(a / b) * b // 该式 等价 int y = a % b;区别:这三种语言的 floor 函数是不一样的,正数的时候看不出来,但是负数会导致 结果有差异。c/c++ 中,floor() 函数是 向0取整的:#include <stdio.h>#include <math.h>int main(){ int a = floor(7 / -3); printf("a=%原创 2021-01-21 15:32:37 · 328 阅读 · 0 评论 -
C++动态多态详解及三个示例
多态是C++面向对象三大特性之一多态分为两类静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名动态多态: 派生类和虚函数实现运行时多态动态多态实现分三步:(代码中具体步骤用 【】标识)子类重写父类的虚函数(类内实现).父类指针指向子类对象(类外实现).用该指针调用子类虚函数(类外实现)案例一:实现代码框架是:class Basic{public: virtual void exeGame() = 0; // 纯虚函数}class TCSGame :publi原创 2021-01-14 20:01:28 · 3884 阅读 · 3 评论 -
移动零的四种实现方式(逐步优化)
今天刷的leetcode题,看似简单,但想要优化却不简单,这里记录一下我的解题过程题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/move-zeroes著作权归领扣网络所有。商业转载请联系官方授权,.原创 2020-11-19 15:34:57 · 1022 阅读 · 0 评论 -
C++ windows.h和WinSocket2.h的冲突
原因:同时两个引用重复定义宏解决方法:方法一:先引用 Winsock2.h 再引用 windows.h#include <Winsock2.h>#include<windows.h>方法二:在引用之前,加上一句代码:#define WIN32_LEAN_AND_MEAN //这句代码可以避免重复引用#include<windows.h>#include <Winsock2.h>本文参考链接:C++Socket学习笔记—— windows原创 2020-11-16 14:47:44 · 1020 阅读 · 0 评论 -
c++ vector为空,size() - 1的坑
vector的size()函数返回的是一个无符号整数,当size() == 0,再减1,会导致溢出,从而使数据变大如代码:int main(){ vector<int> arr; cout<<arr.size()<<endl; // 输出 0 cout<<arr.size() - 1<<endl; // 输出 429496729}解决方法如下:int main(){ vector<int> arr; co原创 2020-11-02 11:50:42 · 4115 阅读 · 3 评论 -
二叉树前序遍历三种方式(c++ 实现)
一.递归递归很简单,只要在调用子节点前对当前节点进行操作即可struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *l原创 2020-10-27 15:58:10 · 4510 阅读 · 0 评论 -
Morris 中序遍历(c++实现)
一.中序遍历二叉树中序遍历就是将先遍历左子树,再遍历自身,最后再遍历右子树,形成左根右的形式,用递归的方式非常简单如下:void dfs(root){ if(!root) return; dfs(root->left); // 先递归左子树 cout<<root->val<<","; //再对根节点操作 dfs(root->right); // 最后递归右子树}二.Morris 思路:1.对于一个根节点root ,找到其左子树最后一个中序遍历原创 2020-09-24 17:17:12 · 860 阅读 · 0 评论 -
见解:能用其他方式解决的不要用递归
前因:今天在刷leetcode的时候,有解码和编码字符串的题,编码拼接字符串的时候,我用来递归的方式,结果发现耗时和空间占用很恐怖,后面用循环实现,顿时快了N倍。。代码:下面是代码:// 递归实现拼接字符串 string hebing(vector <string> strs, int left, int right) { if (left == right) { return strs[left] + "LYHCode:";原创 2020-08-10 18:41:37 · 549 阅读 · 0 评论 -
c++的 ios::sync_with_stdio(false);提升效率原因
前因:c++是兼容c代码的,std :: cin和scanf 或 std :: cout和printf可以在C++代码中同时使用,但为了使输出不发生混乱,C++会用一个流缓冲区来同步C的标准流。所以iostream默认是与stdio关联在一起的,以使两者同步,因此消耗了iostream不少性能。操作:只要加上这句代码,就能关闭 同步,不需要经过流缓冲区,从而提升效率,使得std :: cin,scanf 的效率和 std :: cout,printf相差无几。 ios::sync_with_stdi原创 2020-08-07 15:15:03 · 351 阅读 · 0 评论 -
c++ new int的用法
new操作,创建一个对象并为该对象创建内存空间,最后在返回指向该内存的指针。int *a = new int(10); //创建动态创建整型数。 //括号无参数是 a=0,有参数则a = 参数int *p = new int[10]; //创建一个有10个元素的动态整型数组,没有赋值,为随机数int *p = new int10; //创建一个有10个元素的动态整型数组,并都赋值为0...原创 2020-08-04 18:54:23 · 19484 阅读 · 3 评论 -
c++ 函数vector传参
vector和数组不一样,数组本身和指针差不多,所以传进去的就是一个指针。但是vector并不如此vector传参的三种方式:void func1(vector vet); //传送数值void func2(vector &vet); //引用void func3(vector *vet); //指针这三种方式产生的效果:调用拷贝构造函数,形参改变不会影响到实参不调用拷贝构函数,形参改变影响到实参不调用拷贝构函数,形参改变影响到实参如:void func1(.原创 2020-08-04 17:55:17 · 10381 阅读 · 3 评论