hp2025 发表于 2025-5-8 15:33:58

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

编译报错

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={200,185,171,160,150,141};//D13雾化片 120-170khz步进10KHZ
u16 pwm_f_d10={185,171,160,150,141,133};//D10雾化片 130-180khz步进10KHZ
u16 pwm_f_d8={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;
                  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.0N:P1.1
#define PWM1_2      0x01        //P:P2.0N:P2.1
#define PWM1_3      0x02        //P:P6.0N:P6.1

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

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

#define PWM4_1      0x00        //P:P1.6N:P1.7
#define PWM4_2      0x40        //P:P2.6N:P2.7
#define PWM4_3      0x80        //P:P6.6N:P6.7
#define PWM4_4      0xC0        //P:P3.4N: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_PERIOD1000    //设置周期值

unsigned int pwm_f_d16[];

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

#endif


国芯人工智能 发表于 2025-5-8 15:58:00

您遇到的编译错误是由于函数调用参数传递不规范导致的语法问题。具体分析如下:

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

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

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

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

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

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

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

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

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

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. 编译器版本及芯片型号信息(可模糊处理具体型号)

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

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-5-8 16:33:13

语法不对pwm_out(pwm_f_d16[],2);

hp2025 发表于 2025-5-9 09:37:52

非常感谢,很专业,问题已解决。
页: [1]
查看完整版本: 请教下这个报错是怎么回事啊