搜索
bottom↓
回复: 123

开一贴专门答疑C语言问题

  [复制链接]

出0入0汤圆

发表于 2020-3-13 20:47:27 | 显示全部楼层 |阅读模式
有什么各种C语言的问题尽管问

尽量解答。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2020-3-13 20:59:14 | 显示全部楼层
vscode工程里如果有.a静态库, 编译的时候提示"Fatal Error[Pe1696]: cannot open source file" 怎么解决呢

出0入442汤圆

发表于 2020-3-13 21:06:59 来自手机 | 显示全部楼层
cheungman 发表于 2020-3-13 20:59
vscode工程里如果有.a静态库, 编译的时候提示"Fatal Error: cannot open source file" 怎么解决呢 ...

你这不是c语言问题。你在ide里屏蔽掉这个文件就行了(exclude from compile)。

出130入129汤圆

发表于 2020-3-13 21:29:09 | 显示全部楼层
追随妹子学习C语言

出0入9汤圆

发表于 2020-3-13 21:46:55 | 显示全部楼层
开讲啦,我也跟着学学C,上学那会我们老师教的Passcal。

出590入992汤圆

发表于 2020-3-13 22:08:16 | 显示全部楼层
我有一个关于二级指针与const组合的问题:const u8* const p; 请问这个p没有女朋友怎么办?

出0入0汤圆

发表于 2020-3-13 22:35:56 | 显示全部楼层
C语言有对象吗?

出0入14汤圆

发表于 2020-3-13 22:41:15 | 显示全部楼层
谁能告诉怎么把对象追到手....是学会

出0入53汤圆

发表于 2020-3-13 22:53:50 来自手机 | 显示全部楼层
**p怎么理解

出0入0汤圆

发表于 2020-3-13 23:05:36 | 显示全部楼层
支持楼主,不过近几年没有语法上的问题

出0入0汤圆

 楼主| 发表于 2020-3-14 08:06:14 | 显示全部楼层
cheungman 发表于 2020-3-13 20:59
vscode工程里如果有.a静态库, 编译的时候提示"Fatal Error: cannot open source file" 怎么解决呢 ...

嵌入式相关和纯C语言问题哦

出0入0汤圆

 楼主| 发表于 2020-3-14 08:07:12 | 显示全部楼层

问个有点难度的吧

出0入93汤圆

发表于 2020-3-14 08:59:39 | 显示全部楼层
我的帖子[原创]在C语言数组初始化中放入任意数据类型里面最后放了一个链表进去,如果不使用指定初始化(写起来太长了,看起来一点也不自由)怎样才能消除掉警告?

出0入0汤圆

发表于 2020-3-14 09:02:46 来自手机 | 显示全部楼层
如何防止除0?

出90入0汤圆

发表于 2020-3-14 09:14:15 | 显示全部楼层
追随妹子学习C语言

出0入0汤圆

发表于 2020-3-14 09:20:20 | 显示全部楼层
追随妹子学习C语言

出0入12汤圆

发表于 2020-3-14 09:53:33 | 显示全部楼层
让妹子带入C语言的殿堂

出20入30汤圆

发表于 2020-3-14 10:00:51 | 显示全部楼层
在单片机领域,对C语言的掌控程度决定你的路走多远,对外语的掌握程度决定你的路走多宽,C语言真是一门伟大的语言,短小精悍,知识面永无止境,可谓干到老学到老,希望楼主把这帖子开下去,让我也跟着充充电。

出0入0汤圆

发表于 2020-3-14 10:02:20 | 显示全部楼层
C语言巅峰还没过?

出0入0汤圆

 楼主| 发表于 2020-3-14 10:52:28 | 显示全部楼层
lbhj310 发表于 2020-3-14 10:02
C语言巅峰还没过?

Linux一天不玩但

C语言永不没落

出0入12汤圆

发表于 2020-3-14 10:54:01 | 显示全部楼层
如何用C语言追妹子

出0入0汤圆

 楼主| 发表于 2020-3-14 10:56:59 | 显示全部楼层

没有特别好的办法。

通过编程习惯解决

在函数体中多做检查

在函数入口处使用宏定义进行参数检查

