È possibile replicare un array generico in puro ANSI-C?Pure ANSI-C: crea array generico
Ho questa struttura che contiene un array (per i float al momento) e alcune variabili come dimensione e capacità per la mutazione nell'array.
typedef struct _CustomArray
{
float* array; //the array in which the objects will be stored
int size; //the current size of the array
int capacity; //the max capacity of the array
} CustomArray;
Io uso questa struct in modo da poter fare una matrice in puro C dove posso aggiungere/rimuovere elementi, espandere dinamicamente la dimensione della matrice, se necessario, ecc tutte le cose che un allineamento "standard" fa, tranne che è fatto solo in C. E ora voglio fare in modo che quando inizializzi questa struct puoi impostare il tipo di dati degli elementi che dovrebbe contenere, in questo momento è solo in grado di memorizzare i tipi di dati float, ma voglio farlo in modo che possa memorizzare qualsiasi tipo di dati/altre strutture. Ma non so se questo è possibile.
In questo momento la possibilità di eseguire questa matrice è:
CustomArray* CustomArray_Create(int initCapacity, /*type elementType*/)
{
CustomArray* customArray_ptr; //create pointer to point at the structure
float* internalArray = (float*)malloc(sizeof(float) * initCapacity); //create the internal array that holds the items
if(internalArray != NULL)
{
CustomArray customArray = { internalArray, 0, initCapacity }; //make the struct with the data
customArray_ptr = &customArray; //get the adress of the structure and assign it to the pointer
return customArray_ptr; //return the pointer
}
return NULL;
}
E 'possibile che invia un tipo di dati come parametro così posso malloc memoria per tale tipo di dati e espressi come quella proposta tipo di dati in un array dinamico ?
Grazie in anticipo,
Marnix van Rijswijk
Non pensare in puro C è possibile passare i tipi di dati in questo modo. Esaminando le lingue che supportano l'elenco di array eterogenei, ad esempio C#, funziona solo per tipi di dati non di base, vale a dire Classi e non su int, float ecc. Poiché C non è orientato agli oggetti, è altamente improbabile che si ottenga questa funzione. –
non avviare identificatori con underscore: tali nomi sono riservati per l'implementazione (compilatore + libc); l'uso di un carattere di sottolineatura e un caso di maiuscole è doppiamente negativo: questi nomi sono riservati in qualsiasi contesto perché è quello che usano le nuove funzionalità della lingua (ad esempio '_Pragma',' _Complex', '_Bool', ...); una soluzione semplice è quella di utilizzare caratteri di sottolineatura finali, che suona anche con il namespace basato su prefisso – Christoph
Ci sono un certo numero di domande sul sito su come si possono costruire comportamenti orientati agli oggetti in c: [Object-Orientation in C] (http://stackoverflow.com/q/415452/2509) e [È possibile scrivere codice orientato agli oggetti in C?] (http://stackoverflow.com/q/351733/2509) e altri. Potresti ottenere il risultato desiderato con un uso giudizioso di 'sizeof' e il meccanismo del puntatore a funzioni discusso nei collegamenti, ma sarà più un lavoro che vale la pena. L'interfaccia di 'qsort' e' bsearch' è un compromesso. – dmckee