
C语言
AllenSun-1990
上海先楫半导体资深FAE工程师,不定期更新HPMicro高性能MCU应用案例。
展开
-
STM32:TIM通道输入捕获
本文主要讲解如何使用TIMER通道的输入脉冲捕获功能。基于STM32F7的Timer2 Channel3来进行讲解。原创 2023-10-20 16:34:36 · 1441 阅读 · 3 评论 -
C语言:使用FILE函数实现log日志功能
本文主要通过FILE函数实现log日志记录功能。原创 2023-03-08 14:23:51 · 484 阅读 · 0 评论 -
ZYNQ7020:PS控制PL动态调整PWM占空比
ZYNQ7020芯片要发挥双处理器的协同作用,就要PS通过AXI总线来动态控制PL。要实现这个功能,就要创建一个IP核,PS端通过对寄存器地址的读写来实现对PL的控制。原创 2022-06-22 14:02:26 · 2482 阅读 · 0 评论 -
C/C++:multiple definition和undefined reference
multiple definition一般是在.h头文件定义了变量和函数,解决方法:使用static或者将函数及变量定义在.c、.cpp文件中。undefined reference可能是函数定义的命名空间不对。如果函数在头文件命名空间中声明,源文件的实现部分也要加namespace命名空间(类的话不用加)#pragma once#include <string>#include <stdint.h>#include <dlt/dlt.h>na原创 2022-02-15 09:31:45 · 1338 阅读 · 0 评论 -
C/C++:使用宏定义程序段
例子:#define DLT_INITIALIZER(...) \do { \ dlt_with_session_id(1); \ dlt_with_timestamp(1); \ dlt_with_ecu_id(1); \ dlt_verbose_mode(); \ DLT_REGISTER_APP(DLT_LOG_APP_ID, "Test Application for Logging"); \ .原创 2022-02-15 09:22:11 · 1276 阅读 · 0 评论 -
Algorithm:串联所有单词的子串
给定一个字符串s和一些 长度相同 的单词words 。找出 s 中恰好可以由words 中所有单词串联形成的子串的起始位置。注意子串要与words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑words中单词串联的顺序。示例 1:输入:s = "barfoothefoobarman", words = ["foo","bar"]输出:[0,9]解释:从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。输出的顺序不重要, [9,0] 也...原创 2021-12-22 22:37:09 · 514 阅读 · 0 评论 -
[C/C++] 断言和异常
assert: 断言assert() 会对表达式expression进行检测:如果expression的结果为 0(条件不成立),那么断言失败,表明程序出错,assert() 会向标准输出设备(一般是显示器)打印一条错误信息,并调用 abort() 函数终止程序的执行。 如果expression的结果为非 0(条件成立),那么断言成功,表明程序正确,assert() 不进行任何操作。try{} catch{} : 异常...原创 2021-05-09 08:16:50 · 553 阅读 · 0 评论 -
按位与&和逻辑与&&的区别
#include <iostream>using namespace std;int main(){ cout << "1 && 2 == " << int(1 && 2) << endl; cout << "1 & 2 == " << int(1 & 2) << endl; if(1 && 2) { cout << "1.原创 2021-07-27 12:00:30 · 441 阅读 · 0 评论 -
C语言:将数组的元素全部打印
#include <stdio.h>#include<string.h>void printByteArrayElements(char* inputArray, int size){ long i; char StrBuff[200] = {0}; if (size * 5 > 200) { printf("print input data buffer in hex form impossible because of too many .原创 2021-03-16 21:11:08 · 5125 阅读 · 0 评论 -
命名空间和宏定义的问题
宏定义不受命名空间的约束宏是在编译前预处理阶段处理的定义的宏从define到undef或者文件尾有效,所以宏的作用域和它所在的代码块无关。原创 2021-01-02 14:57:37 · 1724 阅读 · 0 评论 -
C++中使用C库函数
1. 头文件中声明extern "C" {#include ".h"}2. 对函数声明extern "C" {int s(void);int a(void);}原创 2020-12-15 20:03:14 · 1104 阅读 · 0 评论 -
C语言:二元查找树转变成排序的双向链表
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。本题目是微软的算法题,正好之前做过二叉树的遍历算法。就在之前的基础上面研究,发现之前的题目上用的是二元查找树。遍历方法正好是顺序遍历。就在此基础上做了修改,实现算法。方法就是递归。然后,就是记录之前的节点,和当前节点左右指针做转换。因为当前节点,正好是比前一个节点第二大的数据。#include <stdio.h>#include <stdlib.h>ty.原创 2020-06-13 09:31:16 · 281 阅读 · 0 评论 -
C/C++函数指针
函数指针,需要将函数括起来。写成XX (*function) (XX)形式。int *func(int, int) 和int (*func1)(int ,int)的区别1.func就是普通的函数名,只是这个函数的返回值是指针2.func1是函数指针,他指向的函数返回值为int有两个int的参数注意:(int*)func(int, int)与 int *func(int,...原创 2020-04-26 22:15:44 · 530 阅读 · 0 评论 -
C语言:数组初始化第一个元素
#include <stdio.h>int main(){ int arr[10] = {0xFF}; for(int i = 0; i < 10; i++) { printf("arr[%d] = %d\n", i, arr[i]); } return 0;}uidh2917@hiv3209u:~/Source$ gcc TestArray.c...原创 2020-04-22 11:11:30 · 1645 阅读 · 0 评论 -
C++: [编程题]逛街
[编程题]逛街时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 256M,其他语言512M小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住)输入描述:...原创 2020-03-01 13:41:14 · 1314 阅读 · 0 评论 -
C语言:求数组中第二大的数据
#include <stdio.h>int findSecondNumber(const int arr[], int size){ int BiggestNumber = 0; int SecondNumber = 0; if(size < 2) { printf("ERROR!\n"); return 0; } else { BiggestN...原创 2020-02-29 22:39:50 · 2077 阅读 · 0 评论 -
C语言:字符串申请内存
下面程序段的输出结果是 1 2 3 char *p1 = ”123”, *p2 = ”ABC”, str[50] = “xyz”; strcpy(str +2, strcat(p1, p2)); printf(“%s\n”, str); 正确答案: D 你的答案: C(错误)xyz123ABCz123A...原创 2020-01-13 16:01:14 · 1222 阅读 · 0 评论 -
C语言:指针赋值问题
请指出以下程序的错误: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 voidGetMemory(char **p,int num) { if(NULL==p &&a...原创 2020-01-03 14:44:02 · 347 阅读 · 0 评论 -
面试题目:内存泄漏
内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的分类:1. 堆内存泄漏 (Heap leak)。对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调...转载 2019-12-31 18:04:50 · 777 阅读 · 0 评论 -
C语言:判断处理器大小端字节序
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1参考答案【解答】 1 2 3 4 5 6 7 8 9 10 11 12 intcheckCPU() { { unionw {...转载 2019-12-31 14:58:31 · 692 阅读 · 0 评论 -
C语言 strtol()实现字符串排序
#include <stdio.h>#include <malloc.h>#include <string.h>#include <stdlib.h>int main(){ int num; scanf("%d", &num); char **string_array = (char **)malloc(sizeof(c...原创 2019-12-08 10:42:56 · 236 阅读 · 0 评论 -
QT:当前界面截图导出及文件传输功能开发
void VolCurvePage::export_button_clicked(){ bool is_mounted = false; struct mntent *ent; FILE *aFile; //check the usb media exist aFile = setmntent("/proc/mounts", "r"); if ...原创 2019-12-07 16:33:29 · 350 阅读 · 0 评论 -
C语言:动态二维数组(转载汇总)
目录一、利用一个二级指针来实现二、利用数组指针来实现三、利用一维数组来模拟二维数组一、利用一个二级指针来实现思路:二级指针的使用类似于二维数组名的使用#include<stdio.h>#include<malloc.h>int main(){ //5行2列的数组 int **p = (int...转载 2019-12-05 12:33:45 · 1280 阅读 · 0 评论 -
编译:解决.h中初始化变量multiple definition问题
解决方法,在初始化变量的时候,加static或者consttype.h中这样初始化数组就会出现multiple definition的问题。pal::dtc::dtc_ftb_t DtcFtbTable[DTC_TOTAL_NUMBER] ={ 0xF00041, 0xF00044, 0xF00045, 0xF00046, 0xF00047, 0xF00049, 0xF00055...原创 2019-11-12 16:36:57 · 335 阅读 · 0 评论 -
UT:自己写第三方的测试接口
#ifndef DBPRINT_IF_H#define DBPRINT_IF_H#ifndef HOST_UNIT_TEST#include "alx_log.h"using namespace alxLog;const FACILITY_TYPE DBPRINT_FAC_diagservice = 0x01;#define ERR(...) print(DBPRINT_...原创 2019-11-04 11:15:51 · 813 阅读 · 0 评论 -
STM32 GPIO触发中断
#define KEY1_INT_GPIO_PORT GPIOA#define KEY1_INT_GPIO_CLK (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO)#define KEY1_INT_GPIO_PIN GPIO_Pin_0#define KEY1_INT_EXTI_PORTSOURCE ...原创 2019-10-19 18:52:12 · 5391 阅读 · 1 评论 -
STM32模拟开门狗中断,设置高低电压阈值
当被ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是我们开启了模拟看门狗中断,其中低阈值和高阈值由ADC_LTR 和ADC_HTR 设置。例如我们设置高阈值是2.5V,那么模拟电压超过2.5V 的时候,就会产生模拟看门狗中断,反之低阈值也一样。#include "bsp_adc.h"__IO uint16_t ADC_ConvertedValue;/**...原创 2019-10-18 21:19:42 · 5165 阅读 · 0 评论 -
STM32开发:指南者ADC采样接线图
使用指南者的开发板做ADC采样。开始不清楚是怎么接线的。后来才明白,输入端是VR,用哪条channel检测,就将这个管脚和VR连接。检测电压要和开发板的GND端连接。说明ADC内部本身是和GND连接的。这个板子的ADC采样的范围是0V~3.3V。接线图如下,如果连接GND的话,ADC的电压值就是0V。连接3V3的管脚的话,测出来的值就是3.3V。...原创 2019-10-17 08:02:42 · 5607 阅读 · 0 评论 -
C语言:判断字符串是否包含
#include <stdio.h>_Bool isCoincide(char *a, char *p){ char *ptemp = p; while (*a != '\0') { if (*a == *p) { a++; p++; } else { a++; p = ptemp; } if (*p == '\0')...原创 2018-11-17 12:55:47 · 4056 阅读 · 0 评论 -
GNU C attribute section的一个使用例子
1.前言: 在内核中我们经常遇到"section"类似的字眼.把相关的CPU或设备信息存放在某个section里面.然后对这个section进行遍历,判断这个section里面是否有我们自己想要的信息.这是一种不错的编译思想.下面整理了一个示例来加固下这种思想的学习.2.示例: car.h [html] view plain co转载 2017-05-31 16:54:57 · 792 阅读 · 0 评论 -
C/C++:数组赋值问题
数组只能在声名的时候,一起对多个变量赋初值。不能声名之后再一起对变量赋初值。int a[3] = {0, 1, 2}; 是对的不能这样写,int a[3] = {};a[3] ={0, 1, 2};因为编译器会把a[3] 当做一个int变量,而不是int数组。而且a[3]是一个越界的变量。...原创 2019-08-12 12:27:55 · 3102 阅读 · 0 评论 -
Windows端实现IP地址与域名之间的转换
注意:博主用的visual studio 2015,在windows调试程序需要链接ws2_32.lib库,才能正常运行程序。打开项目的“Property”->"Linker"->"Input"->"Additional Dependencies",或者你也可以通过快捷键Alt+F7打开Property页面. 不知如何操作,可以看http://blog.youkuaiyun.com/qq...转载 2019-04-19 10:53:05 · 1480 阅读 · 0 评论 -
C语言:数组参数传递问题
数组传递参数的话,如果直接传指针过去。对数组参数的操作会改变原始变量的值。如果不想影响原始变量的话,需要在函数里面定义新的局部数组变量。赋值给局部数组变量,对局部数组变量进行操作。#include <stdio.h>#include <string.h>#include <stdlib.h>int SetArray(char *array){ ...原创 2019-04-28 10:36:37 · 4761 阅读 · 1 评论 -
C语言递归调用
使用递归的方法,将一个整数倒转。比如:-1234,变为4321;1234变为4321。#include int integerSwap(int a){ static int value = 0; int integer = 0; if(a != 0){ value = value * 10 + a % 10; integerSwap(a/10); }原创 2018-01-17 17:29:19 · 602 阅读 · 0 评论 -
C语言二叉树创建、遍历以及统计结点、叶子结点
#include typedef int DataType;typedef struct tree { DataType data; struct tree *left; struct tree *right; }node,*pnode; pnode createTreeNode(DataType data)原创 2017-08-16 15:03:11 · 2508 阅读 · 0 评论 -
CRC校验程序
循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。uint16_t calcul_crc(uint8_t *data, uint32_t length){ uint16_t crc;原创 2017-07-31 08:51:59 · 1886 阅读 · 0 评论 -
Linux进程创建fork()函数
在利用linux的fork()函数创建进程时,新建的进程会继承父进程的代码段、数据段和堆栈段。不同的子进程和父进程fork()返回的值不同。利用fork产生进程时,由于迭代的关系会产生多个进程。因此需要加条件进行限制。#include #include int main() { pid_t p1 = 0; pid_t p2 = 0;原创 2017-06-15 16:09:55 · 433 阅读 · 0 评论 -
C语言求链表链尾前N个结点
使用快慢指针。快指针比慢指针提前n个单元。当快指针到达单链表尾部时,慢指针指向待删除节点的前节点。typedef int datatype;typedef struct node{ datatype data; struct node *next;}LNode, *LinkList;LinkList* H;LinkList* node(LinkLis原创 2017-06-12 14:26:03 · 365 阅读 · 0 评论 -
gcc编译器 __attribute__ ((section(".")))
提到section,就得说RO RI ZI了,在ARM编译器编译之后,代码被划分为不同的段,RO Section(ReadOnly)中存放代码段和常量,RW Section(ReadWrite)中存放可读写静态变量和全局变量,ZI Section(ZeroInit)是存放在RW段中初始化为0的变量。默认情况下,编译器将其生成的目标代码存放在.data 和.bss 段中。section 属性允许指定原创 2017-06-02 11:22:00 · 7799 阅读 · 0 评论 -
数据结构(C语言描述)
对于数据结构的理解:数据结构是定义不同的数据类型,来存储信息。或者利用这些特殊数据结构的特点来实现相应的功能。我们在使用数据结构时都必须对其进行初始化赋值。因为其结构的特殊性,所以看起来赋值、删除等操作看起来要复杂些。不过还是有章可循的,那就是指针。只要掌握了指针的操作和数据结点的数据结构,了解数据结构的相关知识、利用数据结构来解决问题,就会变得简单。常用的数据结构:数组原创 2017-05-31 11:33:44 · 3773 阅读 · 0 评论