Jak v C řešíte deklaraci objektu když předem nevíte jakého typu bude?
Příklad dělení dat v souboru:
1) hlavička celého souboru
2) hlavička sekce, obsahuje popis podsekce, velikost sekce, a začátek první sekce, aj.
3) hlavička podsekce
obsahuje v první řadě typ podsekce, dále obsahuje ale různé informace typu uint32_t ale každá kolonka má jiný význam a navíc jich může být odlišný počet.
Dalo by se udělat pro to typedef struct SUBSECTION {typ A; typ B; typ C; typ D; typ E; typ F;};
ale to vám nic neříká o tom co se pod daným členem nachází a jestli ten člen je iniciován nebo ne resp. jestli s ním mám pro danou podsekci počítat nebo ne..
za hlavičkou podsekcí může následovat třeba 1000 dalších podsekcí na stejné úrovni, ale máte např. 256 různých typů hlaviček.
dám sem rozdělaný kód ať je jasný v čem to mám uložený:
/** READ SECTIONS **/
SECTION_HEADER_t * sh;
sh = malloc(h.sections_count* sizeof(SECTION_HEADER_t) );
if (sh==NULL) {
free(buffer); exit(-2);
}
//buffer=begin1+
int n=0;
for (;n<h.sections_count; n++){
read4bytes(&begin1, &sh[n].type);
read4bytes(&begin1, &sh[n].subsection_size_factor);
read4bytes(&begin1, &sh[n].subsections_count);
read4bytes(&begin1, &sh[n].file_offset);
read4bytes(&begin1, &sh[n].total_size); // total size
subSection_size = ((sh[n].subsection_size_factor & 0x10000) | 0x40000) >> 0x0E;
} // END of read sections
/** READ SUB SECTIONS [0] **/
// ONE DIMENSION READING
// FOR MULTIPLE SECTIONS CREATE NEW ARRAY of ssh
SUBSECTION_HEADER_t * ssh;
ssh = malloc(sh[0].subsections_count* sizeof(SUBSECTION_HEADER_t) );
if (ssh==NULL) {
free(buffer); exit(-2);
}
/* Move to correct position in buffer*/
begin2 += sh[0].file_offset;
n=0;
for (;n<sh[n].subsections_count; n++){
if (sh[n].type==101){ // 0x65 type
read4bytes(&begin2, &ssh[n].A);
}
// PROBLÉM JE V TOM, ŽE KAŽDÁ PODSEKCE
// MŮŽE MÍT JINOU STRUKTURU DAT
read4bytes(&begin2, &ssh[n].B);
read4bytes(&begin2, &ssh[n].file_offset);
read4bytes(&begin2, &ssh[n].size);
/* MOVE TO NEXT SUBSECTION OFFSET in buffer */
begin2 = begin3 + ssh[n].file_offset + ssh[n].size;
} // END of read sub-sections
není to nic důležitého, takže se nenamáhejte s psaním dlouhého kódu, jen mě zajímá jak se to v takových případech řeší.
Je s tím spojena i ta alokace paměti, že když sice znám počet podsekcí, ale neznám jakého typu jsou ty struktury tak nemohu přesně alokovat paměť.