Подтвердить что ты не робот

Как восстановить предупреждение: отсутствуют привязки вокруг инициализатора?

Предупреждение создается кодом c, генерируемым vala.

предупреждение: отсутствующие фигурные скобки вокруг инициализатора

Код работает, но предупреждение вызывает раздражение. Код vala, на который указывает предупреждение,

struct Position {uint x; uint y;}
private static Position positions[8];

Сгенерированный код C

static Position det_positions[8] = {0};

Я попытался инициализировать позиции полдюжины различных способов, но не могу заставить синтаксис удовлетворять этому предупреждению. Эта ошибка GCC 53119 или есть способ ее исправить?

4b9b3361

Ответ 1

Да, похоже, это связано с ошибкой GCC 53119. Он исчезнет, ​​если вы измените объявление C на {{0}}. Ваши варианты:

  • Игнорировать предупреждение.
  • Управляйте кодом C после генерации, чтобы {{0}} вместо {0} использовать {0} в этой строке, используя sed или тому подобное.
  • Объявите массив extern в Vala и напишите определение C в другом месте. (Постоянная версия №2.)
  • Теперь что-то вроде struct foo { int bar; Position positions[8]; } static foo position_holder и {0} будет инициализироваться position_holder.bar, что хорошо, и предупреждение уходит.

Ответ 2

Это предупреждение также появляется, когда многомерный массив рассматривается как линейный массив (хотя он по-прежнему корректен и код работает отлично) с установленными флажками -Wall компилятора.

Например

char array[5][10][2] = {\
"0","0","0","0","0","0","0","0","0","0",\
"1","1","1","1","1","1","1","1","1","1",\
"2","2","2","2","2","2","2","2","2","2",\
"3","3","3","3","3","3","3","3","3","3",\
"4","4","4","4","4","4","4","4","4","4" };

Это приведет к появлению предупреждения.

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

char array[5][10][2] = {\
{"0","0","0","0","0","0","0","0","0","0" },\
{"1","1","1","1","1","1","1","1","1","1"},\
{"2","2","2","2","2","2","2","2","2","2"},\
{"3","3","3","3","3","3","3","3","3","3"},\
{"4","4","4","4","4","4","4","4","4","4"} };

Пожалуйста, поправьте меня, если я ошибаюсь.

Ответ 3

// Learn!
// I used ATMEL STUDIO 7

#include <avr/io.h>    

typedef struct Position { uint8_t x; uint8_t y;} POSITION_TYPE;

POSITION_TYPE positions[8]={ { 0,0 }, { 0,1 }, { 0,2 }, { 0,3 }, { 0,4 }, { 0,5 }, { 0,6 }, { 0,7 } };   // correct

POSITION_TYPE positions2[8]={ { .x=0, .y=0 }, 
                              { .y=1, .x=0 }, 
                              { .x=0, .y=2 }, 
                              { 0, 3 }, 
                              { 7, .x=4 , 8 },  //7 was automatically .x and was rewritten by .x=4 and following number 8 is .y because automatically after .x  follow .y
                              { .y=5, .x=0 }, 
                              { 0, 6 }, 
                              { 0, 7 } }; // correct

POSITION_TYPE positions3[8]={ 0 };  // NOT CORRECT! WHY? Becouse this is an array of 8 structures with positions3[index].x and positions3[index].y    index=0 .. 7  

/*
 Warnings for positions3 ->  

 missing braces around initializer [-Wmissing-braces]
 (near initialization for 'positions3[0]') [-Wmissing-braces]
  */


void initPositions3 (void)
{   
     for (int i=0; i<8; i++) { positions3[i].x=0 ; positions3[i].y=0; }
     }

int main(void)
{
     while (1) 
     { 
        for (int i=0; i<8; i++) { ++positions[i].x ; } 
        for (int i=0; i<8; i++) { --positions2[i].y ; }
        for (int i=0; i<8; i++) { positions3[i].x=i ; positions3[i].y=2*i ;}            
        }
     }