gpt4 book ai didi

C 数组初始化出现错误

转载 作者:行者123 更新时间:2023-11-30 21:23:43 25 4
gpt4 key购买 nike

我试图用c语言定义一个二维数组并用float类型的变量初始化它,但我得到了这个错误:

“必须是常量表达式”
这是我的代码:

/*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 1/30/2017
Author :
Company :
Comments:


Chip type : ATmega8A
Program type : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*******************************************************/

#include <mega8.h>
#include <stdio.h>
#include <delay.h>
#include <alcd.h>

#define A Hall_1
#define B Hall_2
#define C Hall_3


//...........................................................................................
// Declare your global variables here
float Hall_1 ,Hall_2 ,Hall_3 ;
int count=0;

//----------------------------------------------------------------------------------------------------

// Timer 0 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
count++;

}

//----------------------------------------------------------------------------------------------

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{


}
//-----------------------------------------------------------------------------------------------

float adc_read(unsigned char);
float maxf(float , float , float);
float minf(float , float , float);
void commutate(unsigned char*);

//-----------------------------------------------------------------------------------------------

void main(void)
{
// Declare your local variables here

float comt_sequence[6][2]= {{B,A},{B,C},{A,C},{A,B},{C,B},{C,A}};
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000.000 kHz
TCCR1B=(0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT1=0x00;



// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);


// ADC initialization
// ADC Clock frequency: 250.000 kHz
// ADC Voltage Reference: Int., cap. on AREF
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX= (1<<REFS1) | (1<<REFS0) | (1<<ADLAR) ;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (1<<ADPS0);
SFIOR=(0<<ACME);

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 0
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTB Bit 6
// D6 - PORTB Bit 7
// D7 - PORTD Bit 5
// Characters/line: 16
lcd_init(40);

// Global enable interrupts
#asm("sei")

lcd_putsf("start");
delay_ms(500);
lcd_clear();

while (1)
{

unsigned char buffer[18] , s=0;
float m,n=0 , max_min[2];
TCCR1B=1; //start counting cycles
Hall_1 = adc_read(5);
Hall_2 = adc_read(4);
Hall_3 = adc_read(3);

m=maxf(Hall_1,Hall_2,Hall_3);
/*if(m == Hall_1)
lcd_putsf("Max= A ");
else if(m == Hall_2)
lcd_putsf("Max= B ");
else if(m == Hall_3)
lcd_putsf("Max= C ");
else
lcd_putsf("Error"); */

n=minf(Hall_1,Hall_2,Hall_3);
/*if(n == Hall_1)
lcd_putsf("Min= A");
else if(n == Hall_2)
lcd_putsf("Min= B");
else if(n == Hall_3)
lcd_putsf("Min= C");
else
lcd_putsf("Error");*/
max_min[0] = m;
max_min[1] = n;

s=count;
sprintf(buffer,"%5.4f %5.4f %d",max_min[0],max_min[1] ,TCNT1);
lcd_puts(buffer);
delay_ms(1000);
lcd_clear();
}
}



///////////////////////////////////////////////
float adc_read(unsigned char ch)
{

unsigned char lcd_buff[18];
float adc_data;
// select the corresponding channel 0~7
// ANDing with ’7' will always keep the value
// of ‘ch’ between 0 and 5 ""ATmega8 has 6 ADC channel 0-5""
ch &= 0b00000111; // AND operation with 5
ADMUX = (ADMUX & 0xF8)|ch; // clears the bottom 3 bits before ORing

// start single convertion
// write ’1' to ADSC
ADCSRA |= (1<<ADSC);

// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;

// Read the 8 most significant bits
// of the AD conversion result
adc_data=(ADCH * 2.56)/255;
//sprintf(lcd_buff," %5.3f ",adc_data);
//lcd_puts(lcd_buff);
//delay_ms(500);
return adc_data;
}

//------------------------------------------------------------------------------------------------
float maxf(float a , float b , float c) {

float m;
m = (a>b)?a:b;
m = (m>c)?m:c;
return m;
}

float minf(float a , float b , float c) {

float m;
m = (a<b)?a:b;
m = (m<c)?m:c;
return m;
}

//--------------------------------------------------------------------------------------
void commutate(unsigned char *max_min){

unsigned char x=0, i=0;


//unsigned char comt_pattern[6][2] = {(
for (i=0; i<6 ;i++)
if((max_min[0] == comt_sequence[i][0]) && (max_min[1] == comt_sequence[i][1])) x=i;
switch(x){
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
}

}

我添加了我的整个代码,我还提到霍尔变量保存来自传感器的 ADC 读数,并且其值定期变化,我的错是什么?
请帮忙

最佳答案

您不能使用非常量初始值设定项来初始化具有静态存储持续时间的 C 数组。

来自 C 标准(6.7.9 初始化)

4 All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.

看来你的数组是在任何函数之外声明的。如果可能的话,可以在函数中声明它,例如在 main 中。

关于C 数组初始化出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41977366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com