элемент инициализатора не является константой - avr gcc - PullRequest
0 голосов
/ 17 октября 2019

У меня есть простой код замедления из семи сегментов:

#include<avr/io.h>
#include<util/delay.h>
int dp=1<<0;
int a=1<<1;
int b=1<<2;
int c=1<<3;
int d=1<<4;
int e=1<<5;
int f=1<<6;
int g=1<<7;
int ss[]={
    a|b|c|d|e|f,
    b|c,
    a|b|g|e|d,
    a|b|g|c|d,
    f|g|b|c,
    a|f|g|c|d,
    a|f|g|c|d|e,
    a|b|c,
    a|b|c|d|e|f|g,
    a|b|c|d|f|g,
    0x00
};
int main()
{
 while(1){}
}

Но это дает мне ошибку, когда я пытаюсь сгенерировать .hex из этого .c кода:

Здесьэто ошибка:

main.c:12: error: initializer element is not constant

main.c:12: error: (near initialization for 'ss[0]')
...

То же самое для всех элементов ..

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Переменные со статической продолжительностью хранения должны быть инициализированы с помощью константных выражений времени компиляции.

Вместо набора переменных используйте перечисление. Например

#include <stdio.h>

enum
{
 dp=1<<0,
 a=1<<1,
 b=1<<2,
 c=1<<3,
 d=1<<4,
 e=1<<5,
 f=1<<6,
 g=1<<7
};

int ss[]={
    a|b|c|d|e|f,
    b|c,
    a|b|g|e|d,
    a|b|g|c|d,
    f|g|b|c,
    a|f|g|c|d,
    a|f|g|c|d|e,
    a|b|c,
    a|b|c|d|e|f|g,
    a|b|c|d|f|g,
    0x00
};

int main(void) 
{
    return 0;
}
2 голосов
/ 17 октября 2019

Один из способов сделать это - убедиться, что они являются константами (доступны во время компиляции), изменив их на:

#define dp 0x01
#define a  0x02
#define b  0x04
#define c  0x08
#define d  0x10
#define e  0x20
#define f  0x40
#define g  0x80

Я бы не стал слишком беспокоиться о созданииих 1<<n значения, поскольку количество раз, которое вам придется изменить, будет стремительно малым.


Изменение их на const int, похоже, не поможет. Я подозреваю, что constexpr было бы идеальным решением для этого, за исключением того факта, что это C ++: -)


Если у вас есть доступные двоичные константы, вы также можете захотеть увидеть что-то вроде:

static const int sevenSegMap[] = {
    // .abcdefg
     0b01111110,  // or use 0xfe if no binary constants.
     0b00110000,
     : and so on
     0b01111011,
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...