Je commence à apprendre sur l'utilisation de structures en C. C'est stimulant et agréable. Inutile de dire que j'ai rencontré un problème que je n'arrive pas à comprendre. Je suis en train de faire un tableau de struct souple en tant que membre d'une autre struct mais je reçois une erreur:utilisation invalide de tableau flexible-tableau flexible struct en tant que membre d'une autre structure
invalid use of flexible array
Qu'est-ce que je fais mal?
#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;
}
EDIT 1
C'est quelque chose comme cela, je suis en train de réaliser
flexible length struct array inside another struct using C
EDIT 2 *
OK Je semble donc se rapprocher de la création d'un tableau de taille variable de struct w manière rong. J'ai 2 choses que j'essaye. La première que je connais fonctionne à coup sûr. La seconde je voudrais juste si quelqu'un pouvait vérifier la santé pour moi. J'apprends toujours sur les pointeurs et j'aimerais savoir si A est la même chose que B. B serait ma méthode préférée mais je ne sais pas si c'est correct. Je suis confiant sur un parce que quand je débogue des canaux je vois le canal [0], le canal [1] le canal [2] etc. Mais je ne suis pas si confiant au sujet de B parce que quand je débogue je vois seulement une adresse à la mémoire et les variables de la structure de canal répertoriées.
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 ****
Yep ils sont les mêmes. Vous ne savez pas quand vous utilisez un sur l'autre tho
channel channels[NUM_CHANNELS];
est égal :)
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;
Quelle plateforme et quel compilateur utilisez-vous? –
J'utilise ios4 et gcc 4.2. J'ai suivi beaucoup d'exemples, mais je ne peux pas arriver à le casser – dubbeat