开一贴专门答疑C语言问题
有什么各种C语言的问题尽管问尽量解答。 vscode工程里如果有.a静态库, 编译的时候提示"Fatal Error: cannot open source file" 怎么解决呢 cheungman 发表于 2020-3-13 20:59
vscode工程里如果有.a静态库, 编译的时候提示"Fatal Error: cannot open source file" 怎么解决呢 ...
你这不是c语言问题。你在ide里屏蔽掉这个文件就行了(exclude from compile)。 追随妹子学习C语言{:victory:} 开讲啦,我也跟着学学C,上学那会我们老师教的Passcal。 我有一个关于二级指针与const组合的问题:const u8* const p; 请问这个p没有女朋友怎么办? C语言有对象吗? 谁能告诉怎么把对象追到手....是学会{:biggrin:} **p怎么理解 支持楼主,不过近几年没有语法上的问题 cheungman 发表于 2020-3-13 20:59
vscode工程里如果有.a静态库, 编译的时候提示"Fatal Error: cannot open source file" 怎么解决呢 ...
嵌入式相关和纯C语言问题哦
zhcj66 发表于 2020-3-13 22:53
**p怎么理解
问个有点难度的吧{:tongue:} 我的帖子[原创]在C语言数组初始化中放入任意数据类型里面最后放了一个链表进去,如果不使用指定初始化(写起来太长了,看起来一点也不自由)怎样才能消除掉警告? 如何防止除0? 追随妹子学习C语言 追随妹子学习C语言 让妹子带入C语言的殿堂 在单片机领域,对C语言的掌控程度决定你的路走多远,对外语的掌握程度决定你的路走多宽,C语言真是一门伟大的语言,短小精悍,知识面永无止境,可谓干到老学到老,希望楼主把这帖子开下去,让我也跟着充充电。 C语言巅峰还没过? lbhj310 发表于 2020-3-14 10:02
C语言巅峰还没过?
Linux一天不玩但
C语言永不没落 如何用C语言追妹子 823032003 发表于 2020-3-14 09:02
如何防止除0?
没有特别好的办法。
通过编程习惯解决
在函数体中多做检查
在函数入口处使用宏定义进行参数检查
宏定义是纯粹展开,所以写的时候也要注意平台和编译器的差别,例如
#define full_bit_mask 0xffff
就不如
#define full_bit_mask (0-1)
可移植性高。 既然大神来来, 我就问几个问题
1, 字符串中的部分内容使用宏来代替, 如何实现
2, 使用宏来定义编译时间的年月日时分秒, 但是不是字符串类型,需要int类型
3,C文件里面在使用utf-8编码的情况下,如何给特定的字符串指定编码方式
4,能否把ENUM里面的名称,快速的转换成字符串, 不需要再修改ENUM之后, 再去修改专门的转换函数 三人行必有我师,我是来学习的! 来学习学习! C本质上还是一门简单的语言,基本语法和关键字都不多,更新的也慢(像C#这种现代语言,年年爬起来更新,每个大版本都加功能,学都学不完...
而且因为贴近硬件,到了最后就是在学习特定编译器和具体实现.
当然,确实可以提炼一些有用的通用经验,比如可移植性之类的技巧,但是这部分的内容也是有限的.
当年上大学的时候死磕《C专家编程》和《C陷阱与缺陷》现在想想,书里几乎每个有用的点都在讲编译器,这里有个坑是编译器挖的,那里你会给编译器挖个坑.
所以,老话说的好,<del>学一门语言最好的方式就是去写个编译器<del>~
当然,语言学的好是基础,起码能写二级指针才能玩的出花样,但是日常工作,不夸张的说郭天祥其实够了~
有功夫还是多学学软件工程的相关知识吧~ 这种贴还是要支持的。 Error.Dan 发表于 2020-3-14 19:17
C本质上还是一门简单的语言,基本语法和关键字都不多,更新的也慢(像C#这种现代语言,年年爬起来更新,每个大版 ...
兄弟 说的 太好了。。
c语言 只是一门语言。
最近我在学习 shell 的知识, 其实 更多的是在学习linux的命令 怎么用, 熟悉linux的命令。
软件工程 就是 要有一个全局观来把项目做出来。 而不局限于使用哪门语言, 当然具体的项目用什么语言可以走捷径,那就是经验的积累了!! 大部分写单片机程序的人在工作用C语言最多用到二维数组,到指针就顶天了(还不是函数指针)。什么链表,二叉树,图基本不用。
追随妹子学习C语言 定义一个全局变量,其他复位都不能改变它的值,硬重启才能改变,如何实现 0712 发表于 2020-3-14 21:49
定义一个全局变量,其他复位都不能改变它的值,硬重启才能改变,如何实现 ...
使用分散加载文件,划出内存块,指定该内存块不随软复位而复位。ARM核是这样的,其它架构的不了解。这种一般使用在非法复位后需要重复现场的情况。 感谢楼主乐于助人,遇到的真实问题,请教楼主帮忙解答。有一个8个字节的数组(用于保存串口接收到的数据),怎么快速访问数组的每个字节中的每个位(比如51单片机,访问IO可以是P1_1). 本帖最后由 习学发开 于 2020-3-15 09:57 编辑
liu672992381 发表于 2020-3-15 07:48
感谢楼主乐于助人,遇到的真实问题,请教楼主帮忙解答。有一个8个字节的数组(用于保存串口接收到的数据) ...
请考虑使用结构体+位域组合的方法。
typedef struct
{
unsigned char bit0:1;
unsigned char bit1:1;
...
unsigned char bit63:1;
}_64bit_type_def;
使用的时候:
static _64bit_type_def cache_64bit;
cache_64bit.bit0 = 1;
哎呀呀忘记你问的问题具体了:
应该这么用:
_64bit_type_def * p_cache_64bit = (_64bit_type_def*)&input_array;
p_cache_64bit->bit0 = 1; 本帖最后由 liu672992381 于 2020-3-15 12:58 编辑
习学发开 发表于 2020-3-15 09:27
请考虑使用结构体+位域组合的方法。
typedef struct
定义64个位的结构体,这也太麻烦了。前面的我看懂了,但到了这一句不太懂,麻烦再解答一下。
_64bit_type_def * p_cache_64bit = (_64bit_type_def*)&input_array;
p_cache_64bit->bit0 = 1;
另请教,已知一个数组,想知道数组的每一个字节每一位的二进制数据是多少,下面这种方法是不是最简单的。
charN = {1,2,3,4,5,6,7,8}
N1_n0 = (N & 0x02) == 0x01 ? 1 : 0;
N1_n1 = (N & 0x02) == 0x02 ? 1 : 0;
N1_n2 = (N& 0x04) == 0x04 ? 1 : 0;
N1_n3 = (N& 0x08) == 0x08 ? 1 : 0;
N1_n4 = (N& 0x10) == 0x10 ? 1 : 0;
N1_n5 = (N& 0x20) == 0x20 ? 1 : 0;
N1_n6 = (N& 0x40) == 0x40 ? 1 : 0;
N1_n7 = (N& 0x80) == 0x80 ? 1 : 0;
.............................................................
N7_n7 = (N& 0x80) == 0x80 ? 1 : 0;
还有没有更好的办法,比如写成一个函数,直接获取Fi为数组的第几字节,j为对应的位。
编辑原因,"F"二维数组显示不出来。 c语言内的那个“趋向于”的运算符找不到帖子了 ,大神给讲讲吧 支持一下 unifax001 发表于 2020-3-15 15:50
c语言内的那个“趋向于”的运算符找不到帖子了 ,大神给讲讲吧
具体点,如果可能给英文名称
不然我很难想到~~ 本帖最后由 unifax001 于 2020-3-15 22:06 编辑
习学发开 发表于 2020-3-15 19:40
具体点,如果可能给英文名称
不然我很难想到~~
#include<stdio.h>
int main()
{
int XXKF=0X0A;
while( XXFK --> 0 )
{
printf("%d",XXFK);
}
}
就是这个程序 ,运行的结果是
9 8 7 6 5 4 3 2 1 0 请按任意键继续。。。
就是这个趋向于的运算符 -->
哦 英语可能是Tend to 吧 我不太懂英语 请问书中int (*)怎么理解里雾里的。
unifax001 发表于 2020-3-15 22:04
#include
int main()
这个问题问得好{:titter:} unifax001 发表于 2020-3-15 22:04
#include
int main()
有才,用趋向于 瞬间高大上 unifax001 发表于 2020-3-15 22:04
#include
int main()
{:titter:} unifax001 发表于 2020-3-15 22:04
#include
int main()
哈哈。。。。。。。都别笑 huangqi412 发表于 2020-3-15 22:57
哈哈。。。。。。。都别笑
保不准妹子也在笑了~ 如何减少if liangerfan 发表于 2020-3-16 00:56
如何减少if
switch{:lol:} takashiki 发表于 2020-3-14 08:59
我的帖子[原创]在C语言数组初始化中放入任意数据类型里面最后放了一个链表进去,如果不使用指定初始化(写 ...
你用的什么编译器?GNU C 根本无法通过。 貌似有不少干货{:lol:}先记号,等待更多分享 习学发开 发表于 2020-3-16 22:39
你用的什么编译器?GNU C 根本无法通过。
Keil UV 4.72,开启 --c99 --gnu。
GNU C 根本无法通过的原因应该是SystemInit没有定义吧,这个是MDK的初始化函数,为了把各种各样的类型都塞进去放了个这个。你就在前面放上个 void SystemInit() {} 好了。
我刚才特意用低版本的PC版GCC试了,可以通过,无错误,有警告,调试结果是对的。Code::Blocks 8.02,带的GCC是3.4.5版的。
icoyool 发表于 2020-3-14 11:12
既然大神来来, 我就问几个问题
1, 字符串中的部分内容使用宏来代替, 如何实现
2, 使用宏来定义编译时间的 ...
答:
1. 无法确定你说的具体场合,只好给个我能想到的最接近的:
#defineA first
#defineSTR_EXP(foo) #foo
#defineSTR_CON(foo) STR_EXP(foo)
char* str = "This is the " STR_CON(A) " string.";
printf("%s\n",str);
出不了正确结果请注意勾选 C99和GNU相关选项
2、__DATE___是string,因此可以当作字符数组来用
因此就可以使用这个操作:
(__DATE__[ 7] - '0') * 1000
这个得到的就是int类型的数据。
其他的等我有心情了再答~~
请问下,1、链表在嵌入式软件中的应用场景都有那些呢?2、双向链表,一般是定义头尾指针还是只定义一个头指针进行访问呢?谢谢啦! 如何用C 建立对象? lianglee 发表于 2020-3-17 11:19
多简单的事儿。
谢谢解答。我自己,想了很久,都没有找到好的方法。我试一下,这个行不行。 本帖最后由 csq463276932 于 2020-3-17 14:02 编辑
liu672992381 发表于 2020-3-15 12:56
定义64个位的结构体,这也太麻烦了。前面的我看懂了,但到了这一句不太懂,麻烦再解答一下。
_64bit_type ...
_64bit_type_def * p_cache_64bit = (_64bit_type_def*)&input_array;
类似于这样理解: uchar* p_cache_64bit= (uchar*)&input_array;
_64bit_type_def 是一个新定义的数据类型。
我也有个不大理解的,各位大佬指导指导
static char m_MemArray = {0};
for (i = 0; i < WIN_COUNTOF(m_MemArray); i++)
*(int *)&m_MemArray = (int)&m_MemArray; ssaiwo 发表于 2020-3-17 13:22
我也有个不大理解的,各位大佬指导指导
static char m_MemArray = {0};
for (i = ...
不知道你这写法的用途的意义。 csq463276932 发表于 2020-3-17 14:34
不知道你这写法的用途的意义。
m_MemArray这个数组所有值初始值为0,这个函数是用来传递函数指针和函数形参的,关键我也没看明白 takashiki 发表于 2020-3-17 06:22
Keil UV 4.72,开启 --c99 --gnu。
GNU C 根本无法通过的原因应该是SystemInit没有定义吧,这个是MDK的初 ...
不是
是无法计算数组长度错误,无法通过
我过段时间换一个编译器试试看。 本帖最后由 csq463276932 于 2020-3-17 15:27 编辑
ssaiwo 发表于 2020-3-17 14:46
m_MemArray这个数组所有值初始值为0,这个函数是用来传递函数指针和函数形参的,关键我也没看明白 ...
有点类似这样的使用。 csq463276932 发表于 2020-3-17 15:25
有点类似这样的使用。
换本书吧 canspider 发表于 2020-3-17 15:41
换本书吧
啥意思?是指这本书讲错了?讲得不好?
csq463276932 发表于 2020-3-17 15:25
有点类似这样的使用。
感谢,我好像看明白了,用这个函数可以实现同时传递函数首地址和函数形参 我是来看妹子什么语言无所谓 来学习的 习学发开 发表于 2020-3-14 08:06
嵌入式相关和纯C语言问题哦
有个协议,需要通过MCU的管脚串行发送9bit数据,其中一个是起始位,后边8bit是数据位,怎么能提高整合数据串的效率? 数据长度3~60数据字节 icoyool 发表于 2020-3-14 11:12
既然大神来来, 我就问几个问题
1, 字符串中的部分内容使用宏来代替, 如何实现
2, 使用宏来定义编译时间的 ...
分享珍藏多年的编译时间宏 可以直接调用
#define YEAR ((((__DATE__ - '0') * 10 + (__DATE__ - '0')) * 10 \
+ (__DATE__ - '0')) * 10 + (__DATE__ - '0'))
#define MYYEAR ((__DATE__ - '0') * 10 + (__DATE__ - '0'))
#define MONTH (__DATE__ == 'n' ? (__DATE__ == 'a' ? 0 : 5) \
: __DATE__ == 'b' ? 1 \
: __DATE__ == 'r' ? (__DATE__ == 'M' ? 2 : 3) \
: __DATE__ == 'y' ? 4 \
: __DATE__ == 'n' ? 5 \
: __DATE__ == 'l' ? 6 \
: __DATE__ == 'g' ? 7 \
: __DATE__ == 'p' ? 8 \
: __DATE__ == 't' ? 9 \
: __DATE__ == 'v' ? 10 : 11)
#define DAY ((__DATE__ == ' ' ? 0 : __DATE__ - '0') * 10 \
+ (__DATE__ - '0'))
printf("OK+VER:20%02d%02d%02d\r\n",MYYEAR,(MONTH+1),DAY); 我有一个宏定义的问题. 想实现如下功能
#define ABC(a, b)\
#if( a ) \
abc(b) \
#endif
过不了编译, 有没有其他变通的方法 qinxg 发表于 2020-3-26 17:35
我有一个宏定义的问题. 想实现如下功能
#define ABC(a, b)\
#if( a ) \
变通一下形式能不能接受:
#if (a)
#define ABC(a, b) abc(b)
#else
#define ABC
#endif 823032003 发表于 2020-3-14 09:02
如何防止除0?
为什么要防止除0? 本帖最后由 qinxg 于 2020-3-27 08:56 编辑
uindex 发表于 2020-3-27 01:23
变通一下形式能不能接受:
#if (a)
接受不能.这样会让调试代码到处都是#if..#endif, 没法看
Debug_Chars( DEBUG_APP, "\r\n BleApp_MainHandle() evt_id = %02xH", id);这里只要定义了DEBUG_APP, 这条语句就好打印出来. 而且代码整洁 追随妹子学习C语言 如何让妹子对学习C语言感兴趣? 见过ACM竟赛高手们编写的C程序,各种C语言技巧运用的真是出神入化,让人叹为观止,我想如果让他们对android系统针对某品牌手机进行优化,执行起来是不是应该和苹果的ios一样流畅?尽管没有搞过大型程序,但我坚信,高质量的程序执行起来从各方面比较肯定不一样。 unifax001 发表于 2020-3-15 22:04
#include
int main()
这个是属于奇技淫巧,没有任何意义
忽略即可。 cctv02 发表于 2020-3-15 22:18
请问书中int (*)怎么理解里雾里的。
这个没有办法,只能主观接受它。
前提是你搞清楚“指针数组” 和 “数组指针”的差别。
这种东西存粹是硬性规定,没什么理解不理解的呢 liu672992381 发表于 2020-3-15 12:56
定义64个位的结构体,这也太麻烦了。前面的我看懂了,但到了这一句不太懂,麻烦再解答一下。
_64bit_type ...
"另请教,已知一个数组,想知道数组的每一个字节每一位的二进制数据是多少,下面这种方法是不是最简单的。
charN = {1,2,3,4,5,6,7,8}
N1_n0 = (N & 0x02) == 0x01 ? 1 : 0;
N1_n1 = (N & 0x02) == 0x02 ? 1 : 0;
N1_n2 = (N& 0x04) == 0x04 ? 1 : 0;
N1_n3 = (N& 0x08) == 0x08 ? 1 : 0;
N1_n4 = (N& 0x10) == 0x10 ? 1 : 0;
N1_n5 = (N& 0x20) == 0x20 ? 1 : 0;
N1_n6 = (N& 0x40) == 0x40 ? 1 : 0;
N1_n7 = (N& 0x80) == 0x80 ? 1 : 0;
.............................................................
N7_n7 = (N& 0x80) == 0x80 ? 1 : 0;
还有没有更好的办法,比如写成一个函数,直接获取Fi为数组的第几字节,j为对应的位。
"
还是用我之前讲的结构体指针啊?
用位域,很方便,直接用
你这个应当是看PLC什么的点位吧?
实际操作也可以按字节进行的,没必要用bit一位一位来
但要看情况 liangerfan 发表于 2020-3-16 00:56
如何减少if
有没有什么目的?
if很多时候比swtich case还要优越。 梨花 发表于 2020-3-17 11:08
请问下,1、链表在嵌入式软件中的应用场景都有那些呢?2、双向链表,一般是定义头尾指针还是只定义一个头指 ...
1、大部分情况下用不到。
数据结构只会用在数据量大且对访问效率有要求的场合。
这种场合再嵌入式编程中很少见。
2、这个我也不太清楚,
应当根据需要来吧?
欢迎楼主的义举。 ssaiwo 发表于 2020-3-17 13:22
我也有个不大理解的,各位大佬指导指导
static char m_MemArray = {0};
for (i = ...
需要更多的上下文。
从程序本身看是把二维数组每行开头所在的地址
存放到了自身数组里面
其中(int *) 这个强制转换明显是让一个地址值变为lvalue
必须要有更多的程序来判断这么做的目的 armok 发表于 2020-4-4 17:57
欢迎楼主的义举。
谢谢赞赏{:tongue:} 请问一下,在32b鸡上,有没有办法定义一个16b的float或者double? 楼主什么是EABI?你对此有自己独特的见解吗? gallle 发表于 2020-3-17 16:39
有个协议,需要通过MCU的管脚串行发送9bit数据,其中一个是起始位,后边8bit是数据位,怎么能提高整合数 ...
说实话没有太听懂您的问题哦
您是指尽量少发送数据帧吗?
8个bit的payload已经非常标准了,不知道还怎么压缩剩余空间
如果是10个bit或许还需要做手脚…… zxq6 发表于 2020-4-4 19:32
请问一下,在32b鸡上,有没有办法定义一个16b的float或者double?
数据位实际上都是靠编译器来实现的。
如果编译器原生不支持,那么只能通过手敲代码软件实现了
具体做起来会比较麻烦且执行效率也不会高
一般都是位数低的平台模拟位数高的平台,
很少有倒过来做的,因为64bit平台的float 可以轻松兼容32bit的float,反之未必
可能会有更好的办法呢,这个问题还真的没有仔细考虑过
以前遇到过8bit单片机为了运算足够快,double float只有48bit的 zxq6 发表于 2020-4-4 19:32
请问一下,在32b鸡上,有没有办法定义一个16b的float或者double?
16bit的float就不是float了吧?你想说的是half(GPU之类的硬件支持)吗? yoz 发表于 2020-4-4 21:25
16bit的float就不是float了吧?你想说的是half(GPU之类的硬件支持)吗?
不是,最近研究modbus poll,发现其float类型就是16b的,所以想从单片机直接发送16b的float给modbus poll,然后就能够显示了
我是来学习的 不是情感问题? 习学发开 发表于 2020-4-4 17:14
还是用我之前讲的结构体指针啊?
用位域,很方便,直接用
是自己掉在了怪圈里,一直纠结位这种东西。其实能够一次操作4字节,为什么还要去操作一个位。目前C语言水平,个人觉得处于入门阶段,要想进步只有通过不断写代码吗? zxq6 发表于 2020-4-5 08:14
不是,最近研究modbus poll,发现其float类型就是16b的,所以想从单片机直接发送16b的float给modbus poll ...
modbus 里面的float实际上是32bit,占2个地址
asj1989 发表于 2020-4-7 21:41
modbus 里面的float实际上是32bit,占2个地址
这样啊,我一直以为是16b的,好久试一试,谢谢! 在编程过程中,包含了某个.h文件后,就可以使用bool这个变量类型,但是查不到bool这个类型是哪里定义的,我觉得编译器内部肯定不是真的一个bit存储的,能否请大神讲解一二 qinxg 发表于 2020-3-26 17:35
我有一个宏定义的问题. 想实现如下功能
#define ABC(a, b)\
#if( a ) \
#ifdef APP_DEBUG
#define debugOnly(x) x
#else
#define debugOnly(x)
#endif
#define ABC(b) debugOnly(printf("Debug: %s", b))
lbhj310 发表于 2020-3-14 10:02
C语言巅峰还没过?
冯诺依曼体系什么时候还在用,C 就不会没落
BSMGood 发表于 2020-4-4 19:39
楼主什么是EABI?你对此有自己独特的见解吗?
EABI 是一种接口协议 你当成modbus之类看就行了
它是二进制的接口协议,你调用别人的库的时候 要遵守 所以ABI类似于寄存器使用规则这些? zxq6 发表于 2020-4-4 19:32
请问一下,在32b鸡上,有没有办法定义一个16b的float或者double?
半精度浮点数,也是IEEE标准格式,某次客户要求使用此格式通讯,折腾了好久。参考一下页面,有详细解释以及转换方法
https://stackoverflow.com/questions/3026441/float32-to-float16/3026505
https://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion 异步回调普及下?
页:
[1]
2