- 博客(40)
- 资源 (2)
- 收藏
- 关注
原创 C语言基础:关于编译链接的问题
作为程序员的你,是否思考过为什么一个程序的生成需要链接,链接是在链接什么。如果你也有这方面的疑惑,那么就接着往后看吧。
2024-10-30 15:10:19 635
原创 BUG调试日记20240913
我在Windows上仿真,代码1,是正常的。但是在嵌入式控制器上,执行结果就不对。为什么这样,就要分析反汇编结果了。我没有分析,有精力的小伙伴可以尝试分析下。大家看以上两段代码,理论上,执行的效果是一样的。代码2在两个系统上,执行的结果都是对的。
2024-09-13 16:43:44 172
原创 从汇编角度分析C语言中的局部变量是如何产生的
学习C语言时,我们都学过。局部变量是保存在栈里的,而且局部变量在函数返回后,无法再使用。那么我们深入的问一下,如何在保存在栈里,为什么函数返回之后,局部变量就不能用了。下面我们从汇编的角度分析一下。总的来说,定义了局部变量就需要在栈中开辟相应的空间,不管是用PUSH指令还是直接减SP指针,都是操作栈。函数返回后,局部变量不能用的问题,我们再开一篇文章讲。
2024-08-30 14:58:08 1866
原创 C和C++的混编问题
C和C++混编问题也是我在实际的开发过程中遇到的问题,由于编译器会根据源代码的后缀,自动选择C或者C++编译器。所以这个问题不小心的话,很容易忽略。本文主要讲了c和c++文件混合编译的问题。比较简单。详细的可以参考我的另一篇文章,单独讲extern "C"的。C语言基础:extern "C"语句的作用。
2024-07-29 17:00:15 269
原创 HighTec编译器如何在Hex文件中生成数据
在做嵌入式程序设计时,会有这样的需求。需要将某个变量的数据生成到Hex文件中,下面我们讨论一下这个话题。
2024-06-28 14:32:23 395
原创 C语言基础:volatile关键字的作用
我本人之前一直是写Windows程序的,最近由于公司项目的原因开始接触嵌入式程序。我发现在嵌入式程序中,volatile关键字用的很多,在写Windows程序时,我几乎没用过该关键字,只知道它是防止代码优化的。这篇文章就简要说下该关键字的作用。根据上面的描述可以看出,volatile关键字是跟代码优化息息相关的。如果没有编译器代码优化,就没有volatile关键字。但是也不要因噎废食,就不要代码优化了。代码优化的存在,可以提升代码效率,提高内存使用率等好处。做好volatile及代码优化的平衡即可。
2024-06-24 10:40:56 195
原创 C语言基础:为什么函数调用返回后,函数中定义的局部变量就不可用了?
这个问题涉及到栈空间定义、如何在栈分配空间以及释放空间、c语言如何实现函数调用。下面我们对以上问题一一说明。
2024-03-26 15:49:04 578
原创 C语言基础:Static语句的作用
在C语言的编程过程中,static语句会经常用到。本文集中讲一下static语句的使用。以上就是今天要讲的内容,本文仅仅简单介绍了static关键字在C语言中的应用,望知晓。
2024-02-29 15:29:06 374
原创 C语言基础:extern “C” 语句的作用。
对于C和C++程序员来说,extern "C"语句应该不陌生。但是该语句的具体作用,用了之后对代码有什么影响,可能会一知半解。今天就从extern “C”的出现、作用、以及配套使用场景,几个方面介绍一下。
2024-01-30 18:09:04 447
原创 C++基础7:unary_function、binary_function、not1、bind2nd函数
我在前面的文章中介绍了C++中的仿函数和函数适配器,这两个技术在STL中用的很广泛。今天我们研究下STL中的unary_function、binary_function、not1、bind2nd是如何实现的。
2023-12-13 15:31:16 339
原创 记一次愉快的BUG调试事件
灵光一闪,想到在单维彰老师的《计概16讲》中,Windows中的换行和Linux中的换行不同,Windows中是“\r\n”,而Linux中是“\n”。于是在生成脚本时,把“\r\n”换成了“\n”,再上传Linux,并执行。顺便说一下单维彰老师的《计概16讲》,讲的非常好,到目前为止我看过有3遍了,B站上就有资源。背景:项目需要在Windows上生成脚本文件,将脚本文件传到Linux系统上,并执行。BUG现象:生成的脚本无法在Linux上执行,在Windows上看着文本是正常的。
2023-11-20 10:56:41 94
原创 LabView中Double转U8数组、U8数组转Double
在LabView的实际开发项目中,免不了数据类型之间的转换。比如要用串口发送一个Double类型的变量到单片机中,这就需要将Double转成U8数组再发送。接下来我们讲一下如何进行转换。
2023-10-31 16:14:13 1138
原创 什么是串行化
如果你处在计算机行业,肯定听说过串行化这个词。串行化是计算机行业的一个术语,我之前的文章中也提到过,术语是为了方便大家沟通交流的。不要害怕陌生的术语。下面我们从宏观上介绍串行化。浅显的理解是把处于内存中的类,保存到硬盘上。当下次软件启动时,可以进行反串行化,还原类现场。这样听一起来是不是有些熟悉,这不就类似保存配置文件嘛,将软件的设置保存成XML或者INI文件,下次根据配置文件设置软件配置。其实意思是一样的。串行化除了保存配置文件外,还可以将串行化的结果,通过总线传输,在总线的另一端还原类现场。
2023-09-28 14:15:48 663
原创 C++基础6:函数重载
在C语言中我们把完成一项独立工作的代码写到一个函数里,函数包括函数名和函数体。函数名是函数的唯一ID,它要保证唯一性。如果出现重名的函数,编译器就会报重复定义的错误。当遇到函数功能相似,只有细微差别的两个函数,怎么起函数名就成了棘手的问题。起一个名字,报重复定义错误;起不一样的名字,又无法通过名字,判断函数的功能。C++的函数重载就是解决上述的问题。
2023-08-30 10:29:40 267
原创 C++基础5:模板
本文讲了C++中模板的用法,以及模板解决的什么问题。在C++中有两种编程的方式,一种是面向对象的,使用继承、接口、多态等机制;一种是面向泛型的,这种方式就是使用模板。最典型的例子就是STL(标准模板库)。我的理解,模板是一种代码生成手段。一般的代码都是程序员自己敲出来的,用模板可以让编译器为我们生成代码。给编译器一个模子,让它按照这个模子,为我们生成代码。这样说可能有点玄乎,咱们接着往下看。这一篇写了一下我理解的C++的模板,想到哪儿,我就写到哪儿,没什么章法,望各位看官,多多包涵。
2023-07-28 09:58:29 104
原创 C++基础4:函数适配器
函数适配器技术可以在不修改源代码的基础上,增加函数的功能。是对面向对象开闭原则的体现。在C++ STL中就是用了大量的函数适配器,比如not1。} }我们定义了一个仿函数类,该类很简单,就是把传入的flag,直接返回。opt(flag);} }该适配器的功能是在原有功能的基础上,取反。以上就是今天要讲的内容,函数适配器是STL很重要的一部分,遍历集合函数中的条件语句,用到了很多的函数适配器。
2023-06-28 17:44:48 941 3
原创 C++基础3:仿函数
C++的仿函数技术是基于C++的运算符重载实现的,这项技术广泛应用于STL(标准模板库)中,本篇来讲解一下该技术。简单来说,仿函数就是让一个类用起来像函数。我们都知道函数的调用格式是“函数名+()”,括号里面是形参列表。该格式典型的特征是用"()"去调用函数。那么如何才能让一个类,也具备这样的特征呢?这就需要用到C++的运算符重载技术。下面我们看实例代码。仿函数是STL的六大部件之一,与之相关的还有仿函数适配器。关于仿函数适配器,我们后续会单独出一篇文章。
2023-05-22 12:04:29 359
原创 如何用C语言实现C++的模板
前两天由于工作需要,要用C语言生成类似C++ template的效果。大致的思路我是知道的——用C语言的宏实现,但是说到细节,就不甚了解了。之前看的达内的一个老师讲STL的视频。他在视频里好像做过类似的事情。凭着对视频的记忆以及以前用C语言宏的经验,我也尝试着做了做。最后呈现的效果还不错。写个文章记录一下。
2023-04-23 09:25:39 576
原创 C++基础2:构造函数、拷贝构造函数、赋值运算符重载
C++引入类的概念后,代码的编写方式有了翻天覆地的变化。所有的操作都是针对类展开的,本系列就是对比C和C++的不同,来学习C++的基础。不但让你知其然,也要让你知其所以然。
2022-11-01 14:44:40 447
原创 C++基础 开篇
C++是一款支持面向对象的语言,最基础的变量单元是类。 类中可以包含一个或多个内建类型的变量。内建类型就是语言自带的类型,比如:char、int、float、double等。除了包含变量以外,类里面还可以写函数。这跟C语言有很大的不同。...
2022-07-09 12:33:16 1183
原创 C语言基础:变量的含义
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
2022-05-31 08:00:00 657
原创 奇葩的链接问题
前天开发的时候,遇到一个奇葩的链接问题。 其实也不算奇葩了,是我脑袋秀逗了。工程里有两个源文件:main.c 和 SCI.cppmain.c如下:extern void SCI_Init();void main(){ SCI_Init();}SCI.cpp如下:void SCI_Init(){ //SCI init code}然后我用gcc编译,gcc main.c SCI.cpp -o main提示如下的错误:main.c:(.text+0x8):undefined
2022-05-11 18:12:22 245
原创 C语言基础:弱引用
假如在main.c中有如下一段代码:#include <stdio.h>extern void do_something();void main(){ do_something(); printf("hello world.\n");}我们都知道,直接编译main.c会出现无法解析的外部符号错误或者没有定义的引用错误,如下图。因为do_something函数没有定义嘛。此时如果我把do_something的声明改成如下的样子:__attribute__((weak))
2022-05-09 12:13:35 884
原创 conflicting types for ‘DI_L_02‘
出现这种情况的原因是 不同的.h文件中,对变量的声明不同。我的一个.h的声明是extern __MP boolean_T DI_L_02;另一个.h中的声明是:extern IoAbtype DI_L_02;
2022-01-25 13:58:57 153
原创 C# TextBox获取焦点
有两种方法:1.this.ActiveControl = TextBoxName;2.this.TextBoxName.Focus();
2021-10-29 14:25:57 2967
转载 什么是值类型、引用类型?
其实理解值类型和引用类型非常简单。当我在函数里定义了一个类变量,编译器是否给该变量分配了内存。如果分配了就是值类型,如果没有分配就是引用类型。比如C++语言,(Person是个类)Person person;这样写的话,编译器实实在在在内存中做出了Person类。如下图所以C++是值类型的语言。如果是Basic语言,写如下定义。dim person as Person这样写,编译器不会分配内存空间。person只是一个指向Person类的引用,可以理解成C语言里的指针。当调用new语句时
2021-10-26 11:19:28 282
转载 什么是回调函数?
回调函数其实不是C语言特有的,其它语言也有回调函数。书上对回调函数一般的解释是 回调函数是好莱坞模式:Don’t call me,I will call you。这句话就给人带来误解,因为这句话是站在回调函数的调用方说的,我们是回调函数的提供方,所以不好理解。从回调函数的提供方来说,凡是你在代码里没有写调用语句调用的,而函数又会在某些情况下执行的函数,就叫回调函数。举个例子,我们见的最多的回调函数就是main函数。你的代码里有写main函数的调用语句吗?像这样 main();但是你一点运行,m
2021-10-20 10:13:42 178
转载 C语言基础:编译的基本单元是什么?
大家都知道一个C语言写的程序,需要进行 预编译->编译->汇编->链接,四个步骤才能生成可执行文件。今天我们挖掘一下,编译是以什么为单位进行的。所谓的编译单位,就是说我们在代码里写的#开头的指令的作用范围是多大,比如我们在写.h文件的时候,会在开头写上如下的内容:#ifndef XXXX#define XXXX…头文件内容…#endif这些内容是为了防止重复包含,导致的重复定义错误。那么#define XXXX,一句的作用范围是多大呢。 是不是在工程的一个.c文件定义了这个
2021-10-13 11:04:58 2125
原创 C语言基础:swap函数一定要传指针吗?操作变量的本质是操作内存空间。
大家在学习C语言的时候,一定遇到过经典的swap函数,它的作用是交换两个变量的值。老师讲的时候一定会说:要传变量的指针,不然不会交换两个变量的值。传值:void swap(int a,int b){int tmp;tmp = a;a = b;b = tmp;}传地址:void swap(int* a,int* b){int tmp;tmp = *a;*a = *b;*b = tmp;}可是大家有没有想过为什么传指针才能交换两个变量的值。这涉及到函数调用的知识,C语言是用栈
2021-10-12 14:55:48 1099
原创 VC中如何查看预编译的结果 .i文件
在程序的编译的整个过程中,预编译是个很重要的环节,有了预编译步骤,程序中才可以使用#开头的指令,像#include、#define、#ifndef、#ifdef等。VC中通过配置/P参数,告诉编译器输出预编译结果。 配置步骤如下:Project->Settings->C/C++然后编译工程,在工程目录下,就会生成.i后缀的文件,该类文件即为预编译后的结果。...
2021-10-11 11:45:57 1070
原创 如何在VC中调用第三方lib库(step by step)
我们以调用Kvaser的库文件为例。第三方的库一般会提供两个文件,一个是库文件、一个是头文件。Kvaser的库文件为canlib32.lib 、 头文件为canlib.h该库文件里,提供了一个名为canInitializeLibrary的函数,我们只要能调用该函数,即为调用库成功。第一步:我们在CPP文件中,添加头文件及函数调用,如下:#include “stdafx.h”#include <canlib.h>int main(int argc, char* argv[]){c
2021-10-09 10:21:51 2058
原创 error LNK2001: unresolved external symbol “int a“ (?a@@3HA)
TestStatic.obj : error LNK2001: unresolved external symbol “int a” (?a@@3HA)这个问题的根本原因是C文件里使用了变量a,但是没有地方去定义变量a。1.如果是自己定义变量,就查一下,变量在哪个C文件里定义的,把该文件包含到工程里。2.如果是库文件里定义的,要包含一下库文件。步骤如下:Project->Setting->LinkCategory选General 在Object/library modules框里,
2021-10-08 17:09:59 285
原创 error C2065: ‘_beginthread‘ : undeclared identifier
error C2065: ‘_beginthread’ : undeclared identifier首先要包含<process.h>头文件。还报错的话,设置工程参数,如下:Project -> Settings… 中 选C/C++ 的页,然后在Category中选Code Generation 然在它下面的Use run-time libaray 中选Multithreaded(或 Multithreader DLL或 Debug Multithreader DLL 或 Debug
2021-06-27 19:01:38 491 1
VB Socket编程
2015-12-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人