Struktury dat – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Struktury dat – C / C++ – Fórum – Programujte.comStruktury dat – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
oxidián0
Věrný člen
13. 3. 2015   #1
-
0
-

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ěť.

Nahlásit jako SPAM
IP: 78.45.199.–
Reklama
Reklama
vitamin+8
Grafoman
13. 3. 2015   #2
-
0
-

Pre maly pocet objektov: 


enum Type{
	Type_A,
	Type_B,
	Type_C
};

typedef struct{
	Type type;    //typ premennej vo vaiante
	union{
		A a;   
		B b;
		C c;
	};
}Variant;
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 230 hostů

Podobná vlákna

Stoj.dat + 20 = bezi.dat — založil Leopik

Struktury — založil Matěj Andrle

Struktury — založil Samuel Lehotský

Struktury — založil RePRO

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý