Я начинаю узнавать об использовании структур в 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
РЕДАКТИРОВАТЬ 2 *
О.К., таким образом, я, кажется, подхожу к созданию массива с переменным размером структуры неправильно. У меня есть 2 вещи, которые я пытаюсь. Первое, что я знаю, работает точно. Второе, что я хотел бы, если бы кто-нибудь смог проверить это для меня Я все еще изучаю указатели и хотел бы знать, является ли A тем же самым, что и B. B будет моим предпочтительным методом, но я не знаю, является ли он правильным. Я уверен в том, что когда я отлаживаю каналы, я вижу канал [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;
** РЕДАКТИРОВАТЬ 3 ****
Да, они одинаковы. Не уверен, когда вы будете использовать один над другим, но
channel channels[NUM_CHANNELS];
равно:)
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;