![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c语言
文章平均质量分 63
David_xtd
这个作者很懒,什么都没留下…
展开
-
使用Jlink的RTT Viewer实现串口打印输出数据功能
问题提出:自从Keil MDK的编译器从AC5更新到AC6之后,原先使用的ITM串口输出方式编译时总提示错误,因为结构替__FILE需要重新定义;而目前又没有找到合适的让AC6编译通过的办法。无奈之下,寻找能替代ITM串口输出的办法,还真找到了,就是RTT Viewer方式的串口输出。问题解答:ITM方式串口输出,使用了MCU的SWO(Serial Wire Output)引脚,RTT方式串口输出,不需要通过SWO引脚,即可实现printf输出,而且性能(耗时)远远高于ITM方式。如上图所原创 2021-01-29 21:08:12 · 2569 阅读 · 2 评论 -
c语言中字符串比较易错的地方
问题:源代码由C++代码转化而来,所以对于C风格字符串的比较,仍然使用C++中比较C风格字符串的方式char* pstr = "enable";if (pstr == "enable") { PerformTask();}但在程序运行的时候,发现PerformTask()始终没有被调用到。解决办法:1. 在C++中,问题中所用的字符串比较方式是可行的。原创 2013-11-09 11:00:28 · 13369 阅读 · 3 评论 -
使用c99编译出warning: implicit declaration of function ‘popen’
问题:ubuntu中使用gcc 4.6.3编译代码。源代码中使用了popen()和pclose()函数,当源代码没使能c99选项前,编译结果不报warnings;使能c99选项后(gcc -std=c99),编译时出现warnings:controller.c:482:5: warning: implicit declaration of function ‘popen’ [-Wi原创 2013-11-03 13:23:05 · 14846 阅读 · 0 评论 -
C文件操作函数
一、标准文件的读写 1.文件的打开fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开转载 2013-11-16 13:20:16 · 1182 阅读 · 0 评论 -
可变参数宏
原文地址:http://www.upsdn.net/html/2006-08/692.html在 GNU C 中,宏可以接受可变数目的参数,就象函数一样,例如:#define pr_debug(fmt,arg...) \printk(KERN_DEBUG fmt,##arg)用可变参数宏(variadic macros)传递可变参数表你可能很熟悉在函数中使用可变转载 2012-01-05 09:12:55 · 1292 阅读 · 0 评论 -
使用#if defined()组成复杂的预编译控制指令
问题描述:想使用互斥的宏定义控制源代码中该编译哪一段代码,该如何使用预编译伪指令来控制呢?比如,对于通用型的源码来说,为了适应不同的设备配置,需要使用不同的配置文件,对于combo,使用cfg_file = "/usr/local/combo.ini";对于pdu,使用cfg_file = "/usr/local/pdu.ini";解决办法:1. 综合运用#if、#defi原创 2013-10-12 17:49:30 · 3322 阅读 · 0 评论 -
Linux下C++的通用Makefile与解析
本文给出万能Makefile的具体实现,以及对其中的关键点进行解析。所谓C++万能Makefile,即可编译链接所有的C++程序,而只需作很少的修改。号称万能Makefile,一统江湖。我对原版的Makefile做了些修改。首先揭开它的庐山真面目:##################################################### Generic makef转载 2013-09-23 17:14:35 · 3846 阅读 · 0 评论 -
内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[
一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放4.另外还有一个专门放常量的地方。- 程序结束释放转载 2013-08-28 10:30:10 · 2364 阅读 · 0 评论 -
对堆和栈区别做了很全面的分析
一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(s转载 2013-08-28 10:09:42 · 1086 阅读 · 0 评论 -
如何将C++改为C
我曾参与过公司的bpp项目,就是bluetooth print profile。由于使用了hpijs的开源包,但是是C++的。由于C++解释器比C语言解释器占用的存储空间要大500k左右。为了节省有限的存储空间,降低成本,同时也为了提高效率,将用C++语言写的源程序用C语言改写是很有必要的。 C++与C区别最大的就是C++中的类的概念和特性,将C++改为C的问题,就转换成如何将转载 2013-12-07 15:25:14 · 15387 阅读 · 3 评论 -
cgi中读写本地文件一定要将文件属性设为666
问题:用c语言写了个cgi脚本,用来读取从网页中输入的字符串,并将该字符串append到本地的一个文本文件data.txt中;cgi脚本如下,collect.c源文件:#include #include #define MAXLEN 80/* 4 for field name "data", 1 for "=" */#define EXTRA 5/* 1 for added原创 2014-01-25 12:26:47 · 5393 阅读 · 1 评论 -
C语言中获取文件大小的函数
问题:解决办法:原创 2014-05-14 20:21:13 · 9268 阅读 · 0 评论 -
Keil编译错误error: #20: identifier "XXXX" is undefined
问题:在使用Keil编译工程时,经常遇到提示identifier "XXXX"未定义的error信息。Build target 'canopen_mx_v1d61'compiling main.c...../Src/main.c(104): warning: #223-D: function "setNodeId" declared implicitly setNodeId(...原创 2019-03-15 11:29:10 · 71110 阅读 · 1 评论 -
CanOpen协议【CanFestival】移植方法 支持VC、QT、STM32
转自:CANOpen协议【CANFestival】移植方法前段时间学习了CanOpen协议,到网上下载的CanFestival3-10源码,移植到VC、QT、STM32等平台,由于网上的资源较少,走了不少弯路,移植好使用过程中才逐渐暴露出各种问题,比如OD字符串传输、心跳时间不准确等等,现在已经解决了遇到的所有问题,移植出来的工程能够完好支持CanOpen协议,花了点时间,整理出一个简单易用的移...转载 2019-03-14 20:24:51 · 1744 阅读 · 0 评论 -
Error: L6200E: Symbol xxx multiply defined (by adc_1.o and adc.o)的解决办法
问题:Keil MDK-ARM V5的工程,使用HAL库搭建的。HAL库从STM32Cube FW_F1 V1.6.1升级到STM32Cube FW_F1 V1.7.0,重新编译工程后提示有102条错误,而原来的工程是能正确运行的。解决办法:错误信息提示如下:linking...stm32_uart_mx\stm32_uart_mx.axf: Error: L6200E: S...原创 2018-11-28 16:22:26 · 46161 阅读 · 4 评论 -
sublime打开c文件加后缀dump的解决办法
1. 问题:新装了Sublime Text 3,安装好各种插件后,打开c源码文件时,总带有一个后缀.dump,增加了文件名的长度,在打开多个c文件时,不容易分清不同的文件。2. 解决办法:知乎上给出的解决办法是:解决的方法,需要卸载掉GBK Encoding support插件下载ConvertToUTF8插件解决,OK使用Remove Package功能,删除已安装的包含“GTK...原创 2018-10-04 10:14:26 · 1669 阅读 · 0 评论 -
Sublime text 3打开C代码经常是tabsize为2的解决办法
问题: 使用Sublime text 3.1.1打开c源代码,会看到右下角的Spaces: 2的提示, 而实际上是设定为tab_size为4的, 解决办法: 1、原因在于设定中还有一项“detect_indentation”, 该项设定为true了, 正是因为“detect_indentation”被设定为true, 所以导致tab_size设定为4没起作用, subl...原创 2018-09-17 11:49:09 · 762 阅读 · 0 评论 -
C++中的数学函数汇总
math.h 数学函数库,一些数学计算的公式的具体实现是放在math.h里,具体有:1 三角函数double sin (double);double cos (double);double tan (double);2 反三角函数double asin (double); 结果介于[-PI/2, PI/2]double acos (double); 结果介于[0, PI]double atan转载 2014-09-02 10:55:57 · 1159 阅读 · 0 评论 -
stat()—获取文件状态
相关函数:fstat, lstat, chmod, chown, readlink, utime头文件:#include #include 定义函数:int stat(const char * file_name, struct stat *buf);函数说明:stat()用来将参数file_name 所指的文件状态, 复制到参数buf 所指的结构中。下面是s转载 2014-05-14 19:54:57 · 17992 阅读 · 0 评论 -
warning: unknown conversion type character 0x9 in format
问题:解决办法:原创 2014-05-17 16:06:49 · 13316 阅读 · 0 评论 -
应用 Valgrind 发现 Linux 程序的内存问题
简介: 如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在。有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题。掌握 valgrind 的使用以及工作原理,能够有效地定位进而避免应用开发中的内存问题。Valgrind概述体系结构Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调转载 2013-08-12 11:32:45 · 979 阅读 · 0 评论 -
常用调试工具gdb,dbx,valgrind介绍一
类UNIX下C/C++开发,代码调试比较麻烦,最原始的加跟踪调试很土,也很费时,特别是一个庞大的项目,代码行数非常大的时候调试起来非常费劲,当core dump时定位也不容易,这里介绍几个常用工具: gdb、dbx调试工具,valgrind内存检查工具(Linux) 。gdb(GNU DeBugger)是GNU的调试器,一般和gcc配搭使用。要使用GDB进行调试,编译程序时要指定-g或-ggd转载 2013-07-19 10:45:49 · 1698 阅读 · 0 评论 -
二维数组和指针的关系
二维数组和指针⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按行存储的,即先存储第一行的元素,再存储第二行的元素。当把每一行看作一个整体,即作为一个大的数组元素时,原来的二维数组也就变成一个一维数组了。而每个大数组元素对应原来二维数组中的一行,称为行数组元素,显然每个行数组元素都是一个一维数组转载 2012-02-29 13:09:02 · 5160 阅读 · 0 评论 -
c语言中可变参数的实现
(一) 写一个简单的可变参数的C函数 下面我们来探讨,如何写一个简单的可变参数的C函数。写可变参数的C函数要在程序中用到以下这些宏: void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr ); v转载 2013-03-16 22:56:16 · 1266 阅读 · 0 评论 -
snprintf()使用Warn提示:warning: format not a string literal and no format arguments
问题:使用snprintf()完成字符串的复制操作:#include #include #include #define ARR_SIZE(a) (sizeof((a))/sizeof((a)[0]))#define LEN_BUF 5int main(){ char buf[] = "0123456789"; char buf1[LEN_BUF]; cha原创 2013-03-29 13:59:05 · 18499 阅读 · 0 评论 -
常见面试题:重写strcpy() 函数原型
已知strcpy函数的原型是char* strcpy(char* strDest,const char* strSrc);1.不调用库函数,实现strcpy函数2.解释为什么要返回char*;1.strcpy的实现代码char* strcpy(char* strDest,const char* strSrc){ if((strDest == NULL) || (strS转载 2012-12-04 10:14:04 · 1858 阅读 · 1 评论 -
snprintf()函数使用方法
众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf.自从snprintf代替了sprintf,相信大家对snprintf的使用都不会少,函数定义如下:int snprintf(char*str, size_t size,constchar*format, ...);函数说明:最多从源串中拷贝size-1个字符到目转载 2011-12-31 14:21:52 · 1510 阅读 · 0 评论 -
字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较
问题:函数memcpy(dest, src, sizeof(dest))、strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), "%s", src)都可以将src字符串中的内容拷贝到dest字符串中。哪一种方式效率最高呢?就是说,哪种方式性能最好呢?解决办法:1. 建立三个文件test_memcp原创 2013-03-29 23:18:26 · 6386 阅读 · 5 评论 -
编译错误error: stray ‘\343’ in program的解决
问题:从网上拷贝了一段代码,粘贴到自己写的程序strcat_compare.c中,然后编译gcc -o strcat_compare strcat_compare.c;出现错误如下:avid@ubuntu:~/wrk/tmp$ gcc -o strcat_compare strcat_compare.c strcat_compare.c: In function ‘main’:原创 2013-03-28 16:07:18 · 11560 阅读 · 0 评论 -
Strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数
英文原文: http://www.gratisoft.us/todd/papers/strlcpy.html英文作者: Todd C. Miller, Theo de Raadt译者:林海枫译本地址:http://blog.csdn.net/linyt/archive/2009/07/27/4383328.aspx注:本译文版权由译者所拥有,欢迎转载,但请注明译转载 2013-03-30 15:45:06 · 1060 阅读 · 0 评论 -
C51存储器类型与51单片机的物理区域
1、 data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。2、 data区内最好放局部变量。因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;3、 确保你的程序中没有未调用的函数。在Keil C里遇转载 2012-12-12 12:53:36 · 1524 阅读 · 0 评论 -
文件编译时出现multiple definition of `xxxxxx'的解决办法
问题:原来有单个文件tcpclient.c,运行gcc -o tcpclient tcpclient.c可以顺利完成编译,并能与下载到目标板中的tcpserver成功通讯;现在把tcpclient.c中的底层通讯部分抽取出来,单独放到一个文件中nettrans.c中,并有netrans.h作为头文件;然后,使用命令gcc -o tcpclient nettrans.c tcpc原创 2012-07-26 18:17:15 · 36981 阅读 · 1 评论 -
c语言switch中break语句的作用
问题:break在for循环、while循环等循环流程控制中起的作用是停止执行break后面的语句,跳出本次循环,并跳出该循环控制体;在switch条件选择中,没有了循环控制,break又起什么作用呢?解决办法:1. switch语句的执行流程是:首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个ca原创 2012-09-12 13:44:23 · 7089 阅读 · 2 评论 -
C语言中time函数获取系统时间
可以通过time()函数来获得计算机系统当前的日历时间(Calendar Time),处理日期时间的函数都是以本函数的返回值为基础进行运算。其原型为:time_t time(time_t * t);如果你已经声明了参数t,你可以从参数t返回现在的日历时间,同时也可以通过返回值返回现在的日历时间,即从一个时间点(例如:1970年1月1日0时0分0秒)到现在此时的秒数。如果参数为空(N转载 2013-07-24 17:29:35 · 1685 阅读 · 0 评论 -
C++中的struct
问题:C语言中有struct自定义结构体类型;C++中也有struct类型,而且,与C++中面向对象主要的数据类型class还极为相似。那么,C++中struct和class之间有什么区别,什么情况下使用struct呢?解决办法:从C++语言设计者Bjarne Stroustrup的大作《C++编程语言(特别版)》中归纳C++中struct和class的区别,有以下几点:原创 2013-07-06 16:00:35 · 5951 阅读 · 0 评论 -
printf格式控制符的完整格式
printf的格式控制的完整格式:% - 0 m.n l或h 格式字符下面对组成格式说明的各项加以说明:①%:表示格式说明的起始符号,不可缺少。②-:有-表示左对齐输出,如省略表示右对齐输出。③0:有0表示指定空位填0,如省略表示指定空位不填。④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精转载 2012-08-11 15:25:20 · 1081 阅读 · 0 评论 -
关于Windows与Linux下32位与64位开发中的数据类型长度的一点汇总
32位与64位的数据类型长度是不一样的,而且windows和linux也有些许区别,下面把64位下的数据长度列表如下(无符号unsigned和有符号的长度一样): linux64 windows64 linux32 windows32char 8转载 2013-07-04 10:36:44 · 3589 阅读 · 0 评论 -
C/C++中判断某一文件或目录是否存在
C/C++中判断某一文件或目录是否存在 1.C++很简单的一种办法:#include iostream>#include fstream>using namespace std;#define FILENAME "stat.dat"int main(){ fstream _file; _file.open(FILENAME,i转载 2013-06-27 16:12:15 · 3434 阅读 · 0 评论 -
Could not acquire hardware tool communications resources: ICD3PlatformTool SN#
问题:win7环境下,使用MaplabX IDE 1.70,某一天象平常一样打算用ICD 3将代码加载到开发板中进行调试,意外碰到如下错误:LaunchingCould not acquire hardware tool communications resources: ICD3PlatformTool SN#JIT110837830The debugger could not原创 2013-06-04 14:48:30 · 8138 阅读 · 0 评论 -
循环语句中break和continue的区别
顾名思义,break,有“打破(僵局),结束(困难,不利局面),断绝(联系)”等意思,所以引申为“从break处跳出总循环,结束本次循环,不执行本次循环中break之后的语句,且结束该循环控制体”而continue,意思是“(中断后)继续”,所以引申为“从continue处结束本次循环,中止本次循环,不执行本次循环中continue之后的语句,但(中止后)没有跳出该循环原创 2012-02-28 13:37:55 · 11937 阅读 · 0 评论