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í
×
    dnes 15:00 | Komunita

    O víkendu probíhá v Bostonu, a také virtuálně, konference LibrePlanet 2024 organizovaná nadací Free Software Foundation (FSF).

    Ladislav Hagara | Komentářů: 0
    dnes 13:22 | Nová verze

    Nová vývojová verze Wine 9.8 řeší mimo jiné chybu #3689 při instalaci Microsoft Office 97 nahlášenou v roce 2005.

    Ladislav Hagara | Komentářů: 0
    včera 13:11 | Nová verze

    Coppwr, tj. GUI nástroj pro nízkoúrovňové ovládání PipeWire, byl vydán v nové verzi 1.6.0. Zdrojové kódy jsou k dispozici na GitHubu. Instalovat lze také z Flathubu.

    Ladislav Hagara | Komentářů: 0
    2.5. 22:33 | Nová verze

    Byla vydána dubnová aktualizace aneb nová verze 1.89 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Vypíchnout lze, že v terminálu lze nově povolit vkládání kopírovaného textu stisknutím středního tlačítka myši. Ve verzi 1.89 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 19
    2.5. 21:22 | Nová verze

    Proton, tj. fork Wine integrovaný v Steam Play a umožňující v Linuxu přímo ze Steamu hrát hry určené pouze pro Windows, byl vydán ve verzi 9.0-1 (𝕏). Přehled novinek se seznamem nově podporovaných her na GitHubu. Aktuální přehled her pro Windows běžících díky Protonu také na Linuxu na stránkách ProtonDB.

    Ladislav Hagara | Komentářů: 2
    2.5. 19:33 | Nová verze

    Byla vydána verze 1.78.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání na GitHubu. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    2.5. 11:22 | Bezpečnostní upozornění

    Služba Dropbox Sign (původně HelloSign) pro elektronické podepisování smluv byla hacknuta.

    Ladislav Hagara | Komentářů: 2
    2.5. 11:00 | Nová verze

    Byla vydána nová major verze 8.0 textového editoru GNU nano (Wikipedie). Podrobný přehled novinek a oprav v oznámení v diskusním listu info-nano nebo v souboru ChangeLog na Savannah. Volbou --modernbindings (-/) lze povolit "moderní" klávesové zkratky: ^C kopírování, ^V vložení, ^Z vrácení zpět, … Tato volba je aktivována také pokud binárka s nano nebo link na ni začíná písmenem "e".

    Ladislav Hagara | Komentářů: 3
    1.5. 23:22 | IT novinky

    Před 60 lety, 1. května 1964, byl představen programovací jazyk BASIC (Beginners' All-purpose Symbolic Instruction Code).

    Ladislav Hagara | Komentářů: 23
    1.5. 22:22 | Nová verze

    Byla vydána nová verze 12.0 minimalistické linuxové distribuce (JeOS, Just enough Operating System) pro Kodi (dříve XBMC) a multimediálního centra LibreELEC (Libre Embedded Linux Entertainment Center). Jedná se o fork linuxové distribuce OpenELEC (Open Embedded Linux Entertainment Center). LibreELEC 12.0 přichází s Kodi 21.0 "Omega".

    Ladislav Hagara | Komentářů: 0
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (37%)
     (16%)
     (28%)
     (19%)
    Celkem 43 hlasů
     Komentářů: 8, poslední dnes 08:25
    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.