宏定义是纯粹展开,所以写的时候也要注意平台和编译器的差别,例如

#define full_bit_mask 0xffff

就不如

#define full_bit_mask (0-1)

可移植性高。

出0入8汤圆

发表于 2020-3-14 11:12:35 | 显示全部楼层
既然大神来来, 我就问几个问题
1, 字符串中的部分内容使用宏来代替, 如何实现  
2, 使用宏来定义编译时间的年月日时分秒, 但是不是字符串类型,需要int类型
3,C文件里面在使用utf-8编码的情况下,  如何给特定的字符串指定编码方式
4,能否把ENUM里面的名称,快速的转换成字符串, 不需要再修改ENUM之后, 再去修改专门的转换函数

出0入0汤圆

发表于 2020-3-14 12:27:58 | 显示全部楼层
三人行必有我师,我是来学习的!

出0入0汤圆

发表于 2020-3-14 14:16:38 | 显示全部楼层
来学习学习!

出0入20汤圆

发表于 2020-3-14 19:17:28 | 显示全部楼层
C本质上还是一门简单的语言,基本语法和关键字都不多,更新的也慢(像C#这种现代语言,年年爬起来更新,每个大版本都加功能,学都学不完...
而且因为贴近硬件,到了最后就是在学习特定编译器和具体实现.
当然,确实可以提炼一些有用的通用经验,比如可移植性之类的技巧,但是这部分的内容也是有限的.

当年上大学的时候死磕《C专家编程》和《C陷阱与缺陷》现在想想,书里几乎每个有用的点都在讲编译器,这里有个坑是编译器挖的,那里你会给编译器挖个坑.
所以,老话说的好,<del>学一门语言最好的方式就是去写个编译器<del>~

当然,语言学的好是基础,起码能写二级指针才能玩的出花样,但是日常工作,不夸张的说郭天祥其实够了~
有功夫还是多学学软件工程的相关知识吧~

出0入0汤圆

发表于 2020-3-14 19:34:05 | 显示全部楼层
这种贴还是要支持的。

出0入25汤圆

发表于 2020-3-14 19:40:09 | 显示全部楼层
Error.Dan 发表于 2020-3-14 19:17
C本质上还是一门简单的语言,基本语法和关键字都不多,更新的也慢(像C#这种现代语言,年年爬起来更新,每个大版 ...



兄弟 说的 太好了。。

c语言 只是一门语言。   

最近我在学习 shell 的知识, 其实 更多的是在学习linux的命令 怎么用, 熟悉linux的命令。


软件工程 就是 要有一个全局观来把项目做出来。 而不局限于使用哪门语言, 当然具体的项目用什么语言可以走捷径,那就是经验的积累了!!

出0入0汤圆

发表于 2020-3-14 20:49:37 | 显示全部楼层
大部分写单片机程序的人在工作用C语言最多用到二维数组,到指针就顶天了(还不是函数指针)。什么链表,二叉树,图基本不用。

出0入0汤圆

发表于 2020-3-14 21:28:53 | 显示全部楼层

追随妹子学习C语言

出0入0汤圆

发表于 2020-3-14 21:49:00 来自手机 | 显示全部楼层
定义一个全局变量,其他复位都不能改变它的值,硬重启才能改变,如何实现

出0入0汤圆

发表于 2020-3-14 23:42:43 | 显示全部楼层
0712 发表于 2020-3-14 21:49
定义一个全局变量,其他复位都不能改变它的值,硬重启才能改变,如何实现 ...

使用分散加载文件,划出内存块,指定该内存块不随软复位而复位。ARM核是这样的,其它架构的不了解。这种一般使用在非法复位后需要重复现场的情况。

出0入0汤圆

发表于 2020-3-15 07:48:31 | 显示全部楼层
感谢楼主乐于助人,遇到的真实问题,请教楼主帮忙解答。有一个8个字节的数组(用于保存串口接收到的数据),怎么快速访问数组的每个字节中的每个位(比如51单片机,访问IO可以是P1_1).

出0入0汤圆

 楼主| 发表于 2020-3-15 09:27:06 | 显示全部楼层
本帖最后由 习学发开 于 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;

出0入0汤圆

发表于 2020-3-15 12:56:50 | 显示全部楼层
本帖最后由 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;

另请教,已知一个数组,想知道数组的每一个字节每一位的二进制数据是多少,下面这种方法是不是最简单的。
char  N[8] = {1,2,3,4,5,6,7,8}
N1_n0 = (N[1] & 0x02) == 0x01 ? 1 : 0;
N1_n1 = (N[1] & 0x02) == 0x02 ? 1 : 0;
N1_n2 = (N[1]  & 0x04) == 0x04 ? 1 : 0;
N1_n3 = (N[1]  & 0x08) == 0x08 ? 1 : 0;
N1_n4 = (N[1]  & 0x10) == 0x10 ? 1 : 0;
N1_n5 = (N[1]  & 0x20) == 0x20 ? 1 : 0;
N1_n6 = (N[1]  & 0x40) == 0x40 ? 1 : 0;
N1_n7 = (N[1]  & 0x80) == 0x80 ? 1 : 0;
.............................................................
N7_n7 = (N[7]  & 0x80) == 0x80 ? 1 : 0;

还有没有更好的办法,比如写成一个函数,直接获取F[j]  i为数组的第几字节,j为对应的位。


编辑原因,"F[j]"二维数组显示不出来。

出0入54汤圆

发表于 2020-3-15 15:50:52 | 显示全部楼层
c语言内的那个“趋向于”的运算符找不到帖子了 ,大神给讲讲吧

出0入0汤圆

发表于 2020-3-15 18:31:19 | 显示全部楼层
支持一下

出0入0汤圆

 楼主| 发表于 2020-3-15 19:40:21 | 显示全部楼层
unifax001 发表于 2020-3-15 15:50
c语言内的那个“趋向于”的运算符找不到帖子了 ,大神给讲讲吧

具体点,如果可能给英文名称

不然我很难想到~~

出0入54汤圆

发表于 2020-3-15 22:04:19 | 显示全部楼层
本帖最后由 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 吧 我不太懂英语

出0入0汤圆

发表于 2020-3-15 22:18:54 | 显示全部楼层
请问书中int (*)[2]怎么理解里雾里的。
QQ截图20200315221732.jpg

出0入0汤圆

发表于 2020-3-15 22:31:26 | 显示全部楼层

这个问题问得好

出0入4汤圆

发表于 2020-3-15 22:32:01 | 显示全部楼层

有才,用趋向于 瞬间高大上

出0入0汤圆

发表于 2020-3-15 22:37:20 | 显示全部楼层

出0入0汤圆

发表于 2020-3-15 22:57:14 来自手机 | 显示全部楼层
unifax001 发表于 2020-3-15 22:04
#include

int main()

哈哈。。。。。。。都别笑

出0入8汤圆

发表于 2020-3-15 23:02:31 | 显示全部楼层
huangqi412 发表于 2020-3-15 22:57
哈哈。。。。。。。都别笑

保不准妹子也在笑了~

出0入0汤圆

发表于 2020-3-16 00:56:30 来自手机 | 显示全部楼层
如何减少if

出0入0汤圆

发表于 2020-3-16 17:13:26 | 显示全部楼层

switch

出0入0汤圆

 楼主| 发表于 2020-3-16 22:39:08 | 显示全部楼层
takashiki 发表于 2020-3-14 08:59
我的帖子[原创]在C语言数组初始化中放入任意数据类型里面最后放了一个链表进去,如果不使用指定初始化(写 ...

你用的什么编译器?GNU C 根本无法通过。

出0入0汤圆

发表于 2020-3-17 05:24:16 | 显示全部楼层
貌似有不少干货先记号,等待更多分享

出0入93汤圆

发表于 2020-3-17 06:22:33 | 显示全部楼层
习学发开 发表于 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版的。

abc.png

出0入0汤圆

 楼主| 发表于 2020-3-17 09:35:37 | 显示全部楼层
icoyool 发表于 2020-3-14 11:12
既然大神来来, 我就问几个问题
1, 字符串中的部分内容使用宏来代替, 如何实现  
2, 使用宏来定义编译时间的 ...

答:

1. 无法确定你说的具体场合,只好给个我能想到的最接近的:

#define  A first
#define  STR_EXP(foo) #foo
#define  STR_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类型的数据。

其他的等我有心情了再答~~

出0入0汤圆

发表于 2020-3-17 11:08:19 | 显示全部楼层
请问下,1、链表在嵌入式软件中的应用场景都有那些呢?2、双向链表,一般是定义头尾指针还是只定义一个头指针进行访问呢?谢谢啦!

出0入4汤圆

发表于 2020-3-17 11:15:45 | 显示全部楼层
如何用C 建立对象?

出0入0汤圆

发表于 2020-3-17 11:40:37 | 显示全部楼层

谢谢解答。我自己,想了很久,都没有找到好的方法。我试一下,这个行不行。

出0入0汤圆

发表于 2020-3-17 13:15:57 | 显示全部楼层
本帖最后由 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 是一个新定义的数据类型。

出0入0汤圆

发表于 2020-3-17 13:22:34 | 显示全部楼层
我也有个不大理解的,各位大佬指导指导
static char m_MemArray[12][4 * sizeof(int)] = {0};
    for (i = 0; i < WIN_COUNTOF(m_MemArray); i++)
        *(int *)&m_MemArray[i][0] = (int)&m_MemArray[i][0];

出0入0汤圆

发表于 2020-3-17 14:34:05 | 显示全部楼层
ssaiwo 发表于 2020-3-17 13:22
我也有个不大理解的,各位大佬指导指导
static char m_MemArray[12][4 * sizeof(int)] = {0};
    for (i = ...


不知道你这写法的用途的意义。
123.png

出0入0汤圆

发表于 2020-3-17 14:46:33 | 显示全部楼层
csq463276932 发表于 2020-3-17 14:34
不知道你这写法的用途的意义。

m_MemArray这个数组所有值初始值为0,这个函数是用来传递函数指针和函数形参的,关键我也没看明白

出0入0汤圆

 楼主| 发表于 2020-3-17 15:24:51 | 显示全部楼层
takashiki 发表于 2020-3-17 06:22
Keil UV 4.72,开启 --c99 --gnu。
GNU C 根本无法通过的原因应该是SystemInit没有定义吧,这个是MDK的初 ...

不是

是无法计算数组长度错误,无法通过

我过段时间换一个编译器试试看。

出0入0汤圆

发表于 2020-3-17 15:25:41 | 显示全部楼层
本帖最后由 csq463276932 于 2020-3-17 15:27 编辑
ssaiwo 发表于 2020-3-17 14:46
m_MemArray这个数组所有值初始值为0,这个函数是用来传递函数指针和函数形参的,关键我也没看明白 ...


有点类似这样的使用。
2020-3-17 15-24-32.png

出0入8汤圆

发表于 2020-3-17 15:41:24 来自手机 | 显示全部楼层
csq463276932 发表于 2020-3-17 15:25
有点类似这样的使用。

换本书吧

出0入0汤圆

发表于 2020-3-17 15:50:12 | 显示全部楼层

啥意思?是指这本书讲错了?讲得不好?

出0入0汤圆

发表于 2020-3-17 15:55:21 | 显示全部楼层
csq463276932 发表于 2020-3-17 15:25
有点类似这样的使用。

感谢,我好像看明白了,用这个函数可以实现同时传递函数首地址和函数形参

出0入0汤圆

发表于 2020-3-17 16:11:17 | 显示全部楼层
我是来看妹子  什么语言无所谓

出0入0汤圆

发表于 2020-3-17 16:35:20 | 显示全部楼层
来学习的

出0入96汤圆

发表于 2020-3-17 16:39:51 | 显示全部楼层
习学发开 发表于 2020-3-14 08:06
嵌入式相关和纯C语言问题哦

有个协议,需要通过MCU的管脚串行发送9bit数据,其中一个是起始位,后边8bit是数据位,怎么能提高整合数据串的效率? 数据长度3~60数据字节

出0入0汤圆

发表于 2020-3-25 17:43:52 | 显示全部楼层
icoyool 发表于 2020-3-14 11:12
既然大神来来, 我就问几个问题
1, 字符串中的部分内容使用宏来代替, 如何实现  
2, 使用宏来定义编译时间的 ...

分享珍藏多年的编译时间宏 可以直接调用
  1. #define YEAR ((((__DATE__ [7] - '0') * 10 + (__DATE__ [8] - '0')) * 10 \
  2.     + (__DATE__ [9] - '0')) * 10 + (__DATE__ [10] - '0'))

  3. #define MYYEAR ((__DATE__ [9] - '0') * 10 + (__DATE__ [10] - '0'))
  4. #define MONTH (__DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 0 : 5) \
  5.     : __DATE__ [2] == 'b' ? 1 \
  6.     : __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 2 : 3) \
  7.     : __DATE__ [2] == 'y' ? 4 \
  8.     : __DATE__ [2] == 'n' ? 5 \
  9.     : __DATE__ [2] == 'l' ? 6 \
  10.     : __DATE__ [2] == 'g' ? 7 \
  11.     : __DATE__ [2] == 'p' ? 8 \
  12.     : __DATE__ [2] == 't' ? 9 \
  13.     : __DATE__ [2] == 'v' ? 10 : 11)

  14. #define DAY ((__DATE__ [4] == ' ' ? 0 : __DATE__ [4] - '0') * 10 \
  15.     + (__DATE__ [5] - '0'))
