abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 15:00 | Zajímavý článek

    Byl publikován přehled vývoje renderovacího jádra webového prohlížeče Servo (Wikipedie) za uplynulé dva měsíce. Servo zvládne už i Gmail. Zakázány jsou příspěvky generované pomocí AI.

    Ladislav Hagara | Komentářů: 1
    včera 17:22 | Nová verze

    Raspberry Pi Connect, tj. oficiální služba Raspberry Pi pro vzdálený přístup k jednodeskovým počítačům Raspberry Pi z webového prohlížeče, byla vydána v nové verzi 2.5. Nejedná se už o beta verzi.

    Ladislav Hagara | Komentářů: 0
    včera 15:22 | Komunita

    Google zveřejnil seznam 1272 projektů (vývojářů) od 185 organizací přijatých do letošního, již jednadvacátého, Google Summer of Code. Plánovaným vylepšením v grafických a multimediálních aplikacích se věnuje článek na Libre Arts.

    Ladislav Hagara | Komentářů: 0
    8.5. 19:22 | Nová verze

    Byla vydána (𝕏) dubnová aktualizace aneb nová verze 1.100 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.100 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 0
    8.5. 18:00 | Nová verze

    Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána v nové verzi 2025.5.

    Ladislav Hagara | Komentářů: 0
    8.5. 01:22 | Nová verze Ladislav Hagara | Komentářů: 0
    8.5. 00:55 | Zajímavý projekt

    PyXL je koncept procesora, ktorý dokáže priamo spúštat Python kód bez nutnosti prekladu ci Micropythonu. Podľa testov autora je pri 100 MHz približne 30x rýchlejší pri riadeni GPIO nez Micropython na Pyboard taktovanej na 168 MHz.

    vlk | Komentářů: 0
    7.5. 19:44 | Nová verze

    Grafana (Wikipedie), tj. open source nástroj pro vizualizaci různých metrik a s ní související dotazování, upozorňování a lepší porozumění, byla vydána ve verzi 12.0. Přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    7.5. 17:33 | Nová verze

    Raspberry Pi OS, oficiální operační systém pro Raspberry Pi, byl vydán v nové verzi 2025-05-06. Přehled novinek v příspěvku na blogu Raspberry Pi a poznámkách k vydání. Pravděpodobně se jedná o poslední verzi postavenou na Debianu 12 Bookworm. Následující verze by již měla být postavena na Debianu 13 Trixie.

    Ladislav Hagara | Komentářů: 0
    7.5. 05:33 | Komunita

    Richard Stallman dnes v Liberci přednáší o svobodném softwaru a svobodě v digitální společnosti. Od 16:30 v aule budovy G na Technické univerzitě v Liberci. V anglickém jazyce s automaticky generovanými českými titulky. Vstup je zdarma i pro širokou veřejnost.

    Ladislav Hagara | Komentářů: 17
    Jaký filesystém primárně používáte?
     (57%)
     (1%)
     (8%)
     (22%)
     (4%)
     (2%)
     (2%)
     (1%)
     (1%)
     (3%)
    Celkem 576 hlasů
     Komentářů: 26, poslední 8.5. 09:58
    Rozcestník

    Dotaz: C - procházení souborů

    15.7.2021 07:45 PA
    C - procházení souborů
    Přečteno: 869×
    Ahoj,

    reším problém, jak v C jednoduše vylistovat a získat názvy soubodů v adresáři a podadresářích.

    Díky za rady.

    PA

    Řešení dotazu:


    Odpovědi

    15.7.2021 08:36 X
    Rozbalit Rozbalit vše Re: C - procházení souborů
    Řešení 1× (Andrej)
    15.7.2021 09:01 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: C - procházení souborů
    Podla C standardu je to opendir(), readdir() a closedir().
    debian.plus@protonmail.com
    15.7.2021 18:56 10minuteman
    Rozbalit Rozbalit vše Re: C - procházení souborů
    To není C standard, to je POSIX standard.

    Pokud má OP POSIX, tak OK, jinak může zkusit něco jako TinyDir.
    15.7.2021 19:56 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: C - procházení souborů
    Máš pravdu, POSIX.
    debian.plus@protonmail.com
    15.7.2021 19:58 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: C - procházení souborů
    A použi rekurziu.
    debian.plus@protonmail.com
    18.7.2021 18:54 jiwopene | skóre: 31 | blog: Od každého trochu…
    Rozbalit Rozbalit vše Re: C - procházení souborů
    Pokud nebude mít velké stack framy té funkce, která prochází. Vzhledem k tomu, že tazatel nespecifikuje hloubku adresářového stromu, by mu to mohlo padat na přetečení zásobníku. „Univerzálnější“ je prohledávat FS do hloubky bez rekurze: dokud zásobník Z (datová struktura na haldě) cest k adresářům není prázdný, opakuj: vezmi ze Z prvek (cestu k adresáři), vypiš všechny soubory v ní a přidej všechny cesty k podadresářům na Z.

    (Tuším tady úkol.)
    .sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
    18.7.2021 23:32 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: C - procházení souborů
    Rekurze bývá implementována zásobníkem. Není tedy důvod k nepoužívání rekurze.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    19.7.2021 18:27 10minuteman
    Rozbalit Rozbalit vše Re: C - procházení souborů
    Zásobník je omezený shora, zatímco hloubka podobné iterace bývá nedeterminovaná/telná, takže to může přetéct. Z toho důvodu se například v C++ nedoporučuje binární strom implementovaný pomocí unique_ptr mazat tak, že smažu kořen.
    19.7.2021 18:32 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: C - procházení souborů
    O jaké hloubce se tady bavíme? Jednotky, tisíce nebo milióny zanoření podadresářů?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    19.7.2021 22:31 10minuteman
    Rozbalit Rozbalit vše Re: C - procházení souborů
    Záleží na velikosti stack framu.

    Většinou je to samozřejmě jedno, ale je fajn mít to na paměti.
    1.8.2021 13:59 rotator
    Rozbalit Rozbalit vše Re: C - procházení souborů
    Hmm, to s tím uvolňováním stromu C++ by mě nenapadlo a říkám si, že kdybych na to někdy narazil, tak se to bude obtížně ladit... díky za radu!
    19.7.2021 11:12 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: C - procházení souborů
    No, je dalsia moznost. A to pouzit inline rekurziu. Lahko citatelny kod pre pouzivatela a optimalizovany kod pre hardver, s minimimom ukladanych dat. ;)

    Ved rekurziu si napis tak, ze pomocne data budu pouzivat haldu a nie stack.

    Pripadne cez goto.

    V Linuxe nie je problem zo stackom pri Intel/AMD pouzitom ako bezne PC, lebo ak je maly stack, da sa prealakovat a bude vacsi.
    debian.plus@protonmail.com
    21.7.2021 09:05 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: C - procházení souborů
    V Linuxe nie je problem zo stackom pri Intel/AMD pouzitom ako bezne PC, lebo ak je maly stack, da sa prealakovat a bude vacsi. V Linuxe nie je problem zo stackom pri Intel/AMD pouzitom ako bezne PC, lebo ak je maly stack, da sa prealakovat a bude vacsi.
    Toto nie je pravda. Da sa iba zmenit velkost pred spustenim (pripadne bez limitu).
    debian.plus@protonmail.com
    24.7.2021 09:47 jiwopene | skóre: 31 | blog: Od každého trochu…
    Rozbalit Rozbalit vše Re: C - procházení souborů
    To není možné si zaalokovat paměť a tam nastavit esp/rsp a ebp/rbp? Nikdy jsem to nezkoušel, ale myslím si, že by to mělo fungovat.
    .sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
    24.7.2021 10:20 jiwopene | skóre: 31 | blog: Od každého trochu…
    Rozbalit Rozbalit vše Re: C - procházení souborů
    Tak jsem to zkusil. Zde je kód pro x86_64:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define CHARS 1024
    
    long int
    move_stack(void *stack_bot, void (*jmp_addr)(void));
    
    void
    function_in_new_stack(void)
    {
    	long int foo;
    	char string[CHARS];
    
    	for (char *ch = string + CHARS; ch >= string; ch--) {
    		*ch = 'A';
    	}
    
    	puts(string);
    
    	printf("Cur. stack ptr: 0x%lx\n", (size_t) &foo);
    }
    
    int
    main(int argc, char **argv)
    {
    	long int foo;
    	void *stack, *stack_bot;
    
    	printf("Cur. stack ptr: 0x%lx\n", (size_t) &foo);
    
    	stack = malloc(4096);
    	stack_bot = stack + 4096;
    
    	printf("New stack addr.: 0x%lx\n", (size_t) stack);
    	printf("New stack bottom: 0x%lx\n", (size_t) stack_bot);
    
    	puts("Moving to the new stack.");
    
    	foo = move_stack(stack_bot, &function_in_new_stack);
    
    	printf("Function worked: 0x%lx %c\n", foo, foo);
    	printf("Cur. stack ptr: 0x%lx\n", (size_t) &foo);
    
    	puts("Freeing the stack.");
    	free(stack);
    }
    .globl move_stack
    move_stack:
    	/* Tyto registry zachováváme. */
    	pushq %rbx
    	pushq %r12
    	pushq %r13
    	pushq %r14
    	pushq %r15
    
    	/* V %rdi je spodek nového stacku, v %rsi funkce k zavolání. */
    
    	/* Poznamenáme si starou adresu stacku. */
    	mov %rsp, %rbx
    
    	/* Přejdeme do nového stacku. */
    	movq %rdi, %rsp
    
    	/* Adresu uložíme na nový stack. */
    	pushq %rbx
    
    	call %rsi
    
    	/* Vrátíme se zpět. */
    	popq %rsp
    
    	/* Uklidíme po sobě. */
    	popq %r15
    	popq %r14
    	popq %r13
    	popq %r12
    	popq %rbx
    
    	/* Vrátíme 'Y' jako návratovou hodnotu. */
    	movq $0x59, %rax
    
    	ret
    
    Funkce move_stack zavolá funkci s daným stackem. Funguje to – viz výstup. Pokud nastavím CHARS na příliš velkou hodnotu (nový stack má 4k), spadne to na SIGSEGV, takže se používá nový stack.
    .sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
    Gréta avatar 21.7.2021 12:12 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: C - procházení souborů

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.