В функции 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; */
}
}
C не поддерживает '0b' в качестве префикса для двоичных чисел. Или любая другая база, действительно. – unwind
Какая база вы говорите? Я знаю, что C поддерживает эти базы: '0x' = 16-base и' 0' = 8-base by std. –
yeah 0b, а также 0x оба работают – shafeeq