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ářů: 33
    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

    Dynamická alokace a qsort (jazyk C)

    24.1.2017 00:06 | Přečteno: 1639× | Ostatní | poslední úprava: 24.1.2017 00:14

    Program po zadání prázdného řetězce srovná dle abecedy již vložené řádky. Nejsem si úplně jist správným postupem u dynamické alokace, ale zdá se, že program funguje správně.

    soubor sorting.h
    int cmp(char *s1, char *s2);
    char **alloclines(int n);
    void print(char **l, int n);
    int readline(char *l);
    char **realloclines(char** memold, int *nold);
    void freelines(char **l, int n);
    
    soubor sorting.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "sorting.h"
    
    #define MAXLINE		1000
    
    int main()
    {	
    	char **lines, line[MAXLINE];
    	int nlines = 0, nmem = 5;
    	
    	lines = alloclines(nmem);
    	
    	while (readline(line) > 1) {		
    		
    		if (nlines >= nmem)	
    			lines = realloclines(lines, &nmem);		
    		
    		strcpy(lines[nlines], line);
    		nlines++;	
    	}
    	
    	qsort((void*) lines, nlines, sizeof(char *), (int (*)(const void *, const void*))
     cmp); 
    	
    	print(lines, nlines);	
    	
    	freelines(lines, nlines);	
    	
    	return 0;
    }
    
    int cmp(char *s1, char *s2)
    {
    	char *t1 = *(char**)s1;
    	char *t2 = *(char**)s2;
    
    	return strcmp(t1, t2);
    }
    
    
    char **alloclines(int n)
    {		
    	char **p;
    	int i;
    	
    	p = (char **) malloc(sizeof(char *) * n);
    	
    	if (p == NULL) {
    		printf("alloclines() error\n");
    		exit(1);
    	}
    	
    	for (i = 0; i < n; i++) {
    		p[i] = (char *) malloc(sizeof(char) * MAXLINE);
    		
    		if (p[i] == NULL) {
    			printf("alloclines() error\n");
    			exit(1);
    		}	
    	}
    	
    	return p;
    }
    
    void print(char **l, int n)	 
    {	
    	int i;
    	
    	for (i = 0; i < n; i++)
    		printf("%s", l[i]);
    }
    
    int readline(char *l)
    {	
    	fgets(l, MAXLINE, stdin); 
    	
    	return strlen(l);
    }
    
    
    char **realloclines(char** memold, int *nold)
    {
    	char **memnew;	
    	int i, nnew;
    	
    	nnew = *nold * 2;	
    	
    	memnew = (char **) realloc(memold, sizeof(char *) * nnew);
    	
    	if (memnew == NULL) {
    		printf("realloclines() error\n");
    		exit(1);
    	}
    	
    	for (i = *nold ; i < nnew; i++) {
    		memnew[i] = (char *) malloc(sizeof(char) * MAXLINE);
    		
    		if (memnew[i] == NULL) {
    			printf("realloclines() error\n");
    			exit(1);
    		}	
    	}
    	
    	*nold = nnew;
    	
    	return memnew;
    }
    
    void freelines(char **l, int n)
    {
    	int i;
    	
    	for (i = 0; i < n; i++) 
    		free((void *)l[i]);
    
    	free((void *)l);
    }
    
           

    Hodnocení: 33 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

    24.1.2017 09:24 sad
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Objevil jsem chybu ve funkci freelines(), druhý argument má být nmem.
    24.1.2017 13:54 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Tvoj program skoro robí ako príkazy # cat | sort

    Súbor sorting.h napíš tak, aby zabránilo vnorenému vkladaniu:
    
    #ifndef SORTING_H
    #define SORTING_H
    
    char **alloclines(int n);
    char **realloclines(char** memold, int *nold);
    int cmp(char *s1, char *s2);
    int readline(char *l);
    void freelines(char **l, int n);
    void print(char **l, int n);
    
    #endif
    
    Sprav, nech načítava ne do prázdneho riadku, ale dokiaľ je vstup. Vstup ukončíš v konzole CTRL + D. ...
    if(fgets(...) == NULL)
    {
        // vstup bol ukončený
    }
    
    A funkciu main dávaj nakoniec v súbore (alebo najdôležitejšiu funkciu, ak tam nie je main v zdrojovom kóde). Taký nejaký profesionálnejší štandard.

    A ďalšia poznámka. Neplytvaj pamäťou. Tj. alokuj pamäť na riadok, až keď budeš mať riadok načítaný. Vtedy vieš jeho veľkosť, a miesto MAXLINE alokuješ reálnu veľkosť.

    A použi štruktúru (dátový typ), popíš ňou riadky a s ňou pracuj. A aj tú daj na spracovanie funkciám ako parameter. To potom bude krása.

    A keď chceš profesionálnejšie, tak aj testuj stupy pre funkcie. Chyba je NULL, a co ak všade pošlem napr. pre char **realloclines(char** memold, int *nold) ako memold NULL alebo *NULL;
    24.1.2017 14:10 sad
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Díky za rady.
    24.1.2017 14:42 R
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Hlavne je ten .h subor uplne zbytocny a tie deklaracie funkcii z neho tiez. Staci presunut funkcie tak, aby boli pred ich pouzitim uz definovane (tzn. okrem ineho aj ten main na konci).
    25.1.2017 23:49 Kate | skóre: 9
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Protože proč programovat přehledně, když to jde i húř :)
    26.1.2017 08:55 Petr
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    přehledně v céčku?

    smutný vočičko, když jsem pečená?
    26.1.2017 10:42 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Jenže on má pravdu, .h soubor pouze pro main.c opravdu moc nemá moc smysl. .h soubor má smysl, pokud ho bude někdo includovat, nejlépe více souborů než jen main.c
    26.1.2017 12:36 R
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Co je prehladne na tom, pridavat do kodu zbytocne riadky a aby to nebolo malo, tak ich dat do samostatneho zbytocneho suboru?
    27.1.2017 09:26 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Většinou se tomu snažím vyhnout, ale někdy je přehlednější řadit funkce podle toho, jak k sobě logicky patří, a nemuset se nechat svazovat tím, která kterou volá (někdy to ani nejde). Na druhou stranu, pokud není funkce zamýšlena jako určená k volání z jiného souboru, stačí na to deklarace na začátku a není potřeba ji dávat do hlavičkového souboru - nebo to spíš není ani žádoucí (a stejně by bylo lepší ji rovnou deklarovat jako static).
    xkucf03 avatar 24.1.2017 17:13 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Tvoj program skoro robí ako príkazy # cat | sort
    If you hold a UNIX shell up against your ear. Can you hear the C?

    :-)
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    24.1.2017 19:49 Kvakor
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Tvoj program skoro robí ako príkazy # cat | sort A ďalšia poznámka. Neplytvaj pamäťou. Tj. alokuj pamäť na riadok, až keď budeš mať riadok načítaný. Vtedy vieš jeho veľkosť, a miesto MAXLINE alokuješ reálnu veľkosť.
    Jednoduché řešení je mít samostatný buffer pro vstup a v okamžiku, kdy je řádek načtený, tak ho vykopírovat na čílové místo něčím na způsob strdup(), takže se použije jen tolik paměti, co je třeba. Onen vstupní buffer může být ve většině případů dokonce staticky alokovaný, případně dynamicky alokovaný na určitou předem nastavenou velikost, protože pokud nepotřebujeme neomezeně dlouhé řádky, je jednodušší řešení nesmyslně dlouhé řádky zahazovat (k čemu je např. konfugurační soubor, z jehož čtení nám půjdou oči šejderm a při jehož editaci se uscrollujeme k smrti :-) ) .

    No a pokud je třeba dynamická alokace, tak nemá smysl zvyšovat velikosti po jednotkách byte, minimální granularita většiny implementací hald je většinou kolem šestnácti byte a pokud se paměť opravdu přidává, tak je to minimálně o velikosti jedné stránky (4KB na x86 a běžných ARMech, dá se zjistit dynamicky přes getpagesize() nebo sysconf()). Když už, tak zvětšovat právě o velikost stránky nebo něco strovnatelného.

    Mimo toho, že se ušetří čas, kderý by se zbytečně trávil managementem haldy (bez toho, že by zavolal sbrk()), to má vliv i na nižší fragmentaci haldy, obzvlášť pro pesimální případy, kde délka řádku monotóně roste s jeho pozicí (takže nelze znovu použít uvolněné "díry" v haldě).

    PS: Když se toto alokuje opravdu, ale opravdu hodně (IIRC, limit je 128MB u GNU libc), tak malloc() a spol. začnou požívat místo haldy přímé mapování anonymní paměti pčes mmap() (tedy, v unixech, jask se to dělá ve Windows, nemám potuchy). Osobně si myslím, že pak je lepší se na paměťový management přes malloc() a spol. vykvajznout a buď použít nějaký lepší alokátor, nebo si to dělat ručně právě přes malloc(), což má navíc výhodu v tom, že můžeme mnohem přesněji ovlivnit, jak se s pamětí nakládá (přes madvise())nebo kdy se paměť uvolní (nutné, když jednu chvíli potřebujeme spoustu paměti a v té náskledujcí jí musíme zase uvolnit pro někoho jiného).
    24.1.2017 20:54 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Alebo napríklad použi/inšpiruj sa GNU rozšírením getline(). Viď tam príklad v časti Example.
    Jendа avatar 24.1.2017 23:55 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    IIRC, limit je 128MB u GNU libc
    Moje mallopt(3) říká, že ten limit je 128 KiB.
    25.1.2017 11:25 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    tak malloc() a spol. začnou požívat místo haldy přímé mapování anonymní paměti pčes mmap()
    Python (resp. CPython) dělá něco takového taky. Debugování memory leaků je pak výborný :-/
    26.1.2017 13:34 ...
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Měmory leak v Pythonu? Wtf?
    26.1.2017 13:37 Jistota Desetinásobku
    Rozbalit Rozbalit vše Memory leak
    Ten můžeš mít v jakémkoli jazyce, klidně i s GC nebo RAII.
    26.1.2017 13:48 ...
    Rozbalit Rozbalit vše Re: Memory leak
    Code or it didnt happen
    26.1.2017 14:01 smazáno | skóre: 18 | blog: smazáno
    Rozbalit Rozbalit vše Re: Memory leak
    >>> import kerberos
    >>> kerberos.authGSSClientInit("HTTP@krbhost.example.com")
    (1, <PyCObject object at 0x7f56004e65d0>)
    >>> 
    
    Ano, muze za to kerberos modul napsany v C, ale hadam ze debugovani python C extensions mel prave kralyk na mysli.
    26.1.2017 14:33 Jistota Desetinásobku
    Rozbalit Rozbalit vše Re: Memory leak
    Žádný jazyk/kompilátor/VM neví, které objekty (obecně data) jsou legitimní a chceš je držet v paměti, a které jsou tam jen zapomenuté a nikdy už nebudou potřeba. Pokud si např. programátor při zpracování každého řádku/requestu něco někam uloží a pak to po sobě neuklidí, počítač nemůže vědět, jestli to byl záměr (a na konci se bude dělat třeba nějaký součet nebo statistika) nebo jestli je to memory leak.

    Existují nástroje, které tyhle chyby dokáží s určitou mírou pravděpodobnosti/chybovosti odhalit, ale rozhodně to za tebe nevyřeší jazyk/kompilátor. GC nebo RAII jsou dobré věci a hodně chybám dokáží předejít, ale ne všem -- odpovědnost je vždycky na programátorovi a ten by si neměl naivně myslet, že když nedělá v céčku, ale něčem vyšším, že se ho memory leaky netýkají. Třeba dneska se jedny z největších prasečin dějí na webu resp. v JavaScriptu -- časté jsou stránky/aplikace, které vyžírají enormní množství paměti, neuklízí po sobě (a kromě toho ti vyžerou i takty CPU potažmo baterku, když tam nějaká je).
    26.1.2017 14:30 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Měmory leak v Pythonu? Wtf?
    Python-C interop. Céčková strana naalokuje nějaké pythonní objekty a neuvolní je. Tyhle objekty můžou bejt naalokovaný přes malloc, ale někdy taky přes mmap (zcela bez volání mallocu). Nástroje jako valgrind a podobně tohle nedohledají. Nakonec jsem to řešil trasováním mmap syscallu a koukal na backtraces, abych zjistil, odkud se to alokuje. Možná existuje chytřejší způsob.
    pavlix avatar 27.1.2017 01:03 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Pythoní kód leakuje běžně a řeší se to podle mě daleko hůř než u céčkovského kódu.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    27.1.2017 01:51 .
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Jasně. Jak výše vyplynulo, leakuje nějakej c bazmek, ale může za to Python.
    pavlix avatar 27.1.2017 08:52 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    To jste ovšem poněkud pod jiným komentářem.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    27.1.2017 10:43 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Jasně. Jak výše vyplynulo, leakuje nějakej c bazmek, ale může za to Python.
    Tenhle čistě pythonní kód u mě sežere ~1GB RAM:

    #!/usr/bin/env python2
    
    import sys
    
    class Foo(object):
        def __init__(self, other=None):
            self.other = other
    
        def __del__(self):
            pass
    
    if __name__ == "__main__":
        for i in range(1000000):
            foo = Foo()
            bar = Foo(foo)
            baz = Foo(bar)
            foo.other = baz
        sys.stdin.readline()
    

    (V Pythonu 3 mi to nejde reprodukovat, proto then python2)

    Jinak ale leaky jdou vytvořit i bez triků s __del__, viz třeba tenhle kód:

    #!/usr/bin/env python3
    
    import sys
    
    
    foobar = []
    
    def avg_line_length(file):
        avg = len(file.readline())
        if avg == 0:
            return 0
        else:
            avg -= 1
        n = 1
        for line in file:
            n += 1
            avg = avg + (len(line) - 1 - avg) / n
            foobar.append(line)
        return avg
    
    if __name__ == "__main__":
        print(avg_line_length(sys.stdin))
        sys.stdin.readline()
    

    Tady je sice hodně zřejmý, kde a proč to leakuje, ale jakmile budeš mít nějakou větší codebase ve který bude podobný problém zašmodrchaný a rozetřený přes X modulů, už nebude tak snadný to dohledat.

    Tož tak.
    27.1.2017 11:13 Petr
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Já tomu python3 kódu moc nerozumím, ale za ten leak považuješ ten foobar?
    27.1.2017 11:16 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Já tomu python3 kódu moc nerozumím, ale za ten leak považuješ ten foobar?
    Jj. Kvůli němu má ten program lineární paměťovou složitost místo konstantní.
    27.1.2017 14:12 Petr
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Tomu se ale snad nedá říkat leak, to je skladiště, které jsi zcela explicitně vytvořil.
    27.1.2017 16:28 JS1 | skóre: 2 | blog: intuition_pump
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Skladiste, ktere se nepouziva, je leak. Treba kdyby se ta smycka dela v serveru, byl by to problem.
    Lidstvo čelí v tomto století hrozbě civilizačního kolapsu. Podpořte hnutí klimatickakoalice.cz!
    27.1.2017 17:29 Petr
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Tak s takovou definicí může leakovat skutečně cokoliv. A v některých případech to dokonce může být v očích pozorovatele.
    27.1.2017 18:06 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    To se ale principielně od toho céčka neliší.

    Leak je paměť (nebo obecně jakýkoli resource), který program nepotřebuje, ale přitom neuvolnil. GC ti zajistí uvolnění těch objektů, u kterých umí na 100% dokázat, že už je nepotřebuješ (a umí je uvolnit). Když na nějaký objekt program už nemá referenci/pointer, je triválně dokázané, že už ten objekt nemůže potřebovat (nejde to). Ten foobar v tom prográmku výše není k ničemu potřeba, ale GC to nepozná. Být to v nějakém jazyce s nějakým chytrým kompilátorem, mohl bys dostat warning, něco jako "Value assigned to foobar is never used" nebo podobně...

    A ano, to, jestli program nějaký resource potřebuje, může být věc názoru. Např. v některých C/C++/apod. programech jsou objekty, který se jednou naalokujou a záměrně nikdy neuvolní. Valgrind to může označit za leak, ale přitom programátor to za leak nepovažuje.
    xkucf03 avatar 27.1.2017 18:36 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Být to v nějakém jazyce s nějakým chytrým kompilátorem, mohl bys dostat warning, něco jako "Value assigned to foobar is never used" nebo podobně...

    Nevím, jak u pole, ale u obecného objektu dost těžko – máš totiž nějakou instanci a na ní voláš nějakou metodu (append) a jestli tu instanci pak někam přiřadíš nebo s ní uděláš něco jiného je jedno – ta užitečnost mohla spočívat v tom, že jsi volal tu metodu a instance na základě toho něco dělala.
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    27.1.2017 23:40 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Jj, to je pravda. (U vestavěného typu by to sice teoreticky mohlo jít, ale pro kompilátory to je typicky příliš složitý případ...)
    27.1.2017 10:45 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Jinak ještě poznámka:
    leakuje nějakej c bazmek, ale může za to Python.
    Za leak může C bazmek, to je bez debat. Za to, že ten leak šel blbě dohledat nicméně může CPython, protože se snaží bejt chytrej a používat vlastní alokační fígle s mmap(). Jak moc jsou tyhle fígle užitečný, to nevim, možná jsou, ale mám svoje pochybnosti...
    24.1.2017 18:38 Jardík
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    1) Nepoužívej datový typ int pro účel velikosti něčeho v paměti. Velikost toho typu může být nedostatečná, nebo naopak příliš velká. Používej typ size_t. Funkce jako malloc, calloc, realloc, všechny mají parametr typu size_t. Funkce qsort taky očekává parametry typu size_t. Používáním intu se můžeš dopustit závažných chyb, např. přetečení a následné předání špatné velikosti daným funkcí, kvůli konverzím.

    2) Pokud funkce realloc selže, původní buffer není uvolněn. Máš tam možný memory leak ... sice hned voláš exit(), ale může tě to naučit špatným zvyklostem, třeba až takovou kontrolu někdy dáš do nějaké vlastní knihovny, co ukončovat program nebude.

    3) Komparátor funkce qsort má typ int (*)(const void *, const void*). Tvůj má úplně jinou signaturu. To přetypování je hnus, nejsem si jistý, ale asi se dokonce bude jednat i o UB, teoreticky by ty funkce nemusely být volatelné stejným způsobem. A obzvláště, když v tom komparátoru stejně přetypováváš, tak můžeš nechat signaturu správně.

    4) Dynamická alokace je většinou od toho, abys nemusel mít nějaký fixně veliký buffer, což stejně pro jednotlivé řádky máš. Jednotlivé řádky bych alokoval až poté, co ho přečteš.

    5) Asi je zbytečné mít extra funkci pro realokaci, funkci realloc můžeš předat NULL jako první parametr a bude se chovat jako malloc. Stačí inicializovat proměnnou předem na NULL a nemusíš pak mít 2 funkce, co dělají to samé.

    6) Ukazatele (kromě ukazatelů na funkce) jsou implicitně přetypovatelné na void*, netřeba přetypovávat, pokud voláš funkci free(). void* ukazatele jsou implicitně přetypovatelné na ukazatele na jiné (platí pouze v C, v C++ to neplatní).
    vlastikroot avatar 30.1.2017 21:10 vlastikroot | skóre: 24 | blog: vlastikovo | Milevsko
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Co bys mi rekl na to, ze pouzivam na vsechny inty (tzn. i size) fixni typy jako uint8_t? Me prijde size_t jako plytvani pameti na nuly.
    We will destroys the Christian's legion ... and the cross, will be inverted
    30.1.2017 22:36 smazáno | skóre: 18 | blog: smazáno
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    ja bych ti na to zacitoval nejznamejsi citaci Knutha a pak rekl ze plytas stejne jak size_t akorat to tak na prvni pohled nevypada
    27.1.2017 01:44 Maxmilian Prdel
    Rozbalit Rozbalit vše Re: Dynamická alokace a qsort (jazyk C)
    Uplne spatne. Hele chlape, nechces jit delat pro Mikroskrot? Tam neumi programovat nikdo, tak si tam aspon nebudes pripadat tak blbe.

    Založit nové vláknoNahoru

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