C/C++
文章平均质量分 64
在使用C/C++中遇到的一些问题
daijingxin
好好学习天天向上
展开
-
gcc优化等级的区别(-Ox的区别)
gcc提供了为了满足用户不同程度的的优化需要,提供了近百种优化选项,用来对{编译时间,目标文件长度,执行效率}这个三维模型进行不同的取舍和平衡。1)精简操作指令;2)尽量满足cpu的流水操作;3)通过对程序行为地猜测,重新调整代码的执行顺序;4)充分使用寄存器;5)对简单的调用进行展开等等。想全部了解这些编译选项,并在其中挑选适合的选项进行优化,无疑像个噩梦般的过程。单从gnu的官方网站上得到的手册来看,描述依然比较苍白,不足以完全了解选项的使用范围和原理。...转载 2022-07-18 15:14:35 · 1084 阅读 · 0 评论 -
关于.CSV文件
什么是.CSV文件csv是逗号分隔值文件格式,一般用WORDPAD或记事本(NOTE),EXCEL打开。csv(逗号分隔值)是一种用来存储数据的纯文本文件,通常都是用于存放电子表格或数据的一种文件格式。.CSV文件的用途比如在C语言程序中可以将数据输出到.csv文件中,直接在excel上查看...原创 2022-01-12 22:20:22 · 979 阅读 · 0 评论 -
ARM平台下char型数据
arm平台下默认数据类型配置在X86平台上,char类型数据默认为signed char型,但是在一些嵌入式设备上,比如arm平台,char类型是当作unsigned char处理的,为了保持与PC一致,可以通过指定CFLAG += fsigned-char进行配置。或者在CMAKE中添加相应的flag。char类型相关CFLAGS-funsigned-char (无符号char型数据)-fno-signed-char (无符号char型数据)-fsigned-char(有符号char型数据)原创 2022-01-12 21:09:50 · 793 阅读 · 1 评论 -
关于C/C++的内联函数
__inline 关键字建议编译器在合理的情况下内联编译 C 或 C++ 函数。__inline 语义与 C++ inline 关键字的语义完全相同。__inline 是一个存储类限定符。 它不影响函数的类型。格式:inline _declarator;__inline _declarator; // Microsoft相关__forceinline _declarator; // Microsoft相关__inline与inline等同。inline和__inline通知编译器将该函数的内转载 2021-07-16 10:53:14 · 287 阅读 · 0 评论 -
make报错 /usr/include/c++/11.1.0/bits/stl_pair.h
进行GPU CUDA编程时遇到这个问题,原因是CUDA编程需要将C++标准设置为11可以在cmake 中加入:SET(CMAKE_CXX_FLAGS "-std=c++")或者在makefile文件中加入特定的参数。原创 2021-07-08 17:32:11 · 1393 阅读 · 0 评论 -
CUDA 编程 __launch_bounds__的应用方法
目录Launch Bounds1.概述2.用法2.1概要2.2参数3.分析4.Example5.Register usageLaunch Bounds1.概述As discussed in detail in Multiprocessor Level, the fewer registers a kernel uses, the more threads and thread blocks are likely to reside on a multiprocessor, which can impr转载 2021-06-21 11:55:54 · 2607 阅读 · 0 评论 -
关于POSIX
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。POSIX标准意在期望获得源代码级别的软件可移植性。换句话说,为一个POSIX兼容的操作系统编写的程序,应该可以在任何其它的POSIX操作系统(即使是来转载 2021-06-08 21:24:27 · 168 阅读 · 0 评论 -
关于C 标准库 <float.h>
目录C 标准库 float.h简介组件及其组件描述库宏宏的描述C 标准库 float.h简介C 标准库的 float.h 头文件包含了一组与浮点值相关的依赖于平台的常量。这些常量是由 ANSI C 提出的,这让程序更具有可移植性。在讲解这些常量之前,最好先弄清楚浮点数是由下面四个元素组成的:组件及其组件描述S 符号 ( +/- )b 指数表示的基数,2 表示二进制,10 表示十进制,16 表示十六进制,等等...e 指数,一个介于最小值 emin 和最大值 emax 之间的整数。p 精度,基转载 2021-06-01 09:33:55 · 469 阅读 · 0 评论 -
关于free(): invalid pointer的问题
解决方法:1.通常是有指针越界造成的,仔细检查代码有没有越界的行为。2.指针在程序运行中位置发了变化,例如指针a,执行了a++操作。原创 2021-05-27 10:29:12 · 7982 阅读 · 0 评论 -
“undefined reference to“ 解决方法
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:(.text+0x13): undefined reference to `func’关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。目录**1. 链接时缺失了相关目标文件(.o)****2. 链接时缺少相关的库文件(.a/.so)****3. 链接的库文件中又使用了另一个库文件****4转载 2021-05-27 10:17:52 · 63878 阅读 · 2 评论 -
C语言头文件<>和““的区别
1.**#include <> :**表示引用标准库头文件,编译器会从系统配置的库环境中去寻找。2.**#include “”:**表示用户自己定义使用的头文件,编译器默认会从当前文件夹中寻找,如果找不到,则到系统默认库环境中去寻找。(GCC编译器只会在当前文件夹寻找!)因此两种书写格式要严格进行区分!......原创 2021-05-19 21:35:02 · 1259 阅读 · 0 评论 -
Visual studio 配置OpenMP 多线程编译环境
直接开整!具体步骤步骤一:创建项目新建 C++ 空项目,添加一个 Cpp 文件,内容如下:#include <omp.h> #include <stdio.h> #include <stdlib.h> int main(){ #pragma omp parallel { printf("the number of thread = %d\n", omp_get_thread_num()); }}步骤二:修改项目配置右击项目属性,修改红原创 2021-05-03 22:27:31 · 2057 阅读 · 0 评论 -
C/C++内存对齐操作
目录什么是内存对齐为什么要进行内存对齐如何进行内存对齐1.通过编译器来指定对齐长度2.利用内存分配函数什么是内存对齐现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐。为什么要进行内存对齐尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至3原创 2021-04-14 22:24:12 · 438 阅读 · 0 评论 -
C/C++ 调用AVX/SSE函数的注意事项及准备工作
OS: win10 和 centos7,其他的linux应该都差不多。(参考这篇文章,作者也在ubuntu18.04以及Archlinux上进行过对应的测试均可)gcc: 如果使用AVX指令集在编写cmake或者makefile文件时需要加上 -mavx2 参数。低版本的gcc 不支持 -mavx2 参数,具体是在哪个版本加进来的不知道,试试就知道了。CPU: 其实处理器也需要支持这个指令集,比如avx512需要Intel四代之后才有,可以去对应厂家的官网上查询,或者直接跑代码,看下耗时。SIMD的相原创 2021-04-14 20:23:50 · 7399 阅读 · 0 评论 -
断言指令(assert)的用法
目录什么是断言指令?几种常见的断言指令C/C++中断言指令的具体使用以及注意事项总结什么是断言指令?断言指令的语义就是判断某个条件,如果结果不为真,就执行一段非常规的动作,一般为程序立马结束运行。几种常见的断言指令1.assert条件判断失败就终止运行。2.verify条件判断失败继续执行,并输出错误。3.waitfor等条件加载成功后才向下继续执行,否则一直等待。C/C++中断言指令的具体使用以及注意事项assert宏的原型定义在assert.h中,其作用是如果它的条件返回错误,则终原创 2021-03-01 22:37:38 · 1246 阅读 · 2 评论 -
const关键字的用法
目录一、常规用法二、const关键字修饰指针三、const关键字修饰函数形参四、const关键字与#define一、常规用法const关键字定义只读变量,被const定义的变量不允许给重新赋值。所以说它定义的是只读变量,这也就意味着必须在定义的时候就给它赋初值。用const修饰变量的格式通常为:const int a;int const a;二、const关键字修饰指针const与指针配合使用有两种作用:一是限制指针变量,二是限制指针变量指向的数据限制指针变量本身的用法:int * co原创 2021-02-18 16:01:11 · 848 阅读 · 0 评论 -
Volatile关键字与原子性操作
目录什么是原子性操作什么是Volatile关键字为什么需要原子性操作Volatile能不能实现原子性操作?Volatile关键字常用的场景CUDA编程实现原子性操作的方法什么是原子性操作原子性操作具有不可分割性。比如 i=0 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:i++; 这个操作实际是i = i + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们原创 2021-02-09 13:59:53 · 4266 阅读 · 1 评论 -
cmake清除缓存的操作(类似 make clean)
想要通过make clean类似的操作删除CMake生成的各种文件。发现cmake没有类似的操作,需要手动浏览目录,删除像cmake_install.cmake和CMakeCache.txtCMakeFiles文件,以及CMakeFiles文件夹。是否有像cmake clean这样的命令来自动删除所有这些文件?通过查看cmake命令的help发现可以通过创建一个额外的文件夹的方式实现:cmake -S . -B build之后每次操作直接删除掉build文件就可以了。...原创 2020-12-27 21:29:10 · 38051 阅读 · 7 评论 -
Matlab与C/C++混合编程的方法
目录1.Matlab调用C/C++1.1 调用C/C++的Mex文件Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序设计语言,两者互补结合的混合编程在科学研究和工程实践中具有非常重要的意义。1.Matlab调用C/C++Matlab调用C/C++的方式主要有两种:利用MEX技术或调用C/C++动态链接库。在Matlab与C/C++混合编程之前,必须先对Matlab的编译应用mex和编译器mbuild进行正确的设置:对Matlab编译应用程序mex的设置:Mex –转载 2020-12-17 20:28:53 · 5236 阅读 · 0 评论 -
Linux 编译报错 error: ‘fopen_s‘ was not declared in this scope
不同操作系统对于函数的定义、名称以及参数有所不同,需要在文件前加入代码:#ifdef __unix#define fopen_s(pFile,filename,mode) ((*(pFile))=fopen((filename), (mode)))==NULL#endif原创 2020-12-06 22:06:05 · 9249 阅读 · 3 评论 -
如何在CUDA C / C ++中优化数据传输
注意:文中采用设备版本较老,重在设计思想目录使用nvprof测量数据传输时间最小化数据传输批量传输数据总结在本篇中,我们将开始关于何有效地在主机和设备之间传输数据的讨论。 设备内存和GPU之间的峰值带宽(例如,在NVIDIA Tesla C2050上为144 GB / s)比主机内存和设备内存之间的峰值带宽(在PCIe x16 Gen2上为8 GB / s)高得多。 这种差异意味着在主机和GPU设备之间进行数据传输的实现可能会影响或破坏整体应用程序性能。 让我们从有关主机设备数据传输的一些一般准则开始。翻译 2020-11-19 10:09:12 · 688 阅读 · 0 评论 -
GPU编程 内存类型简介
目录内存分类内存功能三级目录内存分类存储空间主要分为可编程与不可编程两种。通常在存储结构中,缓存都是不可编程的。(例如:L1和L2 cache)GPU的可编程存储空间有:Global, local, texture, constant, shared and register memory。按照速度和大小对他们进行排序如下图所示:内存功能各部分存储空间的分布情况如下图所示:从上图不难看出,GPU每个线程块内实际只有寄存器、共享内存、本地内存。其余常量、纹理、全局内存都存放在GPU芯片上原创 2020-11-10 22:34:47 · 1302 阅读 · 0 评论 -
GPU编程 线程配置
目录1.线程的组成结构2.确定自己显卡的配置3.CUDA核函数的参数(Kernel Function)3.1 1d Grid 和 1d Block3.2 2d Grid 和 2d Block3.3 3d Grid 和 3d Block3.4 计算公式汇总1.线程的组成结构具体的结构从上至下可以分为:Grid-> Block-> Warp ->thread。Grid/Block/Warp/Thread都是软件的组织结构,并不是硬件的,因此理论上我们可以以任意的维度(一维、二维、三维)去原创 2020-10-12 11:36:44 · 2277 阅读 · 8 评论 -
GPU编程 Profiler的使用(包括如何配置图形化界面)
在安装完成了CUDA库后,除了包含的Nsight还有一系列英伟达提供的工具,比如说Profiler。“Visual Profiler是一个图形化的剖析工具,可以显示你的应用程序中CPU和GPU的活动情况,利用分析引擎帮助你寻找优化的机会。”其实除了可视化的界面,NVIDIA提供了命令行方式的剖析命令:nvprof。对于初学者,使用图形化的方式比较容易上手。使用命令的方式如下:但是还是想搞一下图形化界面。如果直接进入Profiler会弹出以下界面:所以使用Profiler前需要注意:比较原创 2020-10-10 10:47:56 · 1696 阅读 · 1 评论 -
VS2019 调试程序报错 无法找到.exe文件
通常是输出文件目录没有和实际文件匹配导致的。需要对以下两个地方修改:1.项目属性->链接器->常规->输出文件2.输出文件目录可以在配置属性下的常规选项看到:4.之后重新生成文件便不会提示错误。...原创 2020-10-06 22:30:19 · 29295 阅读 · 11 评论 -
VS2019 无法解析的外部符号 cublasSgemm_v2等类似问题的解决方法
编译程序时报出以下错误:LNK2019 无法解析的外部符号 cublasSgemm_v2,函数 main 中引用了该符号 TEST1.首先确认环境配置没有问题:如果软件安装在C盘,在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras目录下进入cmd界面进行测试。运行以下命令:./bandwidthTest.exe./deviceQuery.exe运行程序后显示PASS表示环境配置成功。如果这步有问题需要检查自己原创 2020-10-06 22:23:54 · 1694 阅读 · 2 评论 -
数据结构(1)队列(C语言版)
队列定义:只允许在一端进行插入,在一端进行删除的线性表。 生活中的很多例子都可以用队列来体现,如买饭排队。 同样类似于栈,队列在电脑中的储存方式也分为两种,顺序储存和链式储存。 顺序储存: 顺序储存结构的情况如下,我们在使用前要确定队列的大小,通过建立数组来储存队列的元素。建立两个指针来标示队头和队尾,添加元素和删除元素即为移动队头或是队尾。虽然原创 2016-05-04 20:41:12 · 681 阅读 · 0 评论 -
数据结构与算法简介
以下是在学习数据结构过程中,自己整理的一些对于数据结构和算法的简介,以防忘记,在这里记录一下。一、数据结构1.数据分类的层次 例子:(可以类比到c语言中的结构体) 数据项->数据元素->数据 人类->人->人的五官 数据对象和数据结构则是建立在数据元素的基础之上的 数据对象是指一组具有相同性质的数据元素 数据结构是指一些数据元原创 2016-04-15 09:32:00 · 2431 阅读 · 0 评论 -
SDUT 最少拦截系统 2075
最少拦截系统Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以原创 2016-07-29 20:17:02 · 761 阅读 · 0 评论 -
SDUT 活动选择 1298
删数问题Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^题目描述 键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。输入 输入有多组 每组包括原原创 2016-07-28 22:03:56 · 621 阅读 · 0 评论 -
矩阵问题(题目:SDUT 2744 2254)
最近在刷ACM题目的过程中遇到了好多关于矩阵的问题,确实是把我恶心了一番。 但是从本质上来讲,这种题目难度并不是很大,主要是找规律,之后通过循环来实现。 现在主要介绍一下几种规律和题目原创 2016-07-22 11:29:35 · 2799 阅读 · 0 评论 -
C语言与Verilog HDL语言的区别与不同
C语言与Verilog HDL语言同为计算机语言,语法相近,但本质的不同是什么?数字电路设计工程师一般都学习过编程语言、数字逻辑基础、各种EDA软件工具的使用。就编程语言而言,国内外大多数学校都以C语言为标准,只有少部分学校使用Pascal 和Fortran。算法的描述和验证常用C语言来做。例如要设计Reed-Solomen编码/解码器,可以分为下面几个步骤。先深入了解Re...转载 2018-10-16 17:12:52 · 18286 阅读 · 2 评论 -
通过信号量进行进程通信的小例子
如果我们需要完成以下的要求在main函数中创建一个子进程实现通信:利用信号实现进程通信。父进程任务:循环打印“I am father process!,I am waiting for signal,My PID is ......”。要求把自己的进程号同时打印出来,父进程同时还等待发来的SIGINT信号和SIGKILL信号,当第一次收到SIGINT信号时,打印“I have rece...原创 2018-09-26 17:34:42 · 732 阅读 · 1 评论 -
Linux下简单的网络编程
计算机网络是通过通信线路互相连接的计算机的集合,它是由计算机及外围设备、数据通信和中断设备等构成的一个群体。 TCP/IP协议是Internet上使用的协议,而Internet是世界上最大的计算机网络。 国际标准化组织ISO对网络标准提出了OSI参考模型,该模型规范了计算机网络的设计并解决了TCP/IP协议没有涉及的底层实现问题。 Linux系统的一个主要特点是它原创 2017-12-11 15:58:43 · 525 阅读 · 0 评论 -
C语言中return和exit的区别
exit函数在头文件stdlib.h中。exit(0):正常运行程序并退出程序;exit(1):非正常运行导致退出程序;return():返回函数,若在main主函数中,则会退出函数并返回一值,可以写为return(0),或return 0。详细说:1. return返回函数值,是关键字;exit是一个函数。2. return是语言级别的,它表示了调用堆栈的返回;而exit原创 2017-10-12 22:37:22 · 852 阅读 · 0 评论 -
C语言中main函数的参数
今天在嵌入式课程学习时发现一些c语言程序的main函数存在参数,针对这一问题我查找了一些资料,整理了一下。 main函数主要有这种形式:main(int argc, char *args[])。主要在Liunx系统中使用命令读取文件信息时用到,在DOS中也有着同样的用处。 在一些编译器允许将main() 的返回类型声明为void,这已不再是合法的C++。main(int原创 2017-09-27 21:13:20 · 700 阅读 · 0 评论 -
正则表达式
正则表达式到底是什么东西?在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc。在这里,*会被解释成任意的字符串。和通配符类似...转载 2020-02-24 20:42:27 · 4835 阅读 · 0 评论 -
FIR内插滤波器结构与代码实现
信号处理的应用中,有时需要将某个抽样信号变换成一个新的、具有不同抽样率的抽样信号,这就是多抽样速率信号处理。实现抽样率提高的过程被称为内插,实现抽样率降低的过程被称为抽取。由于抽取时内插的对偶系统,因此我们只要对内插滤波器的设计方法有了一定的了解就可以很快的得出抽取滤波器的设计方法。在这里我们先对FIR内插滤波器的结构进行简单的分析,并对自己设计时采用的滤波器进行介绍。一、直接结构直接结构就是按照信号流程直接实现的结构,也是最简单的实现结构。图中R为抽样率提高的倍数,被称为内插因子,即为补零的过程原创 2020-06-19 19:30:08 · 6098 阅读 · 2 评论 -
音频数据处理的基本框架(基于ADSP-SC589)
简单的回顾一下使用DSP处理音频数据所需要的基本配置。首先是音频采集播放的基本流程:采集-前处理(回声消除、噪声抑制、音量调节、混响处理等)-编码-传输-解码-后处理-播放。暂时不对过程中处理和编解码进行分析,主要记录下DSP中进行采集和播放的基本准备。DSP 的实时处理的实现能够将采集到的数据先存储到SDRAM 中,在需要处理的时候利用EDMA 实现Ping Pong 缓冲,将待处理......原创 2020-05-05 22:03:21 · 3397 阅读 · 2 评论 -
FAT32文件操作系统(主要针对SD卡)
目录一、主引导扇区二、什么是文件系统?三、对FAT32的简单介绍 1.保留区 2.FAT表 3.数据区四、总结 最近的项目用到了SD卡数据读取,了解FAT32系统着实恶心了我一下,分享一下自己的笔记。 u 盘,sd 卡等小容量存储介质不存在仔细的 分区。但是 在文件系统初始化的开始我们必须通过 MBR 获取分区表项的数据,以获得 CHS、LBA 参数以及分区大小扇区 数,从而得到文件系统的起始物理扇区号。 Microsoft 将使用 DOC 分区体系的磁原创 2020-04-03 11:59:49 · 5567 阅读 · 2 评论