复制代码

  1. printf("OK+VER:20%02d%02d%02d\r\n",MYYEAR,(MONTH+1),DAY);
复制代码

出0入4汤圆

发表于 2020-3-26 17:35:21 | 显示全部楼层
我有一个宏定义的问题. 想实现如下功能
#define ABC(a, b)  \
#if( a ) \
abc(b) \
#endif
过不了编译, 有没有其他变通的方法

出0入8汤圆

发表于 2020-3-27 01:23:02 | 显示全部楼层
qinxg 发表于 2020-3-26 17:35
我有一个宏定义的问题. 想实现如下功能
#define ABC(a, b)  \
#if( a ) \

变通一下形式能不能接受:

#if (a)
    #define ABC(a, b) abc(b)
#else
    #define ABC
#endif

出0入93汤圆

发表于 2020-3-27 01:58:22 | 显示全部楼层

为什么要防止除0?

出0入4汤圆

发表于 2020-3-27 08:54:51 | 显示全部楼层
本帖最后由 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, 这条语句就好打印出来. 而且代码整洁

出0入0汤圆

发表于 2020-3-27 14:24:21 | 显示全部楼层
追随妹子学习C语言

出0入4汤圆

发表于 2020-3-27 15:25:44 | 显示全部楼层
如何让妹子对学习C语言感兴趣?

