硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3408|回复: 51
收起左侧

[MDK] MDK AC6使用sizeof求结构体数组大小,编译报错

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
发表于 2024-7-19 13:14:37 | 显示全部楼层 |阅读模式

代码如下:

[C] 纯文本查看 复制代码
typedef struct
{
        uint32_t Fs;
        uint16_t PLLI2S_N;    /* 范围可以取192--432 */
        uint16_t PLLI2S_Q;    /* 范围可以取2--15    */
        uint8_t  PLLI2S_DivQ; /* 范围可以取1--32    */
        uint8_t  MCKDIV;      /* 范围可以取0--15    */
}PLLI2SPSC_T;

const PLLI2SPSC_T g_tPLLI2SPSC[]=
{ 
        //参数范围192-432   2-15       1-32           
    /* Fs  PLLI2S_N,  PLLI2S_Q  PLLI2S_DivQ  MCKDIV */
        {8000 ,  256,       5,         25,          0},  /* MCLK = 2.048MHz,   实际采样率 = 8000KHz    */
        {16000,  213,       2,         26,          0},         /* MCLK = 4.096153MHz,实际采样率 = 16000.6KHz */
        {32000,  213,       2,         13,          0},         /* MCLK = 8.192307MHz,实际采样率 = 32001KHz   */
        {48000,  258,       3,         7,           0},         /* MCLK = 12.28571MHz, 实际采样率 = 47991KHz   */
        {96000,  344,       2,         7,           0},  /* MCLK = 24.57142MHz, 实际采样率 = 95982KHz   */
        {192000, 393,       2,         4,           0},  /* MCLK = 49.125MHz,   实际采样率 = 191894KHz  */
        
        {11020,  429,       2,        19,           2},  /* MCLK = 2.822368MHz, 实际采样率 = 11.024KHz */ 
        {22050,  429,       2,        19,           1},  /* MCLK = 5.644737MHz, 实际采样率 = 22.049KHz */
        {44100,  429,       2,        19,           0},  /* MCLK = 11.28947MHz, 实际采样率 = 44.099KHz */
}; 


MDK5 AC5没问题,在AC6下使用siezeof(g_tPLLI2SPSC)就会提示错误:



error: invalid application of 'sizeof' to an incomplete type 'const  PLLI2SPSC_T []'
回复

使用道具 举报

97

主题

537

回帖

843

积分

金牌会员

积分
843
发表于 2024-7-19 14:38:01 | 显示全部楼层
试了一下好像没问题呀..
共产主义一定胜利!
回复

使用道具 举报

97

主题

537

回帖

843

积分

金牌会员

积分
843
发表于 2024-7-19 14:44:35 | 显示全部楼层
STM32F103CB.7z (5.41 MB, 下载次数: 1)


1.gif
共产主义一定胜利!
回复

使用道具 举报

24

主题

195

回帖

267

积分

高级会员

积分
267
QQ
发表于 2024-7-19 14:58:59 | 显示全部楼层

我这里AC6测试编译没报错的


QQ截图20240719144541.png

