C/C++
iamgengyiping
I do what I do!
展开
-
switch语句中编程错误:jump to case label
问题原因:在case 0 中定义了变量b,在这个程序中,直到遇到switch的“}”右花括号,b的作用域才终结,也就是说在case 1 和 default 分支中 变量b依然是可以访问的。考虑这样一种情况,如果switch匹配了case 1,这样case 0的代码被跳过了,那么b就没有定义,如果此时在case 1的代码中访问了b,程序会崩溃的。如果谁也不匹配,执行default也会有同样的危险。1,将case 0 标记 的代码用 {}括起来,这样b的作用域在这个花括号内。在其他的case 标记中不能访问。原创 2022-12-28 18:19:31 · 2042 阅读 · 0 评论 -
c++出现double free or corruption (fasttop)
问题现象:c++代码在linux运行中,出现double free or corruption (fasttop)异常报错。问题分析:出在代码free的地方,即delete的代码段中。问题原因:delete一个代码段两次,即二次释放同一块内存。问题解决:找出代码delete和new的地方,进行加锁处理。原创 2022-11-19 18:39:48 · 2909 阅读 · 1 评论 -
volatile与指针及用途
问题现象:代码在执行过程中,突然发现内存值与预计的不同问题分析:使用共享资源的时候会被编译器优化问题解决:使用volatile修饰共享资源volatile用在如下的几个地方:1、中断服务程序中修改的供其它程序检测的变量需要加volatile;2、多任务环境下各任务间共享的标志应该加volatile;3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;volatile修饰指针一般用在共享指针上面。下面代码: uchar * vola..原创 2021-07-02 15:09:17 · 878 阅读 · 0 评论 -
VC/VC++调用C#Dll之无法声明全局或静态变量
问题现象:实际使用过程中要在C++/CLI模式下,使用VC/VC++调用C#Dll来声明全局或静态变量,但实际编译器会报全局或静态变量无法使用ref问题分析:托管对象是不能定义成全局变量来访问的问题解决:gcroot<IMyClass^>* g_pMyClass = new gcroot<IMyClass^>;void CreateMyClass(){*g_pMyClass = gcnew MyClass();// *g_pMyClass得到的是IM...原创 2021-04-08 11:07:26 · 653 阅读 · 0 评论 -
C#编译报错:名称必须是命名空间名
问题现象:C#工程使用using namespace语句,编译时报错:“名称必须是命名空间名”问题分析:引用的该名称的命名空间不存在问题原因:1、dll中该文件名是其它名称2、生成的dll中有问题问题解决:1、通过idea查看dll类名2、生成的dll中,类名添加public和构造方法...原创 2021-04-07 17:12:00 · 3694 阅读 · 0 评论 -
C#下System::String转换成C++下string
问题现象:C++调用C#生成的dll,C#的dll会返回string,在C++中使用string去接收,编译会报如下错误:错误 C2440 “初始化”: 无法从“System::String ^”转换为“std::basic_string<char,std::char_traits<char>,std::allocator<char>>” 问题分析:两者使用的string不同问题原因:C#使用的string是托管,而C++在clr模式下str...原创 2021-03-24 14:21:42 · 1053 阅读 · 0 评论 -
oneway的定义和使用
问题现象:服务的定义,与面向对象技术中定义一个接口很类似,而这些接口其实就是纯虚函数。thrift编译工具会根据服务的定义来产生相应的方法和函数。每个服务,都包括了若干个函数,每个函数包括了若干个参数和一个返回值(返回值可以是void)。问题改进:返回值为void的函数,你可以在函数名前加上oneway标识符,将此函数以异步模式执行,这样在调用此函数后,函数会立即返回。对于返回void的函数,thrift仍然会确保函数返回,这样表示这个函数被正确执行,且服务端已有返回信息了。但是如果给void的原创 2021-02-04 16:16:58 · 2315 阅读 · 0 评论 -
C/C++关于隐式转换和显示转换static_cast, dynamic_cast, const_cast探讨
首先回顾一下C++类型转换:C++类型转换分为:隐式类型转换和显式类型转换第1部分.隐式类型转换又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。intival=3;doubledval=3.14159;ival+dval;//ival被提升为double类型2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型int*...原创 2020-05-11 10:43:31 · 627 阅读 · 0 评论 -
java调用dll之JNative学习笔记,可以实现C/C++回调
1、下载地址:源码:JNative_1.4RC2_src.zip : http://jaist.dl.sourceforge.net/sourceforge/jnative/JNative_1.4RC2_src.zipJAR包:JNative.jar : http://nchc.dl.sourceforge.net/sourceforge/jnative/JNative.jar如果以上...原创 2019-12-24 13:39:38 · 239 阅读 · 0 评论 -
Keil 5不兼容Keil 4问题
问题现象:问题描述:Keil4的工程编译正常,在Keil 5下编译出现Undefined symbol问题分析:1、已经加载文件并指定路径2、确认是由于版本问题问题解决:将工具配置下的C/C++的Optimization改成不为Level 0...原创 2019-06-21 16:36:28 · 1819 阅读 · 0 评论 -
MinGW安装和使用,Windows版本
MinGW(Minimalist GNU For Windows)是个精简的Windows平台C/C++、ADA及Fortran编译器,相比Cygwin而言,体积要小很多,使用较为方便。MinGW最大的特点就是编译出来的可执行文件能够独立在Windows上运行。MinGW的组成:编译器(支持C、C++、ADA和Fortran) GNU工具 mingw-get(用于Windows平台...原创 2019-06-10 10:27:34 · 4602 阅读 · 0 评论 -
sonarqube scanner报错can not be decided as the file matches patterns of both sonar.lang.patterns.c++
1、报错如下所示:2、问题原因:默认c++扫描3、问题解决:在sonar-project.properties中添加sonar.language=c,指定使用c插件来运行原创 2019-04-18 16:40:43 · 3006 阅读 · 0 评论 -
Keil 编译器 malloc动态分配内存 C/C++
1、C代码中往往用到malloc函数,但单片机没有mmu单元,这时候需要自己手动去free,切记一定要malloc之后,用完就free或者delete掉。2、光free或者delete可能还不行,因为这可能会因此而产生碎片问题,还是需要mmu来管理内存...原创 2019-01-03 18:00:57 · 1515 阅读 · 0 评论 -
keil mdk b __main不进入C语言main函数入口
在调试的时候发现,从startup.s中逐步运行到b __main,但下一步就是不跳转到main函数,后来发现问题出现在以下两个函数:1、void _mutex_acquire(void *m) 2、void _mutex_release(void *m)为了保证malloc是线程安全的,必须重写这两个方法,保证开关中断,但千万不能在函数里加printf打印,因为这时候还没有初始化串口...原创 2018-09-17 15:14:00 · 4781 阅读 · 0 评论 -
Keil RealView MDK在链接时提示空间不够的解决方案总结 keil: Error: L6406E: No space in execution regions with
1、问题原因:程序编译后的FLASH和RAM容量大于芯片容量2、解决办法:1)在设置->Target->勾选Use microLib2)在设置->C/C++->将优化选成Level 33)如果确认是RAM超了,可以将数组更改为CONST类型4)修改链接脚本的方法有两种一种是直接修改分散加载文件,另一种是使用默认分散加载文件,这时仅需修改Project->Options->Tar原创 2017-12-18 17:42:09 · 2275 阅读 · 0 评论 -
Keil SIGABRT Abnormal termination
出现这个问题原因有如下三种:1、非法使用abort()函数。2、非法使用assert()函数。3、C++调用一个纯虚函数。原创 2017-05-31 21:14:58 · 1245 阅读 · 0 评论 -
MDK在链接时提示空间不够(No space in execution regions with .ANY selector... )的解决方案总结
RealView MDK具有强大的编译、链接功能。嵌入式设备拥有的资源往往有限,如果一个程序编译、链接之后的可执行文件大小略大于存储大小时,则不能生成可执行文件进行调试或固化到Flash中。在这种情况下我们一般不去从硬件上调整存储空间的大小(有些存储空间在片内,实在无法调整),而是去修改程序,试图将程序简化、将缓存减小、减少全局变量、少用大数组多用指针等等人工方法,有些时候这些方法很有效。但如果使原创 2016-09-23 17:46:09 · 52221 阅读 · 7 评论 -
C++类型转换分为:隐式类型转换和显式类型转换
首先回顾一下C++类型转换:C++类型转换分为:隐式类型转换和显式类型转换第1部分. 隐式类型转换又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。 int ival = 3;double dval = 3.14159;转载 2014-07-23 10:57:26 · 1323 阅读 · 0 评论 -
C++编译器会为类添加哪些成员函数
一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,如果你写 class Empty{}; 就相当于: class Empty { public: Empty(); Empty(const Empty&); ~Empty(); Empty& operator=(c原创 2014-07-25 15:00:37 · 674 阅读 · 0 评论 -
C标准预定义宏
#include int main(int argc, char *argv[]){printf(“%s\n”, __FILE__);printf(“%s\n”, __FUNCTION__);printf(“%d\n”, __LINE__);printf(“%s\n”, __DATE__);printf(“%d\n”, __STDC__);printf(“%s\n”原创 2014-08-29 14:24:08 · 468 阅读 · 0 评论 -
通过C++调用JAVA
1. JNIEnv对象 对于本地函数 JNIEXPORT void JNICALL Java_video1_TestNative_sayHello(JNIEnv * env, jobject obj) { cout } JNIEnv类型代表Java环境。通过这个JNIEnv*指针,就原创 2014-12-02 16:19:26 · 460 阅读 · 0 评论 -
JNI编程:C++回调Java函数
1、创建一个接口,如下所示:public interface原创 2014-05-22 21:00:39 · 1622 阅读 · 0 评论 -
函数指针函数名转换成内存地址调用
1、 (*(void(*) ())0)();这是《C Traps and Pitfalls》这本经典的书中的一个例子。第一步:void(*) (),可以明白这是一个函数指针类型。这个函数没有参数,没有返回值。第二步:(void(*) ())0,这是将0 强制转换为函数指针类型,0 是一个地址,也就是说一个函数存在首地址为0 的一段区域内。第三步:(*(void(*) ())0)原创 2015-03-02 15:00:24 · 1778 阅读 · 0 评论 -
volatile的作用和举例
1、作用:作为指令关键字,确保本条指令不会因为编译器的优化而省略,要求每次直接读值。举例:int a = 10;a = 5;a = 3;如果不加volatile,编译器会认为a = 3,所以上面两条指令不会产生机器代码。2、习题:1). 一个参数既可以是const还可以是volatile吗?解释为什么。2). 一个指针可以是volatile 吗?解释为什么。原创 2015-04-16 16:50:05 · 1214 阅读 · 0 评论 -
类的静态成员变量解析说明
1、说明:因为类的静态成员变量是所有实例共用的.所以得在类外初始化。调用的时候可以通过对象调用,也可以通过类直接调用。举例:class A{public: int i; //有默认值};class B{public: static int n; static A Aobj;};int B::n原创 2015-09-06 17:41:10 · 441 阅读 · 0 评论 -
C语言实现printf函数,即参数可变函数原理
我们在C语言编程中会遇到一些参数个数可变的函数,例如printf() 这个函数,它的定义是这样的: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是 可变的,例如我们可以有以下不同的调用方法: printf("%d",i); printf("%s",s); printf("the原创 2016-01-28 21:30:30 · 5101 阅读 · 3 评论 -
warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead.
Warning 1 warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 在编程过程中难免会原创 2016-04-12 22:37:06 · 2306 阅读 · 0 评论 -
C#+Win32 API程序控制鼠标的操作 解脱烦重的鼠标繁复操作
命名空间:using System.Runtime.InteropServices;在程序中添加: [DllImport("User32")]public extern static void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo); [Dll原创 2016-04-10 23:32:21 · 2932 阅读 · 0 评论 -
C语言中的数组越界
因为C语言不检查数组越界,而数组又是我们经常用的数据结构之一,所以程序中经常会遇到数组越界的情况,并且后果轻者读写数据不对,重者程序crash。下面我们来分析一下数组越界的情况:结合我的另外一篇文章 C语言的内存管理 http://blog.csdn.net/wind19/archive/2010/10/25/5964090.aspx1) 堆中的数组越界因为转载 2016-06-03 09:10:16 · 688 阅读 · 0 评论 -
#ifdef 与或 条件
今天改一段代码的时候遇到了一个小问题,代码逻辑如下:#ifndef A#endif //ifndef A 现在要加入一个条件B,实现这样一个效果:#ifndef A || ifdef B显然这样是不行的,后经人指点得出以下方法:#if (!defined A) || (defined B)...#endif原创 2016-06-26 11:09:41 · 3210 阅读 · 0 评论 -
全局变量使用技巧和注意点
1、全局变量在赋值时,需要确保原子性操作,如果不同线程中原创 2014-06-05 14:45:21 · 1604 阅读 · 0 评论