出20入30汤圆

发表于 2020-3-27 16:09:31 来自手机 | 显示全部楼层
见过ACM竟赛高手们编写的C程序,各种C语言技巧运用的真是出神入化,让人叹为观止,我想如果让他们对android系统针对某品牌手机进行优化,执行起来是不是应该和苹果的ios一样流畅?尽管没有搞过大型程序,但我坚信,高质量的程序执行起来从各方面比较肯定不一样。

出0入0汤圆

 楼主| 发表于 2020-4-4 16:33:21 | 显示全部楼层

这个是属于奇技淫巧,没有任何意义

忽略即可。

出0入0汤圆

 楼主| 发表于 2020-4-4 16:45:27 | 显示全部楼层
cctv02 发表于 2020-3-15 22:18
请问书中int (*)[2]怎么理解里雾里的。

这个没有办法,只能主观接受它。

前提是你搞清楚“指针数组” 和 “数组指针”的差别。

这种东西存粹是硬性规定,没什么理解不理解的呢

出0入0汤圆

 楼主| 发表于 2020-4-4 17:14:38 | 显示全部楼层
liu672992381 发表于 2020-3-15 12:56
定义64个位的结构体,这也太麻烦了。前面的我看懂了,但到了这一句不太懂,麻烦再解答一下。
_64bit_type ...
"另请教,已知一个数组,想知道数组的每一个字节每一位的二进制数据是多少,下面这种方法是不是最简单的。
char  N[8] = {1,2,3,4,5,6,7,8}
N1_n0 = (N[1] & 0x02) == 0x01 ? 1 : 0;
N1_n1 = (N[1] & 0x02) == 0x02 ? 1 : 0;
N1_n2 = (N[1]  & 0x04) == 0x04 ? 1 : 0;
N1_n3 = (N[1]  & 0x08) == 0x08 ? 1 : 0;
N1_n4 = (N[1]  & 0x10) == 0x10 ? 1 : 0;
N1_n5 = (N[1]  & 0x20) == 0x20 ? 1 : 0;
N1_n6 = (N[1]  & 0x40) == 0x40 ? 1 : 0;
N1_n7 = (N[1]  & 0x80) == 0x80 ? 1 : 0;
.............................................................
N7_n7 = (N[7]  & 0x80) == 0x80 ? 1 : 0;

