找回密码
 立即注册
查看: 38|回复: 3

请教下这个报错是怎么回事啊

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-05-09 09:37:52
已绑定手机

2

主题

1

回帖

18

积分

新手上路

积分
18
发表于 昨天 15:33 | 显示全部楼层 |阅读模式
编译报错

user\main.c(42): error C141: syntax error near ']', expected 'sizeof'

代码如下

#include "main.h"
void main(void)
{       
        u8 current=10;
        u16 p;
        u8 f_scan=scan_start;//扫频值初始化
        io_init();
        pwm_init();
        OLED_Init();//初始化OLED
        OLED_ColorTurn(0);//0正常显示,1 反色显示
  OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
        display_0();//开机界面
        delay_ms(1000);
  OLED_Clear();//清屏
        while(1)
        {               
    pwm_out(pwm_f_d16[],2);
               
//                OLED_DrawBMP(0,0,128,64,BMP1);
    display_mode4();//直径16雾化片固定显示界面
                current++;
                f_scan++;
                p=current*6;
                if(current>254)current=10;
                if(f_scan>scan_end)f_scan=scan_start;
                OLED_ShowNum(25,6,p,4,16);//显示功率值
                OLED_ShowNum(98,6,current,3,16);//显示电流值
                OLED_ShowNum(25,4,f_scan,3,16);//显示扫频终值
               
        }          
}



#include "main.h"
/*******************本地变量定义**********************/
u16 PWM1_Duty;
u16 PWM_PERIOD;

u16 pwm_f_d16[]={240,218,200,185,171,160};  //  D16雾化片 100-150khz  步进10KHZ
u16 pwm_f_d13[6]={200,185,171,160,150,141};  //  D13雾化片 120-170khz  步进10KHZ
u16 pwm_f_d10[6]={185,171,160,150,141,133};  //  D10雾化片 130-180khz  步进10KHZ
u16 pwm_f_d8[6]={133,126,120,114,109,104};  //  D8雾化片 180-230khz  步进10KHZ

/*************************PWM寄存器初始化********************************/
void pwm_init()
{


    PWM1_Duty=120;  //占空比初始值  50%
          PWM_PERIOD=240;  //频率初始值100KHZ
          P_SW2|=0x80;
       
          PWM1_ENO =0x04;
    PWM1_PS=0x00;  //高级 PWM 通道输出脚选择位在P1口
       
    CLKSEL=0x00; //选择内部 IRC ( 默认 )
           CLKDIV=0x00;  //不分频

          PWM1_CCER1=0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道

    PWM1_CCMR2=0x68; //通道模式配置  PWM模式1 输出方向  CCMRX是哪个通道就写哪个数字
    PWM1_CCER1=0x10; //配置通道输出使能和极性

       
          PWM1_ARRH =(u8)(PWM_PERIOD >> 8); //设置周期时间
    PWM1_ARRL =(u8)PWM_PERIOD;
               
                PWM1_CCR2H =(u8)(PWM1_Duty >> 8); //设置占空比时间    CCRXH是哪个通道就写哪个数字
    PWM1_CCR2L =(u8)(PWM1_Duty);
               
    PWM1_BKR=0x80; //使能主输出
    PWM1_CR1=0x01; //开始计时
}

/**************PWM输出任意频率和占空比函数********************/
void pwm_out(u16 pwm_f[],u16 duty_set)
{
         u16 i;
         u16 period;
         u16 duty;
         for(i=0;i<6;i++)
         {
            period=pwm_f[i];
                  PWM1_ARRH =(u8)(period >> 8); //更新周期时间
      PWM1_ARRL =(u8)period;
                 
                  duty=duty_set*period;
                 
                  PWM1_CCR2H =(u8)(duty >> 8); //更新占空比时间    CCRXH是哪个通道就写哪个数字 比如PWM1P就写1,PWM2P就写2
      PWM1_CCR2L =(u8)(duty);
                  delay_ms(100);
         }
}


头文件

#ifndef __PWM_H
#define __PWM_H


#define PWM1_1      0x00        //P:P1.0  N:P1.1
#define PWM1_2      0x01        //P:P2.0  N:P2.1
#define PWM1_3      0x02        //P:P6.0  N:P6.1

#define PWM2_1      0x00        //P:P1.2/P5.4  N:P1.3
#define PWM2_2      0x04        //P:P2.2  N:P2.3
#define PWM2_3      0x08        //P:P6.2  N:P6.3

