C数组初始化获取错误

时间:2017-02-01 10:28:47

标签: c

我试图用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读数,其值会定期更改,这是我的错吗?
请帮忙

3 个答案:

答案 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;}