还有没有更好的办法,比如写成一个函数,直接获取F[j]  i为数组的第几字节,j为对应的位。
"


还是用我之前讲的结构体指针啊?

用位域,很方便,直接用

你这个应当是看PLC什么的点位吧?

实际操作也可以按字节进行的,没必要用bit一位一位来

但要看情况

出0入0汤圆

 楼主| 发表于 2020-4-4 17:15:24 | 显示全部楼层

有没有什么目的?

if很多时候比swtich case还要优越。

出0入0汤圆

 楼主| 发表于 2020-4-4 17:21:21 | 显示全部楼层
梨花 发表于 2020-3-17 11:08
请问下,1、链表在嵌入式软件中的应用场景都有那些呢?2、双向链表,一般是定义头尾指针还是只定义一个头指 ...

1、大部分情况下用不到。

数据结构只会用在数据量大且对访问效率有要求的场合。

这种场合再嵌入式编程中很少见。

2、这个我也不太清楚,

应当根据需要来吧?

出16170入6148汤圆

发表于 2020-4-4 17:57:14 | 显示全部楼层
欢迎楼主的义举。

出0入0汤圆

 楼主| 发表于 2020-4-4 19:13:19 | 显示全部楼层
ssaiwo 发表于 2020-3-17 13:22
我也有个不大理解的,各位大佬指导指导
static char m_MemArray[12][4 * sizeof(int)] = {0};
    for (i = ...

需要更多的上下文。

从程序本身看是把二维数组每行开头所在的地址

存放到了自身数组里面

其中(int *) 这个强制转换明显是让一个地址值变为lvalue

必须要有更多的程序来判断这么做的目的

出0入0汤圆

 楼主| 发表于 2020-4-4 19:13:38 | 显示全部楼层
armok 发表于 2020-4-4 17:57
欢迎楼主的义举。

谢谢赞赏

出0入22汤圆

发表于 2020-4-4 19:32:24 来自手机 | 显示全部楼层
请问一下,在32b鸡上,有没有办法定义一个16b的float或者double?

出0入0汤圆

发表于 2020-4-4 19:39:16 来自手机 | 显示全部楼层
楼主什么是EABI?你对此有自己独特的见解吗?

出0入0汤圆

 楼主| 发表于 2020-4-4 19:52:36 | 显示全部楼层
gallle 发表于 2020-3-17 16:39
有个协议,需要通过MCU的管脚串行发送9bit数据,其中一个是起始位,后边8bit是数据位,怎么能提高整合数 ...

说实话没有太听懂您的问题哦


您是指尽量少发送数据帧吗?

8个bit的payload已经非常标准了,不知道还怎么压缩剩余空间

如果是10个bit或许还需要做手脚……

出0入0汤圆

 楼主| 发表于 2020-4-4 19:59:02 | 显示全部楼层
zxq6 发表于 2020-4-4 19:32
请问一下,在32b鸡上,有没有办法定义一个16b的float或者double?

数据位实际上都是靠编译器来实现的。

如果编译器原生不支持,那么只能通过手敲代码软件实现了

具体做起来会比较麻烦且执行效率也不会高

一般都是位数低的平台模拟位数高的平台,

很少有倒过来做的,因为64bit平台的float 可以轻松兼容32bit的float,反之未必

可能会有更好的办法呢,这个问题还真的没有仔细考虑过

以前遇到过8bit单片机为了运算足够快,double float只有48bit的

出10入0汤圆

发表于 2020-4-4 21:25:02 | 显示全部楼层
zxq6 发表于 2020-4-4 19:32
请问一下,在32b鸡上,有没有办法定义一个16b的float或者double?

16bit的float就不是float了吧?你想说的是half(GPU之类的硬件支持)吗?

出0入22汤圆

发表于 2020-4-5 08:14:23 | 显示全部楼层
yoz 发表于 2020-4-4 21:25
16bit的float就不是float了吧?你想说的是half(GPU之类的硬件支持)吗?

不是,最近研究modbus poll,发现其float类型就是16b的,所以想从单片机直接发送16b的float给modbus poll,然后就能够显示了

出0入0汤圆

发表于 2020-4-5 22:41:09 来自手机 | 显示全部楼层
我是来学习的

出4375入62汤圆

发表于 2020-4-7 09:20:15 | 显示全部楼层
不是情感问题?

出0入0汤圆

发表于 2020-4-7 17:53:39 | 显示全部楼层
习学发开 发表于 2020-4-4 17:14
还是用我之前讲的结构体指针啊?

用位域,很方便,直接用

是自己掉在了怪圈里,一直纠结位这种东西。其实能够一次操作4字节,为什么还要去操作一个位。目前C语言水平,个人觉得处于入门阶段,要想进步只有通过不断写代码吗?

出0入131汤圆

发表于 2020-4-7 21:41:27 | 显示全部楼层
zxq6 发表于 2020-4-5 08:14
不是,最近研究modbus poll,发现其float类型就是16b的,所以想从单片机直接发送16b的float给modbus poll ...

modbus 里面的float实际上是32bit,占2个地址

QQ截图20200407213853.jpg

出0入22汤圆

发表于 2020-4-8 08:45:31 | 显示全部楼层
asj1989 发表于 2020-4-7 21:41
modbus 里面的float实际上是32bit,占2个地址

这样啊,我一直以为是16b的,好久试一试,谢谢!

出5入4汤圆

发表于 2020-4-8 09:39:55 来自手机 | 显示全部楼层
在编程过程中,包含了某个.h文件后,就可以使用bool这个变量类型,但是查不到bool这个类型是哪里定义的,我觉得编译器内部肯定不是真的一个bit存储的,能否请大神讲解一二

出0入0汤圆

发表于 2020-4-8 22:35:05 | 显示全部楼层
qinxg 发表于 2020-3-26 17:35
我有一个宏定义的问题. 想实现如下功能
#define ABC(a, b)  \
#if( a ) \

  1. #ifdef APP_DEBUG
  2. #define debugOnly(x) x
  3. #else
  4. #define debugOnly(x)
  5. #endif

  6. #define ABC(b) debugOnly(printf("Debug: %s", b))
复制代码

出0入0汤圆

发表于 2020-4-9 23:09:35 | 显示全部楼层
lbhj310 发表于 2020-3-14 10:02
C语言巅峰还没过?

冯诺依曼体系什么时候还在用,C 就不会没落

出0入0汤圆

发表于 2020-4-9 23:13:00 | 显示全部楼层
BSMGood 发表于 2020-4-4 19:39
楼主什么是EABI?你对此有自己独特的见解吗?

EABI 是一种接口协议 你当成modbus之类看就行了
它是二进制的接口协议,你调用别人的库的时候 要遵守

出0入0汤圆

发表于 2020-4-9 23:28:10 来自手机 | 显示全部楼层
所以ABI类似于寄存器使用规则这些?

出0入0汤圆

发表于 2020-4-10 09:05:25 | 显示全部楼层
zxq6 发表于 2020-4-4 19:32
请问一下,在32b鸡上,有没有办法定义一个16b的float或者double?

半精度浮点数,也是IEEE标准格式,某次客户要求使用此格式通讯,折腾了好久。参考一下页面,有详细解释以及转换方法
https://stackoverflow.com/questi ... -to-float16/3026505
https://stackoverflow.com/questi ... ng-point-conversion

出0入0汤圆

发表于 2020-4-11 08:41:24 来自手机 | 显示全部楼层
异步回调普及下?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 07:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表