- 博客(134)
- 收藏
- 关注
原创 二级指针作为函数入参,在函数内部申请和释放内存的写法
需要非常注意*,其实,只需要一直记得指向二级指针的指针,其取值才是二级指针首地址,二级指针取值才是一级指针地址,二级指针移位,得到一级指针的总体移位。// 释放内层每个 double 数组。// 释放外层的 double* 数组。// 修正变量名错误。// ---- 假设此处有其他使用内存的操作 ----
2025-03-21 11:12:01
165
原创 C/C++子函数申请对应二维数组的动态内存传给主函数使用
p1是指向二维指针的指针,即三维指针,其值是二维指针,即指向数组的指针数组,指针数组的每个元素(二维指针)指向一个一维数组的首地址,即每个元素值都是一个指针,(*p)表示取值,*p[0]和(*p)[0]表示的是一个地址,但是不是一个意思,用(*p)[0] (*p)[1] ...才能表示二维指针的各个元素,即数组名加和数组元素位置加的区别。这是初步的,主要讲返回原理,但是用的是对应一维数组的内存。实践中碰到需要申请对应二维数组的内存,且,有多个内存需要返回。这里,test1函数类似统一申请动态内存的函数。
2025-02-19 14:59:25
326
原创 C和C++中struct的区别——汇集资料
基本已经说的很清楚了。另外可以看看C++中struct和类的区别,其实就一句话,类属性默认是私有的,struct是公有的,且只能公有。
2025-02-08 15:44:04
137
原创 matlab画图,选择性显示legend标签
一幅图画了几条曲线,其中有一条是分段画的,这些段是一种颜色,其他线是其他颜色,最终显示结果,明显这条线只需要一个legend,即需要将一些线的标签不显示,即选择性显示标签。曾尝试用空字符表示这条线的其他段,但是最终legend时,空字符也是一个标签,还是标签过多。查了一下,还是很多方法解决问题的——
2024-12-19 17:52:25
688
原创 结构体加&和不加&
结构体类似于一个数组,比如int a[3],则,如果传入int* a,则只能传入数组的首地址的值,即传入一个int的字节,要传入整个数组,则要写成:(int*) a[3],才表示一次传入了整个数组的字节数,调用时,写成&a[3]。对于上述结构体,若只传入zhh_t,则只传入了结构体首个元素(?要传入整个结构体,形参写成*zhh_t,传入时写成&zhh_t,表示传入这整个结构体的字节数。如果不加,则只是结构体类型的指针,如结构体是zhh_t,那么zhh_t就是一个指向这个类型的指针,类似与int*。
2024-12-10 13:41:26
293
原创 C语言,有关const
以前对于这个关键字,基本没用过。只是印象比较深的是看一些比较经典的库代码,会有很多这个字。比如函数传入指针,之前真没怎么细想,以为很复杂或者麻烦,其实,完全是由于懒惰和畏惧了。
2024-12-09 18:20:54
343
原创 C语言信号处理,离线版(全域、后处理)中值滤波和低通滤波
对于一些数据,需要在pc或者云端进行滤波处理,比如这里的中值(去基线)和低通(去毛刺)。因为平台强大,当数据量大时,如果滤波做的不是太复杂,或者说做的比较简单,那么处理起来还是比较快的,那么就能实用。这里有个例子,因为是后处理,则信号处理前是多长(多少点),处理后就是多少点。对于中值滤波,需要将边沿点进行扩展(补点),或者在边沿进行窗口缩小处理。对于低通滤波,则确定需要对边沿进行补点,并合理处理延时。
2024-09-19 17:14:59
697
原创 GitLab权限及设置
开发中遇到要将自己这块的代码上传到Git,由其他组的同事拉取后继续开发。上传代码后需要将对应同事设置权限,开始设置成了Developer,但其实是错了,应该是Reporter。之前很少关注这些,项目的权限,一般由专门的管理人员设置。但自己创建的项目自己可以设置权限。
2024-09-12 18:04:27
1782
原创 实时(按帧)处理的低通滤波C语言实现
对前2秒数据,计算第0.5秒到1.5秒数据,即第128点到384点,滤波数据起始点设置在第128(数据起点)+64(滤波器半长)+ 1=193点,易知此点前有192点,远大于滤波器长的128点;但是,滤波器越长,计算量越大。matlab看滤波路效果,128阶的够用了。低通滤波采用一般的FIR滤波器,因为本次任务,允许的延迟较多,或者说前面损失的信号可以较多,因此,涉及一个很高阶的FIR滤波器,前面的信号点可以去掉,以及,考虑延时,当前时刻向前推一个时刻(当前帧处理的最后一点的时刻)之后的点,也先不处理。
2024-09-11 18:07:21
751
1
原创 Git撤销push
需要注意的是,无论是用reflog还是log,只要用reset,都是针对commit的,都需要再push一下!如果之后有别人提交的版本,或者有不需要删除的版本,即,想只撤销某个版本的push,而不是将其后的版本都撤销,那么需要采用revert来做,当然,目标更恰当的说,是变成了删除某指定版本了!注意,其中git reflog是看push的版本号,而不是用git log!需要解决一个问题是:加hard参数,有时会报错,即无权限。另外,下面这个,是不需要用版本号的,但是基本是撤销上个版本的psuh。
2024-09-10 18:23:39
2571
原创 快速排序代码问题以及一种改进的应用
第二,由于逐点滤波时,上一个信号点的窗口数据排序后,在下一个信号点甚至后面很多个信号点的窗口数据排序时,有一定的重复利用价值,特别是对于下一个点的窗口,只是删除了上次窗口中原始索引最小的值,而只增加了下一个点,那么——简单、统一处理可以是,将新增的信号点放在上一个点的窗口原始索引最小的值的位置,再重新排序——即,利用上一个点的窗口内所有数据点都排序好的优点!对于新增的信号点,再对这个新窗口进行排序,理论上计算复杂度就少很多了。同时,每一帧都需要将索引值减1,并且再记录下窗口内原始索引值最小的值的位置。
2024-09-10 15:42:27
836
原创 Git 撤销commit
对比reset,可以说是revert有三个优点吧,特别是第二点,非常神奇,revert之后的版本,在要合并包含被revert版本的版本(即是被revert版本之后到revert版本之前的这些版本)时,因为这些版本包含这个revert操作,会自动将被revert的版本剔除!这就很低级了,就是直接新建一个版本,再提交。版本号继续增加,之前需要删除的版本也还是在,同样,这个版本及之后的版本,如果再和需要删除的版本之后到这个版本之前的版本合并,则还是会带有要删除的版本,也就是没有revert中第二个优点。
2024-09-06 18:35:24
1923
原创 memcpy()的参数 int 与 unsigned int
看到这个帖子,当字节数是计算式时,确实可能出问题,当为负数时,可能会拷贝很大的字节数(最大2^31),或者,如果内核限制了最大拷贝字节数,则会报错。本来拷贝字节数的参数类型是unsigned int,其实一般写成int型也可以,应该是函数默认强转吧?所以这种最好加上强制转换,即转换成unsigned int。
2024-08-19 17:39:49
268
原创 VS中小数的类型
小数数值,默认是double型,而不是float型。若需要改为float型,除了强制转换,还可以在小数后打一个f,如:float gain = 2.0f;
2024-08-19 17:28:55
218
原创 未解决:不同类型的数据用memcpy然后打印(printf)出问题
怀疑这个打印值有问题,因为正常0x85值是133,133用有符号的一个字节是表示不了的,即超出表示范围,或者说,int的四个字节,不应该用倒数第二个字节表示0x85,而是要向左再多一位?按说,vaule是32位的,即有四个字节,但是这里转化后只有两个字节,认为是最低的两个字节,拷贝时,也是拷贝低两个字节,且,默认数据是按照小端对齐存储,即两个字节在内存中是按照47 85来存的,所以拷贝时,先拷贝47这个字节,再拷贝85这个字节。且,这里打印也是对的。可见,两个字节是拷贝成功了,顺序也是对的。
2024-08-19 16:29:05
982
原创 GIT将文件推送到远程仓库,即添加文件
请注意,以上步骤是在命令行中进行的,如果使用图形界面的Git客户端,操作步骤可能会有所不同。推送文件前,确保文件在本地仓库中已经保存,并且只推送必要的文件,避免推送不必要的文件和敏感信息。此命令将把本地的master分支推送到远程仓库的master分支。4. 创建远程仓库:在Git服务商(如GitHub、GitLab等)上创建一个新的仓库。8. 等待推送完成:等待Git将文件推送到远程仓库,完成后命令行会显示推送成功的消息。7. 输入用户名和密码:如果远程仓库需要身份验证,在命令行中输入你的用户名和密码。
2024-07-03 18:02:27
403
原创 MATLAB画图时添加标注显示有效数字的位数,可以编辑此函数
但是这个函数修改后不能保存,只能另存一个函数。保存好后,在图像上右击鼠标,选择"选择文本更新函数...",选中另存的函数文件即可。这个就是改变有效数字的。当然还可以修改其他属性。
2024-06-12 16:38:12
1079
原创 【转】VS报错找不到函数
即,C工程中,不小心建了一个C++文件,结果一直没发现,编译就是死活找不到定义的函数,各种检查定义、调用等,都没问题,但是编译就是找不到。修改成C文件后,就找到了。找了好久啊,网上没有说这个的,估计这种错误就我会犯吧。猜想,原因是,C文件和C++文件,编译器分别按照C和C++编译规则来编,编译后函数名不同,所以就找不到了。除了文中列的,还有自己评论的,真的是不小心就自己坑自己。
2024-05-30 11:25:12
411
原创 【转】VS(Visual Studio)更改文件编码
亲测VS里面设置是可以的。但是,一个工作区设置了,再新建工作区,这个选项并不保存,需要的话还是要重新设置。
2024-05-09 09:09:38
750
原创 word文档拆分
最需要注意的是,拆分后原文档不存在了,最多可以显示引用的拆分的文档,如果拆分有误,则无法恢复重来。所以,最好先备份,再进行拆分。可以参考这篇,注意需要全部选中后再创建。
2024-04-08 18:45:00
275
原创 C语言宏定义问题
C语言中,在定义数组时,因为数组长度需要是常量或者宏,尝试将变量按照值不同定义同一个宏的不同值,然后用宏来定义数组长度,结果发现不行。
2024-03-15 17:57:16
392
原创 C语言中,可以在子函数中动态申请一个指向二维数组的内存给调用函数使用么——看ChatGPT的回答——
这个行数组中每个元素,是指针!是的,可以在子函数中动态申请一个指向二维数组的内存,然后将其传递给调用函数使用。即先定义一个指向一维数组(可以当成行数组)的指针,即每个指针指向的是行数组,然后——关键的来了——C语言中,可以在子函数中动态申请一个指向二维数组的内存给调用函数使用么。下面是ChatGPT的回答,太专业了,比网上查的资料都好很多可能。之前还以为不行,只能以一维数组的形式返回呢。或者类似文中主函数调用赋值时写法,写成:p[i][j]
2024-03-15 17:31:56
465
原创 数组与指针之二——二级指针之一
这里用了两个&号,表示取两次地址,含义 上是没错的,这报错,是C语法的问题,是将前面一个&当成与操作,所以需要左值是变量或者函数调用形式,而右边只有括号里的&是真取了地址,所以报C2440,无法从int*转换为int**。可见,虽然&a是指向指针的指针,但如第一篇所述,它确是指向4个元素数组的指针,也就是指向一个行数组的首个元素,是有限制的,类型是int (*)[4],并不表示是指向一个int变量的地址,即int **。所以,重点来了,对于一维数组,这种二级指针其实是多此一举了,那么对于二维数组呢?
2024-03-08 10:56:16
359
原创 VS的__int64和linux的long long
个人理解,__int64是windows系统用,且VC6.0还不能用,且32为系统还不安全。long long是linux编译器g++ gcc等用的,其实是C99的标准。不知道对不,改天可以用g++编译器编译下定义为_int64的变量看看。
2024-02-27 16:08:59
451
原创 linux调用so库之一
可以看他的第一部分,即显式调用。但是会报错,我的版本是64位的Ubuntu 20.04.6 LTS。会发现直接用第一种方式的代码报错,dlopen函数返回是void *型指针,不能匹配原so库中调用函数的函数指针类型。这种是可以调用成功的,直接编译调用程序,生成.out文件执行即可。需要注意的是,dlopen函数打开so库时的路径需要设置为绝对路径。即定义一个函数指针类型,然后调用dlsym函数强制转换此类型。
2024-02-21 18:28:28
577
原创 windows系统用VS环境开发linux程序之一
按照文中所述,确实在本地和远程都有一样的文件夹。本地直接在VS中运行,即打开shell输出打印。在远程虚拟linux系统,则是进入到对应的文件夹,一般是projects,运行./***.out即可打印输出。正常是先建立linux工程,然后再设置连接虚拟linux系统。如果是要编译自己写的程序,则可以建linux空工程。主要有两种方法,一种是在windows中安装linux子系统,即WSL,另一种是windows系统装linux虚拟机。测试过可以设置自动连接,貌似也可以连上本地windows主机的网卡。
2024-02-21 16:59:10
566
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人