OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4486|回复: 28

求教一个关于数组方面的问题

[复制链接]

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
发表于 2018-1-2 14:28:30 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 rjx007 于 2018-1-2 15:02 编辑

数组里的元素是否只能是常量而不能是变量? 我定义的一个数组为什么会报错(语句前有个红叉)?

请看:
long lBUFMAG[NPT+NPT/2];                //存储求模后的数据

//从126个模值中挑选出25个模值,在OLED屏上显示出25条柱型,挑选的原则是以0-4K频率段为主,4K-8K频段次之,8K-18K再次之。
× u8 COLUMN1[]={lBUFMAG[1],lBUFMAG[2],lBUFMAG[3],lBUFMAG[4],lBUFMAG[5],lBUFMAG[6],lBUFMAG[7],lBUFMAG[8],lBUFMAG[9],lBUFMAG[10],
                           lBUFMAG[11],lBUFMAG[13],lBUFMAG[16],lBUFMAG[19],lBUFMAG[23],lBUFMAG[26],lBUFMAG[29],lBUFMAG[32],lBUFMAG[38],                                  lBUFMAG[45],lBUFMAG[51],lBUFMAG[64],lBUFMAG[77],lBUFMAG[90],lBUFMAG[115] };
                     
报错的信息为:error: initializer elemet is not a compile-time constant.







最佳答案

