voglio scrivere, in C (nessun sapore particolar, diciamo c11) un generico, un array const globale di struct, come il seguente pseudocodice:Array of struct e sizeof
void * generic[] ={&(struct a va),&(struct b vb)};
Ora voglio creare una funzione che, dato l'id della posizione della struct desiderata (sto pensando di usare un const per ogni id, hardcoded), la copierà.
Perché copy()
è anche generica (accetta un void *
come destinazione) avrebbe bisogno di conoscere la dimensione rigorosa, strega può essere specificato dal chiamante (un sacco di soggetto ad errori, ha già bisogno di fornire la struttura di destinazione e il diritto id) o conserverò anche un array parallelo di sizeof
corretto per ogni struttura.
C'è un modo per automatizzare al momento della compilazione l'inizializzazione dell'array sizeof? O addirittura implementare una sorta di trucco per consentire all'utente di specificare solo passare il puntatore a struct senza il suo id, senza dover scrivere uno specialista get_struct_x()
?
Nessuna allocazione dinamica (alloc()
, variabile locale va bene) consentito, tutta la struttura e il contenuto di array generico sono noti al momento della compilazione.
Ci dispiace per il mio cattivo spiegazione, sentitevi liberi di migliorare/correggerlo.
Modifica di chiarimento: ho bisogno di copia completa di un know tipo struct da un array in cui sono memorizzati molti tipi struct, ma lo stesso tipo mai ripetersi. E ho bisogno di farlo da una generica funzione get che verrà chiamata da thread diversi, quindi prima e dopo la copia bloccherà un mutex, e voglio mantenere tutto il codice di blocco e di cast in un punto, per minimizzare il debug e creare test più efficace.
Credo che la tua domanda è , "Posso scrivere una funzione che richiede un array di' struct's e un indice e un indirizzo di destinazione 'struct' come input - tale che la' struct' specifica sia vincolata 'da qualche altra parte'? " –
"C'è un modo per automatizzare in fase di compilazione l'inizializzazione di sizeof array?" l'unico meccanismo a tua disposizione è il preprocessore. È l'utilità più comune utilizzata per l'astrazione di questo tipo di funzionalità. –
E 'un'opzione per memorizzare la dimensione di ogni struct al suo interno? Ad esempio, aggiungi un membro 'int mySize' come primo membro in ogni struct e impostalo (in runtime) su' x.mySize = sizeof (struct x) '. – usr2564301