我试图用c语言定义一个二维数组并用float类型的变量初始化它但是我遇到了这个错误:
"must be constant expression"
这是我的代码:
/*******************************************************
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;
}
}
我添加了我的整个代码,我还提到Hall变量保存了传感器的ADC读数,其值会定期更改,这是我的错吗?
请帮忙
答案 0 :(得分:1)
您可能无法使用非常量初始化程序在C中初始化具有静态存储持续时间的数组。
从C标准(6.7.9初始化)
4具有静态的对象的初始值设定项中的所有表达式 或线程存储持续时间应为常量表达式或字符串 文字。
看来你的数组是在任何函数之外声明的。如果可以在函数中声明它,例如在main中。
答案 1 :(得分:0)
在创建数组时,它的大小必须是常量,因为C
不允许数组大小的非常量值。
C99
标准部分6.7.8(初始化),第4点:
具有静态的对象的初始值设定项中的所有表达式 存储持续时间应为常量表达式或字符串文字。
我确实更改了您的代码。试试吧。
#include <stdio.h>
#define Hall_1 10
#define Hall_2 20
#define Hall_3 30
int main()
{
float A,B,C;
A = Hall_1;
B = Hall_2;
C = Hall_3;
float commutate_sequence[6][2]= {{B,A},{B,C},{A,C},{A,B},{C,B},{C,A}};
return 0;
}
答案 2 :(得分:0)
我改变了代码如下,现在可以使用了:
#define A Hall_1
#define B Hall_2
#define C Hall_3
void commutate(unsigned char max_min)
{ unsigned char X=0, i=0;
float comt_sequence[6][2]= { (&Hall_2,&Hall_1) , (&Hall_2,&Hall_3),(Hall_1,&Hall_3) , (&Hall_1,&Hall_2), &Hall_3,&Hall_2) , (&Hall_3,&Hall_1) };
for (i=0; i<6 ;i++)
{ if( (max_min[0] == (*comt_sequence[i][0])) && (max_min[1] == (*comt_sequence[i][1]))) X=i;}