查看完整内容[请看2#楼]

吓得我赶紧回去试了一下,还是报错,keil中变量初始化还是直接赋值常量的好 楼主给你写个简单赋值程序吧 #define NPT 1 long lBUFMAG[NPT+NPT/10]; void arctan(void) { u8 i,temp,a[14]={13,16,19,23,26,29,32,38,45,51,64,77,90,115}; u8 COLUMN1[25]; for(i=0;i
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1194
金钱
1194
注册时间
2017-8-31
在线时间
295 小时
发表于 2018-1-2 14:28:31 | 显示全部楼层
吓得我赶紧回去试了一下,还是报错,keil中变量初始化还是直接赋值常量的好
楼主给你写个简单赋值程序吧
#define NPT  1
long lBUFMAG[NPT+NPT/10];
void arctan(void)  
{
        u8 i,temp,a[14]={13,16,19,23,26,29,32,38,45,51,64,77,90,115};
  u8 COLUMN1[25];
        for(i=0;i<11;i++)
                COLUMN1[i]=        lBUFMAG[i];
        for(i=0;i<14;i++)
        {
         temp=a[i];
         COLUMN1[i+12]=        lBUFMAG[temp];               
        }                                                 
}
回复

使用道具 举报

2

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2017-9-27
在线时间
101 小时
发表于 2018-1-2 14:41:37 | 显示全部楼层
赋值语句这类代码必须出现在函数中,把赋值语句COPY到函数中就可以了

把你的放到函数里试了一下不会报错
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-2 14:49:11 | 显示全部楼层
本帖最后由 rjx007 于 2018-1-2 15:45 编辑

放在函数里后,红叉没有了,但编译时还是报错:

void arctan(void)  //用反正切函数来适当压缩较高的模的值
  {
          u8 i;
          u8 COLUMN1[25]={lBUFMAG[1],lBUFMAG[2],lBUFMAG[3],lBUFMAG[4],lBUFMAG[5],lBUFMAG[6],lBUFMAG[7],lBUFMAG[8],lBUFMAG[9],lBUFMAG[10],
                   lBUFMAG[11],lBUFMAG[13],lBUFMAG[16],lBUFMAG[19],lBUFMAG[23],lBUFMAG[26],lBUFMAG[29],lBUFMAG[32],lBUFMAG[38],lBUFMAG[45],
                   lBUFMAG[51],lBUFMAG[64],lBUFMAG[77],lBUFMAG[90],lBUFMAG[115] };
         for(i=0;i<25;i++)
             {
                 .............                   }
  }
main.c(200): error:  #28: expression must have a constant value
          u8 COLUMN1[25]={lBUFMAG[1],lBUFMAG[2],lBUFMAG[3],lBUFMAG[4],lBUFMAG[5],lBUFMAG[6],lBUFMAG[7],lBUFMAG[8],lBUFMAG[9],
          lBUFMAG[10],




回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-2 14:57:22 | 显示全部楼层
本帖最后由 rjx007 于 2018-1-2 14:59 编辑

以上问题的背景是:想用OLED屏显示频谱,因经FFT后有256个模值,但屏太小,不可能显示256个柱条,且高频段也没啥用,就想从256个模值中挑选25个来显示成柱条,所以就又搞了个数组,里面的元素就是挑出来的模值。请高手指点一下该怎么搞?
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2018-1-2 15:02:23 | 显示全部楼层
NPT这个是define出来的还是变量,如果是变量就不行
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-2 15:04:10 | 显示全部楼层
本帖最后由 rjx007 于 2018-1-2 15:08 编辑

将NPT 直接改成具体数字还是不行。
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2018-1-2 15:24:36 | 显示全部楼层
rjx007 发表于 2018-1-2 14:49
放在函数里后,红叉没有了,但编译时还是报错:

void arctan(void)  //用反正切函数来适当压缩较高的模 ...

数据类型没对上阿. u8    和 long
自己选择的路,成家前走完。
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-2 15:34:08 | 显示全部楼层
不是数据类型的原因,试改成一致也不成,诚心求解。
回复

使用道具 举报

4

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1194
金钱
1194
注册时间
2017-8-31
在线时间
295 小时
发表于 2018-1-2 15:41:37 | 显示全部楼层
一般数组初始化赋值必须是数字或字符常量,如a[10]={1,2,3}可不能直接a[10]={b[1]}这样,会报错
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-2 15:43:22 | 显示全部楼层
是这样吗?那求教我的问题如何解决?
回复

使用道具 举报

2

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2017-9-27
在线时间
101 小时
发表于 2018-1-2 15:49:01 | 显示全部楼层
我试了呀 好像不会报错的~
Snipaste_2018-01-02_15-48-14.png
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-2 15:56:37 | 显示全部楼层
本帖最后由 rjx007 于 2018-1-2 16:03 编辑

我试了一下,放在主函数里确实没有红叉了,但编译通不过的,报错:main.c(58): error:  #28: expression must have a constant value
       u8 COLUMN1[25]={lBUFMAG[1],lBUFMAG[2],lBUFMAG[3],lBUFMAG[4],lBUFMAG[5],lBUFMAG[6],lBUFMAG[7],lBUFMAG[8],lBUFMAG[9],lBUFMAG[10],

回复

使用道具 举报

2

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2017-9-27
在线时间
101 小时
发表于 2018-1-2 16:03:00 | 显示全部楼层
rjx007 发表于 2018-1-2 15:56
楼上什么意思?没看懂,请详细指教,谢谢!

就是说  我宏定义了一个NPT 100
然后在main里面按你之前发的去试了一下  编译没有报错~
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-2 16:04:50 | 显示全部楼层
我试了一下,放在主函数里确实没有红叉了,但编译通不过的,请见上面的帖子。
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-2 16:08:49 | 显示全部楼层
请看:
1.png
2.png
回复

使用道具 举报

2

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2017-9-27
在线时间
101 小时
发表于 2018-1-2 16:12:01 | 显示全部楼层
rjx007 发表于 2018-1-2 16:04
我试了一下,放在主函数里确实没有红叉了,但编译通不过的,请见上面的帖子。

你的IBUFMAG这个数组是不是全局的  如果是在主函数里声明定义的话 你应该把IBUFMAG 作为传入参数传入到这个arctan函数试试
回复

使用道具 举报

2

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2017-9-27
在线时间
101 小时
发表于 2018-1-2 16:16:25 | 显示全部楼层

1BUFMAG这个存储幅度的数组你定义赋值了没有?
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-2 16:23:01 | 显示全部楼层
谢谢楼上不厌其烦的解答,我再仔细想想看究竟问题出在哪里,有问题再请教你。
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2018-1-2 16:39:18 | 显示全部楼层
数组定义初始化,要有明确的值 u8 COLUMN1[]={lBUFMAG[1],......},lBUFMAG[1]来初始化数组 COLUMN1,lBUFMAG[1]值必须为确定值
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2018-1-2 16:39:29 | 显示全部楼层
数组定义初始化,要有明确的值 u8 COLUMN1[]={lBUFMAG[1],......},lBUFMAG[1]来初始化数组 COLUMN1,lBUFMAG[1]值必须为确定值
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2018-1-2 16:41:18 | 显示全部楼层
error: initializer elemet is not a compile-time constant. 说的很明确了初始化元素在编译时不确定
回复

使用道具 举报

9

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2017-6-16
在线时间
46 小时
发表于 2018-1-2 16:42:28 | 显示全部楼层
long lBUFMAG[NPT+NPT/2]; 是在函数外面定义的吗  先赋上初值试试
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2018-1-2 16:44:51 | 显示全部楼层
数组不能这样子写的,里面只能是常量,你要赋值的话,要在程序中将一个数组的值赋给另外一个,单个单个赋值,可以用for循环的。你这样肯定错。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-1-3 01:16:09 | 显示全部楼层
数组里面直接定义,肯定不能是变量,这是基础。
另外,根据报错去修改,就能解决。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1932
金钱
1932
注册时间
2015-7-5
在线时间
489 小时
发表于 2018-1-3 07:15:18 | 显示全部楼层
C语言初始化问题
初始化时  必须保证那些初始化的数据是常数。不能用变量去初始化变量。
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-3 09:01:42 | 显示全部楼层
本帖最后由 rjx007 于 2018-1-3 09:24 编辑

谢谢原子及各位的耐心解答,老朽在此拜谢大家了,我再想想该怎么弄。
这个问题的本意是这样的:想搞一个音乐频谱,采样点数为256点,通过FFT后,实际只有前面的128的频点才是有效的。但OLED是小频,要显示128个柱条是不实际的。再说音乐的频率主要集中在0-4K,4K-8K次之,而8K-20K主要是谐波,因此想从取模运算结果1BUFMAG[]数组中挑出25个有效的元素,新组成一个数组COLUMN1[]来显示柱条的高度,不想会遇到变量不能做数组元素的问题。
请教原子及各位高手,这个问题有什么好办法吗?
老朽先谢谢各位了。

回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-3 09:24:10 | 显示全部楼层
简单向各位汇报一下老朽的情况:鄙人65岁开始自学C语言和PIC,AVR单片机,目前已能做些小项目,2017年夏天开始学STM32,由于年纪大,又是完全自学,个中的艰辛是常人不能体会的,常常至深夜还在苦读和思索。
老朽自学这些东西,完全是出于爱好和打发时间。自幼爱好无线电,但一生不成大器,虽然今年已过古稀之年,但初心不改,总想不断学些东西,再说,多动脑子也可以防老年痴呆吧?
说这话的目的就是请各位不要嘲笑老朽:这么简单的问题都不懂,还在论坛混!
我是诚心求教大家。
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-1-3 11:01:35 | 显示全部楼层
本帖最后由 rjx007 于 2018-1-3 11:15 编辑

21楼【一起哈皮】提供的方案是可行的,没有红叉,编译顺利通过了。看来要用变量作为数组的元素,必须事先逐个赋值才行。21楼是C高手。
感谢!


回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-23 03:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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