编译器配置如下
5`A[82[KI0JT{}H6UIUD6.png
@R(R0~JOQKOXZ2G)JJETQ.png

C90~C11都试了
keil里也用AC6试了,不会报错
回复

使用道具 举报

24

主题

195

回帖

267

积分

高级会员

积分
267
QQ
发表于 2024-7-19 15:02:59 | 显示全部楼层

老哥你这个gif咋截的?是有方便的小工具吗
回复

使用道具 举报

9

主题

66

回帖

108

积分

初级会员

积分
108
发表于 2024-7-19 15:10:26 | 显示全部楼层
keil530 ac6.14可以编译通过
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 15:15:47 | 显示全部楼层
没问题吧,标准C语言语法
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-19 15:30:24 | 显示全部楼层

我这个是其它文件里面调用的,extern过来后,提示必须指定结构体大小,不能为空。

ps:测试AC5这么使用也不行,不规范
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-19 15:30:27 | 显示全部楼层
h_007 发表于 2024-7-19 15:15
没问题吧,标准C语言语法

我这个是其它文件里面调用的,extern过来后,提示必须指定结构体大小,不能为空。

ps:测试AC5这么使用也不行,不规范
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-19 15:41:16 | 显示全部楼层
yono 发表于 2024-7-19 14:58
我这里AC6测试编译没报错的

我这个是其它文件里面调用的,extern过来后,提示必须指定结构体大小,不能为空。

ps:测试AC5这么使用也不行,不规范
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-19 15:41:23 | 显示全部楼层
egoistaw 发表于 2024-7-19 15:10
keil530 ac6.14可以编译通过

我这个是其它文件里面调用的,extern过来后,提示必须指定结构体大小,不能为空。

ps:测试AC5这么使用也不行,不规范
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 16:03:49 | 显示全部楼层
那就建议直接头文件里直接:const PLLI2SPSC_T g_tPLLI2SPSC[] = {},声明跟定义一起了,不用extern看看
应该没问题呀。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-19 16:10:47 | 显示全部楼层
h_007 发表于 2024-7-19 16:03
那就建议直接头文件里直接:const PLLI2SPSC_T g_tPLLI2SPSC[] = {},声明跟定义一起了,不用extern看看
...

不行,直接来个多文件定义,multi define
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 16:13:28 | 显示全部楼层
啊~~,头文件怎么会包含多次??
#ifndef
#define

#endif
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 16:15:32 | 显示全部楼层
扑朔迷离了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-19 16:25:13 | 显示全部楼层

这种定义方式,多个源文件引用这个头文件就会提示

STM32F103CB.7z (5.15 MB, 下载次数: 4)



Rebuild started: Project: STM32F103CB
*** Using Compiler 'V6.22', folder: 'D:\Keil_v540\ARM\ARMCLANG\Bin'
Rebuild target 'STM32F103CB'
assembling startup_stm32f103xb.s...
compiling stm32f1xx_hal_gpio_ex.c...
compiling stm32f1xx_it.c...
compiling main.c...
compiling stm32f1xx_hal_tim.c...
compiling stm32f1xx_hal_tim_ex.c...
compiling stm32f1xx_hal_msp.c...
compiling stm32f1xx_hal_flash.c...
compiling stm32f1xx_hal_rcc_ex.c...
compiling stm32f1xx_hal_pwr.c...
compiling stm32f1xx_hal.c...
compiling stm32f1xx_hal_cortex.c...
compiling stm32f1xx_hal_gpio.c...
compiling stm32f1xx_hal_flash_ex.c...
compiling stm32f1xx_hal_exti.c...
compiling stm32f1xx_hal_rcc.c...
compiling stm32f1xx_hal_dma.c...
compiling system_stm32f1xx.c...
linking...
STM32F103CB\STM32F103CB.axf: Error: L6200E: Symbol g_tPLLI2SPSC multiply defined (by stm32f1xx_it.o and main.o).
STM32F103CB\STM32F103CB.axf: Error: L6200E: Symbol g_tPLLI2SPSC multiply defined (by stm32f1xx_hal_msp.o and main.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 2 error messages.
"STM32F103CB\STM32F103CB.axf" - 2 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:01

回复

使用道具 举报

684

主题

3511

回帖

5588

积分

论坛元老

积分
5588
发表于 2024-7-19 16:34:33 | 显示全部楼层
eric2013 发表于 2024-7-19 16:25
这种定义方式,多个源文件引用这个头文件就会提示

有时我也遇到过你说的这个问题,我一般都是指定 数组大小
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 16:35:18 | 显示全部楼层
是不是在其他的.c文件里啊,也有同样的g_tPLLI2SPSC 定义呀
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-19 16:52:53 | 显示全部楼层
h_007 发表于 2024-7-19 16:35
是不是在其他的.c文件里啊,也有同样的g_tPLLI2SPSC 定义呀

仅main.h文件定义了。

其它源文件引用这个头文件,MDK就会理解成要定义这么次这个变量
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-19 16:53:16 | 显示全部楼层
hpdell 发表于 2024-7-19 16:34
有时我也遇到过你说的这个问题,我一般都是指定 数组大小

对,得指定大小了。

本来是想不指定,以后升级可以方便添加新成员。
回复

使用道具 举报

23

主题

335

回帖

404

积分

高级会员

积分
404
发表于 2024-7-19 16:55:45 | 显示全部楼层
eric2013 发表于 2024-7-19 16:53
对,得指定大小了。

头文件包含是宏,宏就是复制粘贴,你在哪个源文件包含这个头文件,就在这个源文件里粘贴了一遍定义这个变量的代码。多个源文件包含这个头文件,所以就报重复定义的错误。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-19 16:56:31 | 显示全部楼层
tovinz 发表于 2024-7-19 16:55
头文件包含是宏,宏就是复制粘贴,你在哪个源文件包含这个头文件,就在这个源文件里粘贴了一遍定义这个变 ...

对,这个方案不行。
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 16:58:57 | 显示全部楼层
本帖最后由 h_007 于 2024-7-19 17:07 编辑

帮你试了一下,加static修饰,这样改可以的:
static const PLLI2SPSC_T g_tPLLI2SPSC[] = {};
编译可以通过,不报错
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 17:01:42 | 显示全部楼层
eric2013 发表于 2024-7-19 16:56
对,这个方案不行。

你再确认一下看看
回复

使用道具 举报

23

主题

335

回帖

404

积分

高级会员

积分
404
发表于 2024-7-19 17:01:57 | 显示全部楼层
本帖最后由 tovinz 于 2024-7-19 17:05 编辑

你是一定要在头文件定义数据吗,其实方法也很简单
微信截图_20240719170417.png 微信截图_20240719170121.png
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 17:05:00 | 显示全部楼层
在头文件里,static是可以解决多次定义的问题的

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 17:10:26 | 显示全部楼层
@Eric帮我加点分,升级下会员
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-19 17:21:16 | 显示全部楼层
h_007 发表于 2024-7-19 17:10
@Eric帮我加点分,升级下会员



可以,加100分
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-19 17:21:38 | 显示全部楼层
tovinz 发表于 2024-7-19 17:01
你是一定要在头文件定义数据吗,其实方法也很简单

谢谢分享。
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 17:35:23 | 显示全部楼层
怎么加金币好像没用,积分还是不变,升不了级
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 18:03:15 | 显示全部楼层
貌似要加精才行了
回复

使用道具 举报

18

主题

306

回帖

360

积分

高级会员

积分
360
发表于 2024-7-19 19:43:37 | 显示全部楼层
h_007 发表于 2024-7-19 17:05
在头文件里,static是可以解决多次定义的问题的

static inline效果更好
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 20:40:17 | 显示全部楼层
不是函数,不用inline
回复

使用道具 举报

4

主题

391

回帖

403

积分

高级会员

积分
403
发表于 2024-7-19 22:45:13 | 显示全部楼层
前排学习,最后是怎么解决的呢
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 23:03:43 | 显示全部楼层
cctv180 发表于 2024-7-19 22:45
前排学习,最后是怎么解决的呢

在头文件main.h里添加static修饰:
static const PLLI2SPSC_T g_tPLLI2SPSC[] = {};
你可以下载上面的项目文件,自己试一试
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-20 09:17:52 | 显示全部楼层
cctv180 发表于 2024-7-19 22:45
前排学习,最后是怎么解决的呢

两个方法
1、方法1,直接指定大小,不用不定义大小了。
2、方法2,都定义到h文件,定义的前面加static,防止重定义。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-20 09:19:00 | 显示全部楼层
h_007 发表于 2024-7-19 17:35
怎么加金币好像没用,积分还是不变,升不了级

这个就是金币,可以兑换积分,后面我研究下后台怎么兑换的。
回复

使用道具 举报

4

主题

391

回帖

403

积分

高级会员

积分
403
发表于 2024-7-22 10:07:43 | 显示全部楼层
eric2013 发表于 2024-7-20 09:17
两个方法
1、方法1,直接指定大小,不用不定义大小了。
2、方法2,都定义到h文件,定义的前面加static ...

收到收到
补个mdk上面说的做法 额外定义个常量用于保存长度,如const size_t my_string_size = sizeof(my_string);
https://community.arm.com/suppor ... eyword-for-an-array
回复

使用道具 举报

6

主题

269

回帖

287

积分

高级会员

积分
287
发表于 2024-7-22 11:38:01 | 显示全部楼层
yono 发表于 2024-7-19 14:58
我这里AC6测试编译没报错的

你这个图片是什么软件?感觉这么优雅呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116217
QQ
 楼主| 发表于 2024-7-22 12:10:01 | 显示全部楼层
cctv180 发表于 2024-7-22 10:07
收到收到
补个mdk上面说的做法 额外定义个常量用于保存长度,如const size_t my_string_size = sizeof(m ...

一模一样的问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 10:01 , Processed in 0.895872 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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