Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

Diskusia – 8. diel - Céčko a Linux - getopt_long a shell

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Patrik Pastor:15.9.2019 22:38

Mam ale dotaz k moznosti 'f' (kde si vybiram file). V kode mas promennou 'out' - datoveho typu pointeru na FILE, nastaveny na stdout (pri inicializaci tuto promennou rovnou definujes). Ja se ptam PROC musi byt pri inicializaci tato promenna definovana, kdyz je definovana v jedne z vetvi switch (konkretne: out = fopen (optarg, "w")). Proc jednoduse nemuze byt FILE* out; (pouha inicializace)? Zkousel jsem to poprve, kdyz jsem jeste nevidel kod a sel podle tutorialu a vzdy mi program spadl se segmentation fault , a ja nevedel proc. Rad bych teda vedel, proc datovy typ FILE (navic, rad bych se dozvedel, v jakem souboru muzu najit implementaci datovych typu jazyka c - tedy jak datove typy implementuje OS - v jakem souboru) nemuze byt jednoduse inicializovan, ale musi mu byt rovnou pridelena 'rvalue' - tedy musi byt soucasne definovan. Dekuji za odpoved

 
Odpovedať
15.9.2019 22:38
Avatar
David Novák
Tvůrce
Avatar
Odpovedá na Patrik Pastor
David Novák:13.10.2019 11:09

Protože v cyklu na konci programu se do out vypisuje výstup. Pokud nezadáš parametr f, tak se bude vypisovat na stdout (stejně jako kdybys místo toho použil jen printf).

Pokud bys chtěl používat proměnnou out pouze na výstupní soubor, musel bys pak při výpisu kontrolovat její nastavení podmínkou:

FILE *out = NULL;

...

if (out)
    fprintf(out, ...
else
    fprintf(stdout, ...

Všimni si, že i tak je potřeba inicializovat proměnnou na NULL. Důvod je ten, že lokální proměnné (deklarované v rámci funkce) nejsou inicializované a můžou obsahovat cokoliv - podmínka by pak nefungovala a program by se snažil přistupovat do struktury FILE, která neexistuje (proměnná out je ukazatel).

Typ FILE je abstrakce nad popisovačem souboru, který je v každém OS jiný - jeho použití umožňuje stejnou funkci programu na Windows, Linux atd. Definici můžeš najít v stdio, ale asi to nemá moc smysl. Konkrétní definici je třeba hledat v implementaci - na Linuxu např. glibc.

Odpovedať
13.10.2019 11:09
Chyba je mezi klávesnicí a židlí.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!