2013-06-22 5 views
0

Я написал этот код, но на компиляции я получаю сообщение «некорректное выражение» для следующего утвержденияКак инициализировать массив в c?

unsigned short address[] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*array is being initialized here.no problem uptil here.*/ 
unsigned short rowHead=3; 
unsigned short colHead=0; 
unsigned short rowTail =0; 
unsigned short colTail =0; 
unsigned short foodx; 
unsigned short foody; 
unsigned short turn=0; 
void gameOver() 
{ 
unsigned short i=0; 
address[] ={0b10000001,0b01000010,0b00100100,0b00011000, 
      0b00011000,0b00100100,0b01000010,0b10000001}; 
/*this is the line where compiler complaints as invalid expression.*/ 
while(1) 
    { 
    PORTD &=~(1<<i); 
    PORTB =address[i]; 
    delay_ms(5); 
    PORTD |=1<<i; 
    i%8; 
    } 
} 
+0

C не поддерживает '0b' в качестве префикса для двоичных чисел. Или любая другая база, действительно. – unwind

+0

Какая база вы говорите? Я знаю, что C поддерживает эти базы: '0x' = 16-base и' 0' = 8-base by std. –

+0

yeah 0b, а также 0x оба работают – shafeeq

ответ

8

Вы можете сделать это только при объявлении и назначении переменной одновременно. После этого вы не сможете этого сделать. Вы можете создать еще одну переменную и присвоить, что, хотя:

unsigned short address2[] = { 0b10000001,0b01000010,0b00100100,0b00011000, 
           0b00011000,0b00100100,0b01000010,0b10000001 }; 
address = address2; 

Это может сделать проблемы с sizeof(address) впоследствии; если вам нужно, то, вероятно, лучше просто использовать другую переменную.

+0

Err ...пожалуйста, как объявляется «адрес» в этом случае? Что касается декларации в OP, это не сработает. – alk

+0

'address' должен быть' unsigned short * 'из того, что я могу видеть и знать. Однако я не пытался скомпилировать код. – Joey

+0

Ahok, отлично ... спасибо - неплохо было бы добавить это в ответ, хотя это не очевидно из OP. – alk

0

Если вы хотите присвоить весь массив в один раз (а не просто получить ссылку на него) можно обернуть его в struct как это:

#include <stdlib.h> 
#include <stdio.h> 

#define ADDRESS_DEF {1, 2, 3} 

typedef struct 
{ 
    unsigned short _[sizeof((int[]) ADDRESS_DEF)/sizeof(*((int[]) ADDRESS_DEF))]; 
} address_t; 

address_t address_def = {ADDRESS_DEF}; 

int main() 
{ 
    address_t address = address_def; 

    size_t size = sizeof(address._)/sizeof(*address._); 

    for (size_t s = 0; s < size; ++s) 
    printf("address #%zd = %uh\n", s, address._[s]); 


    address = (address_t) {{4, 5, 6}}; 

    for (size_t s = 0; s < size; ++s) 
    printf("address #%zd = %uh\n", s, address._[s]); 

    return 0; 
} 
0

В функции gameOver(), вы пытаясь назначить все значения массива с одним присваиванием. Это не законно. Обычно вы должны использовать memcpy() или цикл для установки значений один за другим. Это часто делается путем объявления и инициализации временного массива и копирования содержимого в массив, который вы хотите повторно инициализировать.

Если вы делаете копию из временного массива, лучше всего сделать это static и const, чтобы сообщить компилятору, что вы не хотите писать на него, и вам не нужно его повторять инициализацию каждый время выполнения кода. Например:

static const unsigned short tmp[] = { 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81 }; 
memcpy(address, tmp, sizeof(address)); 

Название вашей переменной назначения немного сомнительно. Обычно, если что-то было вызвано address, я бы ожидал, что это будет указатель. Если вы имели в виду, что это указатель, и если вы не хотите менять значения, на которые указывает address, тогда ваше задание будет почти законным.

unsigned short const *address; 
/* ... */ 
static const unsigned short tmp[] = { 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81 }; 
address = tmp; 

Изготовление tmp[] сопза (и делаете address указатель на константный) позволяет компилятору поместить данные в сегменте только для чтения, что может означать ПЗУ на встроенную системе.

Если у вас есть какая-то скрытая сложность, не показана в вопросе, и это мешает вам сделать address указателем на const, тогда все будет сложно. Если вы изменили address на указатель и пошли дальше с изменением того, на что он указывает, это может иметь непреднамеренные последствия.

Однако код, который показан, не похож на его копирование, а элементы должны быть не более char, чтобы сохранить все их значения. Временным массивом может быть такой же простой массив:

void gameOver() 
{ 
    unsigned short i=0; 
    static const unsigned char tmp[] = { 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81 }; 

    while(1) 
    { 
     PORTD &=~(1<<i); 
     PORTB = tmp[i]; 
     delay_ms(5); 
     PORTD |=1<<i; 
     i%8; /* <-- this has no effect, I think you meant i=(i+1)%8; */ 
    } 
} 
Смежные вопросы