Инициализация массива структур

Всем привет!
Для рисования по точкам определил вот такие структуры:

struct TPoint {
  int x;
  int y;
};

struct TTrapez {
  int n; // trapezoid number
  TPoint v[4];  // vertices
};

и затем инициализировал массив:

TTrapez trapez[24] = {
  0, { {183,38}, {246,38}, {240,52}, {188,52} },  // green
  1, { {250,41}, {294,83}, {279,90}, {244,54} },
  2, { {297,88}, {297,150}, {281,143}, {281,96} },
  3, { {294,155}, {250,199}, {245,185}, {280,150} },
  4, { {246,201}, {183,201}, {188,185}, {240,185} },
  5, { {177,199}, {135,156}, {149,149}, {184,185} },
  6, { {131,150}, {131,88}, {147,96}, {147,143} },
  7, { {135,83}, {177,41}, {184,54}, {149,90} },
  8, { {192,59}, {237,59}, {230,74}, {198,74} },  // yellow
  9, { {242,62}, {272,93}, {257,98}, {235,76} },
  10, { {275,97}, {275,142}, {260,135}, {260,104} },
  11, { {272,147}, {242,177}, {236,162}, {257,140} },
  12, { {237,180}, {192,180}, {198,165}, {230,165} },
  13, { {187,177}, {156,147}, {170,140}, {193,163} },
  14, { {153,142}, {153,97}, {168,104}, {168,135} },
  15, { {156,92}, {187,62}, {193,76}, {170,99} },
  16, { {201,81}, {227,81}, {222,95}, {207,95} },  // red
  17, { {232,83}, {250,101}, {236,107}, {226,97} },
  18, { {254,106}, {254,133}, {240,127}, {240,112} },
  19, { {250,138}, {233,156}, {227,142}, {237,132} },
  20, { {227,158}, {201,158}, {206,144}, {222,144} },
  21, { {195,156}, {177,138}, {191,132}, {201,142} },
  22, { {174,133}, {174,106}, {188,112}, {188,127} },
  23, { {177,101}, {196,83}, {203,97}, {192,108} }
};

Так всё работает. И тут я подумал, зачем мне поле “int n; // trapezoid number” в структуре "struct TTrapez ". Всё равно я обращаюсь к элементам массива по индексу.

void drawTrapez(TTrapez t) {
    tft.drawLine(t.v[0].x, t.v[0].y, t.v[1].x, t.v[1].y, TFT_WHITE);
    tft.drawLine(t.v[1].x, t.v[1].y, t.v[2].x, t.v[2].y, TFT_WHITE);
    tft.drawLine(t.v[2].x, t.v[2].y, t.v[3].x, t.v[3].y, TFT_WHITE);
    tft.drawLine(t.v[3].x, t.v[3].y, t.v[0].x, t.v[0].y, TFT_WHITE);
}
...
  for (int i = 0; i < 24; i++) {
    drawTrapez(trapez[i]);
  }

Дай, думаю, уберу:

struct TPoint {
  int x;
  int y;
};

struct TTrapez {
  // int n;
  TPoint v[4];  // vertices
};

TTrapez trapez[24] = {
  { {183,38}, {246,38}, {240,52}, {188,52} },  // green
  { {250,41}, {294,83}, {279,90}, {244,54} },
  { {297,88}, {297,150}, {281,143}, {281,96} },
  { {294,155}, {250,199}, {245,185}, {280,150} },
  { {246,201}, {183,201}, {188,185}, {240,185} },
  { {177,199}, {135,156}, {149,149}, {184,185} },
  { {131,150}, {131,88}, {147,96}, {147,143} },
  { {135,83}, {177,41}, {184,54}, {149,90} },
  { {192,59}, {237,59}, {230,74}, {198,74} },  // yellow
  { {242,62}, {272,93}, {257,98}, {235,76} },
  { {275,97}, {275,142}, {260,135}, {260,104} },
  { {272,147}, {242,177}, {236,162}, {257,140} },
  { {237,180}, {192,180}, {198,165}, {230,165} },
  { {187,177}, {156,147}, {170,140}, {193,163} },
  { {153,142}, {153,97}, {168,104}, {168,135} },
  { {156,92}, {187,62}, {193,76}, {170,99} },
  { {201,81}, {227,81}, {222,95}, {207,95} },  // red
  { {232,83}, {250,101}, {236,107}, {226,97} },
  { {254,106}, {254,133}, {240,127}, {240,112} },
  { {250,138}, {233,156}, {227,142}, {237,132} },
  { {227,158}, {201,158}, {206,144}, {222,144} },
  { {195,156}, {177,138}, {191,132}, {201,142} },
  { {174,133}, {174,106}, {188,112}, {188,127} },
  { {177,101}, {196,83}, {203,97}, {192,108} }
};

Компилирую. Выдаёт ошибку:

D:\Projects\UWB\TFT\indicator_radar\indicator_radar.ino:41:1: error: too many initializers for 'TTrapez'
   41 | };
      | ^

exit status 1

Compilation error: too many initializers for 'TTrapez'

Казалось бы, всё просто должно быть. Подскажите, где я обсчитался со скобочками?

Первый массив у вас как раз неверный… хотя и компилируется

Здесь фигурная скобка должна быть ДО нуля

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

TTrapez trapez[24] = {
  { 0,  {183,38}, {246,38}, {240,52}, {188,52} }, 
1 лайк

Теперь далее - почему не работает второй массив, Потому что мало скобок.

Каждый элемент типа TTrapez должен быть описан следующим образом:

 {    0  ,                // начало элемента TTrapez
     {                   // начало массива точек v[4]
         {183,38},      // элементы TPoint
         {246,38}, 
         {240,52}, 
         {188,52} 
    }
}

сравните с вашим кодом и увидите, что у вас не хватает пары скобок

2 лайка