#define PWM3_1      0x00        //P:P1.4  N:P1.5
#define PWM3_2      0x10        //P:P2.4  N:P2.5
#define PWM3_3      0x20        //P:P6.4  N:P6.5

#define PWM4_1      0x00        //P:P1.6  N:P1.7
#define PWM4_2      0x40        //P:P2.6  N:P2.7
#define PWM4_3      0x80        //P:P6.6  N:P6.7
#define PWM4_4      0xC0        //P:P3.4  N:P3.3

#define ENO1P       0x01
#define ENO1N       0x02
#define ENO2P       0x04
#define ENO2N       0x08
#define ENO3P       0x10
#define ENO3N       0x20
#define ENO4P       0x40
#define ENO4N       0x80

//#define PWM_PERIOD  1000    //设置周期值

unsigned int pwm_f_d16[];

void pwm_init();
void UpdatePWM();
void pwm_init2();
void pwm_out(unsigned int pwm_f[],unsigned int  duty_set);

#endif


回复

使用道具 举报 送花

3

主题

1102

回帖

915

积分

等待验证会员

积分
915
发表于 昨天 15:58 | 显示全部楼层
您遇到的编译错误是由于函数调用参数传递不规范导致的语法问题。具体分析如下:

一、错误定位分析
在代码第42行:
pwmout(pwmfd16[],2);

错误提示C141表明编译器在']'符号处发现语法异常,期望看到sizeof操作符或其他有效表达式。其核心问题是数组参数传递不规范:

1. pwmfd16[]的用法不符合C语言规范
空的中括号[]在函数参数中只能用于函数原型声明(如:void func(int arr[]))
函数调用时必须传递具体数组元素或指针

2. 参数类型不匹配
pwmout函数原型可能需要明确的数组地址或特定元素
未闭合的中括号导致编译器无法解析参数类型

二、修正建议
根据代码上下文,建议以下两种修改方案:

方案一:传递数组首地址
pwmout(pwmfd16, 2);  // 直接传递数组名作为指针

方案二:指定具体索引
pwmout(pwmfd16[0], 2); // 假设需要传递第一个元素

三、潜在关联问题排查
建议进一步检查以下相关定义:

1. 数组定义验证(应存在于头文件或模块中):
/ 示例正确声明 /
u16 pwmfd16[SIZE] = { / 初始化值 / };

2. 函数原型确认(应包含在main.h):
void pwmout(u16 param1, u8 param2);  // 或 void pwmout(u16 arr, u8 len)

四、代码优化建议
1. 变量初始化规范:
建议将current和fscan初始值统一为0或明确初始状态:
u8 current = 0;  // 推荐使用0初始值
u16 p = 0;
u8 fscan = scanstart & 0xFF; // 确保值域有效性

2. 数值边界保护:
建议增加范围检查宏定义:
define CURRENTMAX 254
define CURRENTMIN 10
current = (current > CURRENTMAX) ? CURRENTMIN : current+1;

3. 显示刷新优化:
可封装显示更新函数,避免重复代码:
void updatedisplay(u16 p, u8 current, u8 fscan) {
    OLEDShowNum(25,6,p,4,16);
    OLEDShowNum(98,6,current,3,16);
    OLEDShowNum(25,4,fscan,3,16);
}

五、补充说明
1. 类型定义验证:
请确认main.h中正确定义了数据类型:
typedef unsigned char u8;
typedef unsigned short u16;

2. PWM相关配置:
建议检查pwminit()实现,确保:
时钟配置正确
预分频器设置合理
自动重载值(ARR)已配置
输出模式使能

如果需要进一步定位问题,建议提供:
1. pwmout函数实现代码
2. pwmfd16数组的完整声明
3. 编译器版本及芯片型号信息(可模糊处理具体型号)

以上修改方案已考虑代码安全性、可维护性及执行效率,建议结合具体硬件特性进行参数优化。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:170
  • 最近打卡:2025-05-09 07:56:57
已绑定手机

58

主题

1369

回帖

3056

积分

荣誉版主

无情的代码机器

积分
3056
发表于 昨天 16:33 | 显示全部楼层
语法不对pwm_out(pwm_f_d16[],2);
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-05-09 09:37:52
已绑定手机

2

主题

1

回帖

18

积分

新手上路

积分
18
发表于 12 小时前 | 显示全部楼层
非常感谢,很专业,问题已解决。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-9 22:32 , Processed in 0.151014 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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