недопустимое использование гибкого массива-гибкого массива структур в качестве члена другой структуры

Я начинаю узнавать об использовании структур в C. Это сложно и приятно. Излишне говорить, что я столкнулся с проблемой, которую не могу понять. Я пытаюсь сделать гибкий структурный массив членом другой структуры, но получаю сообщение об ошибке:

недопустимое использование гибкого массива

Что я делаю не так?

#define NUM_CHANNELS 4

struct channelStruct {
    float volume;
    uint mute;
};


struct enginestruct
{
    float bpm;
    int synctimeinbeats;
    int synctimeinsamples;
    int currentbeat;
    int oneBeatInSamples;
    int samplerate;
    struct channelStruct channels[];
};

struct enginestruct engine, *engineptr;
struct channelStruct  channel, *channelptr;        


-(void) setupengine


{
    engineptr = &engine;
    engineptr->oneBeatInSamples = 22050;
    engineptr->samplerate = 44100;

    struct channelStruct *ch = (struct channelStruct *) malloc ( 
        NUM_CHANNELS*sizeof(struct channelStruct) );
    //error occurs here
    engineptr->channels = ch;
}

ИЗМЕНИТЬ 1

Это ' что-то вроде этого Я пытаюсь получить

массив структур гибкой длины внутри другой структуры, используя C

EDIT 2 *

ОК, поэтому я, похоже, неправильно подхожу к созданию массива структур переменного размера. У меня есть 2 вещи, которые я пробую. Первое, что я знаю, точно работает. Второе, я бы просто хотел, чтобы кто-нибудь вменяемо проверил его для меня. Я все еще изучаю указатели и хотел бы знать, совпадает ли A с B. B был бы моим предпочтительным методом, но я не знаю, верен ли он. Я уверен в a, потому что когда я отлаживаю каналы, я вижу канал [0], канал [1] канал [2] и т. Д. Но я не так уверен в B, потому что при его отладке я вижу только адрес в памяти и перечислены переменные структуры канала.

A

// pretty sure this is o.k to do but I would prefer 
// not to have to set the size at compile time.

struct enginestruct
{
    float bpm;
    int synctimeinbeats;
    int synctimeinsamples;
    int currentbeat;
    int oneBeatInSamples;
    int samplerate;
    channel channels[NUM_CHANNELS]; //is this technically a pointer?
};

B

//I'm not sure if this is valid. Could somebody confirm for me if 
//it is allocating the same amount of space as in A.

struct enginestruct
{
    float bpm;
    int synctimeinbeats;
    int synctimeinsamples;
    int currentbeat;
    int oneBeatInSamples;
    int samplerate;
    channel *channels;
};

//This only works if channel in the engine struct is defined as a pointer.
channel * ar = malloc(sizeof(*ar) * NUM_CHANNELS);
engineptr->channels = ar;

** EDIT 3 ****

Да, они такие же. Не уверены, когда использовать одно вместо другого tho

channel channels[NUM_CHANNELS]; 

Is Equal To:)

struct enginestruct
{
    float bpm;
    int synctimeinbeats;
    int synctimeinsamples;
    int currentbeat;
    int oneBeatInSamples;
    int samplerate;
    channel *channels;
};

channel * ar = malloc(sizeof(*ar) * NUM_CHANNELS);
engineptr->channels = ar;

10
задан Community 23 May 2017 в 12:00
поделиться