Я начинаю узнавать об использовании структур в 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;