Инициализация структуры с объединением массивов - PullRequest
0 голосов
/ 19 марта 2020

Я заметил, что было много сообщений на эту тему, но я не могу точно указать что-нибудь, что могло бы помочь.

Я определил следующий код:

typedef struct
{
    float re;
    float im;
} MyComplex;

typedef struct
{
    float rf;
    union
    {
        float     noise[4];
        MyComplex iq[4];
    };
} RfTable_t;

RfTable_t Noise[2] = 
{
    { 1.2f, .noise=0.f },
    { 2.1f, .noise=0.f };
};

**EDIT - Add function Test**

void Test()
{
    Noise[0].rf = 2.1f;
    Noise[0].noise[0] = 3.2f;
}

Я пытаюсь определить глобальную переменную Noise статически. Я получаю следующую ошибку:

   expected primary expression before '{' token
   expected primary expression before '{' token
   expected primary expression before '}' before '{' token
   expected primary expression before '}' before '{' token
   expected primary expression before ',' or ';' before '{' token
   expected declaration before '}' token

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Любая структура, объединение и / или массив для инициализации должны иметь свой собственный набор фигурных скобок для его инициализации. В частности, объединению нужен набор фигурных скобок, а массиву float внутри объединения также нужны фигурные скобки:

RfTable_t Noise[2] =
{
    { 1.2f, { .noise={0.f} } },
    { 2.1f, { .noise={0.f} } }
};

Обратите также внимание, что внутри инициализатора имелась паразитная переменная ;.

0 голосов
/ 19 марта 2020

Я внес наименьшие изменения для компиляции:

#include <stdio.h>

typedef struct
{
    float re;
    float im;
} MyComplex;

typedef struct
{
    float rf;
    union
    {
        float     noise[4];
        MyComplex iq[4];
    };
} RfTable_t;

RfTable_t Noise[2] = 
{
    { 1.2f, .noise={0.f} },  // Initialize NOISE with {0.f} instead of 0.f.
    { 2.1f, .noise={0.f} }   // Remove extra semi-colon.
};


int main(void) {
    return 0;
}

Чистая компиляция:

https://ideone.com/pvI9Ci

Вкратце:
noise - это массив.
Для его инициализации необходимо использовать синтаксис инициализатора массива:
{ value, value, value }

У вас не было скобок вокруг значение 0.f.

Также у вас была лишняя точка с запятой.

...