abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 17:11 | Nová verze

    Byl vydán Nextcloud Hub 8. Představení novinek tohoto open source cloudového řešení také na YouTube. Vypíchnout lze Nextcloud AI Assistant 2.0.

    Ladislav Hagara | Komentářů: 2
    včera 13:33 | Nová verze

    Vyšlo Pharo 12.0, programovací jazyk a vývojové prostředí s řadou pokročilých vlastností. Krom tradiční nadílky oprav přináší nový systém správy ladících bodů, nový způsob definice tříd, prostor pro objekty, které nemusí procházet GC a mnoho dalšího.

    Pavel Křivánek | Komentářů: 6
    včera 04:55 | Zajímavý software

    Microsoft zveřejnil na GitHubu zdrojové kódy MS-DOSu 4.0 pod licencí MIT. Ve stejném repozitáři se nacházejí i před lety zveřejněné zdrojové k kódy MS-DOSu 1.25 a 2.0.

    Ladislav Hagara | Komentářů: 34
    25.4. 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 13
    25.4. 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 3
    25.4. 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    25.4. 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    25.4. 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    25.4. 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    25.4. 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (74%)
     (8%)
     (2%)
     (16%)
    Celkem 814 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Funkce strtol a nanosleep (jazyk C)

    28.3.2017 21:09 | Přečteno: 1532× | Linux | poslední úprava: 28.3.2017 21:07

    Funkce strtol() se nachází v hlavičkovém souboru stdlib.h a je součástí standardní knihovny ANSI C.

    long int strtol(const char *str, char **endptr, int base)

    str je řetězec s číslem,

    endptr je zbývající nečíselná část. Takže pokud v str bude "25pes", endptr bude obsahovat "pes". Pokud o tuto koncovku nestojíme, můžeme endptr nastavit na NULL,

    base je číselná soustava, na výběr je soustava dvojková až šestatřicátá.

    Funkce strtol() vrací číselnou hodnotu převáděného řetězce. Dojde-li k přetečení nebo podtečení vrací symbolickou konstantu LONG_MAX, resp. LONG_MIN a zároveň je do proměnné errno přiřazena hodnota symbolické konstanty ERANGE.

    Funkce atol(), atoi() a atof() jsou zastaralé a nebezpečné, jelikož umožňují přetečení čísla.


    Funkce nanosleep() pozastaví spuštěný program. Funkce se nachází v hlavičkovém souboru time.h a není součástí standardní knihovny.
    int nanosleep(const struct timespec *req, struct timespec *rem)
    
    struct timespec {
    	time_t tv_sec;		/* sekundy */
    	long   tv_nsec;		/* nanosekundy */
    };
    Funkce nanosleep() při úspěšném proběhnutí vrací 0. Pokud se vyskytne chyba, funkce vrátí -1, proměnnou errno nastaví na jednu z možných symbolických konstant a v určitých případech zapíše zbývající čas do ukazatele rem, pokud není nastaven na NULL.

    Hodnota tv_nsec musí být mezi 0 a 999999999.

    (Nanosekunda je miliardtina sekundy.)

    Pokud se spokojíme s pauzou v rozmezí sekund, můžeme použít funkci sleep(), která se nachází v hlavičkovém souboru unistd.h, její použití je méně komplikované.
    sleep(5); 	/* pauza 5 sekund */

    Následuje ukázka, jak funkce strtol() a nanosleep() použít. Program načítá celá čísla z klávesnice. Číslo je načteno jako řetězec a převedeno na typ int long pomocí funkce strtol(). Funkce estrtol() kontroluje, zda řetězec s číslem neobsahuje nečíselné znaky, zda nedošlo k přetečení nebo podtečení a zda nebyl odentrován prázdný řetězec. Po stisknutí CTR-D funkce fgets() načte symbolickou konstantu EOF (end of line) a fgets() vrátí NULL, čímž se ukončí načítání z klávesnice. Program poté čísla srovná a každé číslo vypíše s půlsekundovou prodlevou.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <errno.h>
    #include <limits.h>
    
    enum {
    	MAXNUM = 100,	
    	MAXLINE = 25,
    	DELAY = 500000000	
    };
    
    typedef struct numbers {
    	long array[MAXNUM];
    	int num;
    } NUMBERS;
    
    int readline(char *a);
    int estrtol(char *line, long *n);
    int cmp(const void *p1, const void *p2);
    void nanoprint(NUMBERS n);
    
    
    int main()
    {	
    	NUMBERS n = {{0}, 0};
    	
    	char line[MAXLINE];	
    	int i = 0;		
    	
    	printf("Zadejte cela cisla:\n");
    	
    	while (readline(line)) {
    		if (estrtol(line, &n.array[i])) {	
    			n.num++;		
    			i++;
    		}
    	}	
    	
    	printf("\n");
    	
    	qsort(n.array, n.num, 
    			sizeof(n.array[0]), cmp);	
    	
    	nanoprint(n);	
    		
    	return 0;
    }
    
    int readline(char *line)
    {	
    	int len;
    	
    	if (fgets(line, MAXLINE, stdin) != NULL) {    		
    		len = strlen(line);
    		if (len + 1 == MAXLINE &&
    			line[len-1] != '\n')		
    			while (getchar() != '\n')
    				;						
    		if (line[len-1] == '\n')
    			line[len-1] = '\0';	
    		return 1;
    	} 
    	else	
    		return 0;	
    }
    
    int estrtol(char *line, long *n)
    {
    	char *endptr;
    	errno = 0;
    	
    	*n = strtol(line, &endptr, 10);		
    	
    	if (*endptr != '\0') {
    		printf("error: not a number\n");
    		return 0;
    	} 
    	else if (errno == ERANGE && *n == LONG_MAX) {  
    		printf("error: overflow\n");					
    		return 0;
    	}
    	else if (errno == ERANGE && *n == LONG_MIN) {  
    		printf("error: underflow\n");		
    		return 0;
    	}
    	else if (endptr == line) {
    		printf("error: empty input\n");		
    		return 0;
    	}
    	else
    		return 1;
    }
    
    int cmp(const void *p1, const void *p2)
    {
    	long a, b, c;
    	
    	a = *(long *) p1;
    	b = *(long *) p2;
    	
    	c = a < b ? -1 :
    		a == b ? 0 : 1;
    	
    	return c;
    }
    
    void nanoprint(NUMBERS n)
    {	
    	struct timespec ts = {0, DELAY};
    	int i;
    	
    	for(i = 0; i < n.num; i++) {
    		printf("%ld\n", n.array[i]);
    		nanosleep(&ts, NULL);	
    	}
    }
           

    Hodnocení: 50 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

    28.3.2017 21:50 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    long int strtol(const char *str, char **endptr, int base)
    Proč vlastně?
    28.3.2017 22:02 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Funkce nepotřebuje ten string měnit, takže není důvod tam const nedat, aspoň se vyhnete zbytečnému přetypovávání v případě, že potřebujete předat string, který už const je.
    28.3.2017 23:13 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Aha divný já měl pocit že mě jednou gcc varovalo že vyžaduje const char * ...
    28.3.2017 22:29 dev
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    ze slušnosti.
    Bedňa avatar 28.3.2017 23:07 Bedňa | skóre: 34 | blog: Žumpa | Horňany
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Je otázka či o toto ešte niekto v 21stročí stojí :)
    KERNEL ULTRAS video channel >>>
    29.3.2017 11:31 Jardík
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    U funkce strtol (a příbuzných) je dobré zmínit, že pro správnou detekci selhání je před voláním funkce potřeba nastavit ručně errno na nulu. V opačném případě je jakýkoliv další pokus o zjištění selhání (přetečení) naprosto zbytečná záležitost. U příbuzných unsigned variant (strtoul) bych zmínil, že klidně přijmou záporné číslo a "zkonvertují" ho na kladné (podle pravidla převodu signed na unsigned). Proto je dobré před voláním funkce zkontrolovat první nebílý znak, jestli není mínus.
    29.3.2017 11:36 Jardík
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Vidím, že v kódu errno na nulu nastavuješ, stálo by ale za to zmínit to v zápisu.
    Josef Kufner avatar 31.3.2017 17:45 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Koukni na http://cppreference.com/ a na manuálové stránky (man 3 strtol).
    Hello world ! Segmentation fault (core dumped)
    6.4.2017 11:25 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    A čo tak skôr použiť int usleep(useconds_t usec) z unistd.h?
    6.4.2017 12:38 sad
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Tato funkce je zastaralá.
    11.4.2017 20:54 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Kto povedal? Prečo? ... V unistd.h je stále.
    12.4.2017 08:58 sad
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Tak píšou to zde.
    6.4.2017 13:36 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Štruktúru NUMBERS radšej definuj ako numbers_t. Rob radšej tak. Ak nechapeš, začni čítať iné kody a zmeniš možno názor.

    A nedefinuj takto:
    NUMBERS n = {{0}, 0};
    
    ale
    numbers_t numbers;
    // bzero(&numbers, sizeof(numbers_t)); /* keď nenastavuješ všetky prvy v štrukture pri inicializacií v programe */
    numbers.array={0};
    numbers.num=0;
    
    A parametre funkcie nedefinuj ako typ void, ale ako long *. Nakoľko môžeš pri preklade dať skontrolovať typovú kontrolu. Čo pri void sa stratí.
    6.4.2017 13:56 sad
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Díky za tipy.
    6.4.2017 14:11 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    "Polymorfizmus" void používaj, keď je potrebné. V Tvojom prípade nie je nutné.
    6.4.2017 14:16 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Ako pre int cmp(const void *p1, const void *p2).

    Založit nové vláknoNahoru

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