Czy można replikować ogólną tablicę w czystym ANSI-C?Czysta ANSI-C: generic array
Mam tę strukturę, która posiada tablicę (w tej chwili dla pływaków) i niektóre zmienne, takie jak rozmiar i pojemność mutacji w tablicy.
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;
używam tej struktury, więc mogę zrobić tablicę w czystym C, gdzie mogę dodać/usunąć elementy, dynamicznie rozwinąć rozmiar tablicy, gdy są potrzebne itd. Wszystkie rzeczy „standard” tablica ma, oprócz tego, że jest wykonane tylko w C. A teraz chcę to zrobić, aby po zainicjowaniu tej struktury można było ustawić typ danych elementów, które powinien on posiadać, w tej chwili jest on zdolny do przechowywania typów danych typu float, ale chcę, aby był on przechowywany typ danych/inne struktury. Ale nie wiem, czy to nawet możliwe.
W tej chwili funkcja do tej tablicy jest:
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;
}
Czy to możliwe, aby podać typ danych jako parametr, więc mogę malloc pamięci dla tego typu danych i rzucił ją jak podano typ danych w tablicy dynamicznie ?
Dzięki z góry,
Marnix van Rijswijk
nie myślcie w czystym C można przekazać typy danych w ten sposób. Patrząc na języki, które obsługują heterogeniczną listę tablic, np. C#, działa ona tylko dla nie podstawowych typów danych, to jest Klasy, a nie na int, float itp. Ponieważ C nie jest zorientowana obiektowo, jest wysoce nieprawdopodobne, aby uzyskać ten obiekt. –
nie uruchamiaj identyfikatorów z podkreśleniami: takie nazwy są zarezerwowane dla implementacji (kompilator + libc); używanie podkreślenia i wielkie litery są podwójnie złe: nazwy te są zarezerwowane w dowolnym kontekście, ponieważ używają nowych funkcji językowych (np. '_Pragma',' _Complex', '_Bool', ...); Prostym sposobem obejścia tego problemu jest używanie końcowych znaków podkreślenia, co jest również przyjemne z prefiksem opartym na prefiksach. – Christoph
Na stronie jest wiele pytań dotyczących tego, jak można konstruować zachowania obiektowe w c: [Object-Orientation in C] (http: // /stackoverflow.com/q/415452/2509) i [Czy można napisać kod obiektowy w języku C?] (http://stackoverflow.com/q/351733/2509) i inne. Możesz osiągnąć pożądany rezultat dzięki rozsądnemu użyciu 'sizeof' i mechanizmowi wskaźnika funkcji omawianego w linkach, ale będzie to więcej pracy, która jest warta. Interfejs 'qsort' i' bsearch' jest kompromisem. – dmckee