Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка: array subscript has type 'char'
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Nosaer
Здравствуйте)
При компиляции в AVR Studio, компилятор выкидывает предупреждения:
Цитата
Warning array subscript has type 'char' [-Wchar-subscripts]


Вот собственно часть кода, строчки на которые ругается, выделил жирным. Везде одно и то же предупреждение.
CODE

//Переменные
volatile char buf[26],dat1[26]={0,0x11,0,0x22,0,0x33,0,0x44,0,0x55,0,0x66};
char Init[6]={0x17,0x51,0xD6,0x07,0x04},BufB[44];
volatile char i,cnt,y;

//Объединения
union { float fd;
char cd[4]; } ua;

union { int b16;
char b8[2]; } dat;

// Функция получения данных USART_C0.
char getChar0(void)
{
char buffer0;
while (1)
{
while( !(USARTC0_STATUS & USART_RXCIF_bm) );
buffer0=USARTC0_DATA;
if ((USARTC0_STATUS & (USART_FERR_bm | USART_PERR_bm | USART_BUFOVF_bm))==0)
return buffer0;
};
}

// Фунуция передачи данных USART_C0
void sendChar0(char c0)
{
while( !(USARTC0_STATUS & USART_DREIF_bm) );
USARTC0_DATA = c0;
}

// Функция получения данных USART_D1.
char getChar1(void)
{
char buffer1;
while (1)
{
while( !(USARTD1_STATUS & USART_RXCIF_bm) );
buffer1=USARTD1_DATA;
if ((USARTD1_STATUS & (USART_FERR_bm | USART_PERR_bm | USART_BUFOVF_bm))==0)
return buffer1;
};
}

// Фунуция передачи данных USART_D1
void sendChar1(char d1)
{
while( !(USARTD1_STATUS & USART_DREIF_bm) );

//Функция обработки данных
int RdDH3(char x)
{
int a;
char z,k;
for (k=0;k<4;k++)
{
z=x-k;
ua.cd[k]=BufB[z];
}
a=ua.fd*10000;
return a;
}

************

n0: _delay_ms(1000);
PORTE.OUTSET =0x08;
for (i=0;i<5;i++) sendChar0(Init[i]);
_delay_ms(500);

while (1)
{
cnt = getChar1();
if (cnt!=0x55) {
if (cnt!=0x77)
{
for (i=0;i<12;i++) sendChar1(dat1[i]); }
else goto n0;
}
else {
for (i=0;i<12;i++) sendChar1(buf[i]); }
for (i=0;i<12;i++) buf[i]=0x1A;
TimeOut();
sendChar0(0xC7);//command to read data
//прием ответного байта команды
while (TCC1.CTRLA)
{
if ((USARTC0_STATUS & USART_RXCIF_bm))
{
y=USARTC0_DATA;
if (y==0xC7) TCC1.CTRLA = TC_CLKSEL_OFF_gc;
}
}
TCC1.CTRLA = TC_CLKSEL_DIV256_gc;
//принять все остальное
while (TCC1.CTRLA)
{
if ((USARTC0_STATUS & USART_RXCIF_bm))
{
BufB[cnt++]=USARTC0_DATA;
if (cnt>=43) TCC1.CTRLA = TC_CLKSEL_OFF_gc;
}
}
if (cnt>=43)
{
for (i=0;i<3;i++)
{
cnt=i*2;
y=8+i*4;
dat.b16=RdDH3(y);
buf[cnt++]=dat.b8[1];
buf[cnt]=dat.b8[0];
}
for (i=0;i<3;i++)
{
cnt=6+i*2;
y=22+i*4;
dat.b16=RdDH3(y);
buf[cnt++]=dat.b8[1];
buf[cnt]=dat.b8[0];
}
}
};
}


То что компилятор предупреждает о разных типах данных я понимаю.
Но на те же самые преобразования CodeVisionAVR почему то не ругается.
Поэтому мне бы хотелось разобраться и заполнить пробел в моих знаниях, и надеюсь вы мне в этом поможете. rolleyes.gif
_Pasha
Тип индекса должен быть unsigned char
Иногда некоторые любят в командной строке компилятора (то бишь, в настройках проекта) - указать -funsigned-char и тогда по умолчанию будет unsigned
Это и хорошо и плохо.
Плохо с точки зрения переносимости и вообще дурная привычка, хорошо - с точки зрения, что меньше текста.
И проверьте Codevision - там наверняка это включено.
Nosaer
Pasha, огромное спасибо. Помогло) a14.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.