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:55 | IT novinky

    Společnost Volla Systeme stojící za telefony Volla spustila na Kickstarteru kampaň na podporu tabletu Volla Tablet s Volla OS nebo Ubuntu Touch.

    Ladislav Hagara | Komentářů: 3
    včera 17:44 | IT novinky

    Společnost Boston Dynamics oznámila, že humanoidní hydraulický robot HD Atlas šel do důchodu (YouTube). Nastupuje nová vylepšená elektrická varianta (YouTube).

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

    Desktopové prostředí LXQt (Lightweight Qt Desktop Environment, Wikipedie) vzniklé sloučením projektů Razor-qt a LXDE bylo vydáno ve verzi 2.0.0. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 14:22 | IT novinky

    Nejvyšší soud podpořil novináře Českého rozhlasu. Nařídil otevřít spor o uchovávání údajů o komunikaci (data retention). Uvedl, že stát odpovídá za porušení práva EU, pokud neprovede řádnou transpozici příslušné směrnice do vnitrostátního práva.

    Ladislav Hagara | Komentářů: 0
    včera 05:33 | Zajímavý článek

    Minulý týden proběhl u CZ.NIC veřejný test aukcí domén. Včera bylo publikováno vyhodnocení a hlavní výstupy tohoto testu.

    Ladislav Hagara | Komentářů: 22
    včera 04:44 | Nová verze

    Byla vydána nová verze 3.5.0 svobodné implementace protokolu RDP (Remote Desktop Protocol) a RDP klienta FreeRDP. Přehled novinek v ChangeLogu. Opraveno bylo 6 bezpečnostních chyb (CVE-2024-32039, CVE-2024-32040, CVE-2024-32041, CVE-2024-32458, CVE-2024-32459 a CVE-2024-32460).

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

    Google Chrome 124 byl prohlášen za stabilní. Nejnovější stabilní verze 124.0.6367.60 přináší řadu oprav a vylepšení (YouTube). Podrobný přehled v poznámkách k vydání. Opraveno bylo 22 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    včera 02:22 | Nová verze

    Byla vydána nová verze 9.3 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Novinkou je vlastní repozitář DietPi APT.

    Ladislav Hagara | Komentářů: 0
    16.4. 18:44 | Nová verze

    Byl vydán Mozilla Firefox 125.0.1, první verze z nové řady 125. Přehled novinek v poznámkách k vydání, poznámkách k vydání pro firmy a na stránce věnované vývojářům. Vypíchnout lze podporu kodeku AV1 v Encrypted Media Extensions (EME). Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 125.0.1 je již k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    16.4. 16:44 | Nová verze

    Valkey, tj. svobodný fork již nesvobodného Redisu, byl vydán v první stabilní verzi 7.2.5.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (65%)
     (11%)
     (2%)
     (21%)
    Celkem 507 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: C-kompilace: ok, spuštění programu: SIGSEGV

    30.9.2011 19:42 mr.x
    C-kompilace: ok, spuštění programu: SIGSEGV
    Přečteno: 1129×
    Příloha:

    Ahoj vespolek, jsem zacatecnik v cecku a snazim se psat trochu chytrejsi programy. Prave u jednoho jsem se sekl a nemuzu prijit na to, v ktere casti kodu je chyba :-(. Pri kompilaci to nevipise nic, ani varovani, bohuzel behem spusteni to spande a vypise Neoprávněný přístup do paměti (SIGSEGV) .. pouzivam Archlinux, prejel jsem to i debuggerem a ten mi vypise, ze se jedna o chybu

    Program received signal SIGSEGV, Segmentation fault.
    0x00000000004005d5 in serazeni ()

    ... zkousel jsem to znovu prepsat, jestli jsem neudelal nejaku hrubku, ale nic, bohuzel nevim.. jsem zacatecnik, tak to prosim berte na vedomi... kod je prilozeny v souboru. Dekuji vsem za napady, pripominky, dotazy a kritiku.

    Odpovědi

    30.9.2011 20:24 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    Za prvé buď j=3; nebo tot nééé r[2]=58;, a pak se zamyslet na tím, že číslování polí je od 0 po N-1 a s větším index-em se dostanete mimo alokovaný rozsah.

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    30.9.2011 20:45 mr.x
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    jo, prave takove male chyby dokazi pode*at cely kod... diky za upozorneni, vim to, bohuzel jsem si to tedkom neuvedomil a inicializoval s mensim rozsahem... :(
    30.9.2011 20:49 Radovan
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    Já bych začal ještě za nulté, kompiluj takhle:

    gcc -pedantic -Wall serazeni.c

    a dozvíš se:

    serazeni.c: In function ‘serazeni’:
    serazeni.c:22: warning: operation on ‘j’ may be undefined
    serazeni.c: In function ‘main’:
    serazeni.c:36: warning: ISO C90 forbids variable-size array ‘r’
    serazeni.c:36: warning: ISO C90 forbids mixed declarations and code
    serazeni.c:41: warning: control reaches end of non-void function


    Takže ty opravy vezmeme postupně.

    řádek 9: for(;complete<1 && j<=i;j++){
    Proto aby ta smyčka skončila tam kde má, a ne až když se dostaneš do části paměti která patří úplně jinému programu. Tahle chyba způsobuje ten SIGSEGV, prostě ti to operační systém odstřelí, protože vlezeš kam nemáš.

    řádek 22: r[j]=r[j+1];
    řádek 23: r[j+1]=k;
    řádek 24: ++j;
    Viz první warning, tady se prostě nic nestane, j se neinkrementuje, je potřeba upravit index a inkrementovat ručně.
    Pokud to neuděláš, nebude se vyměňovat ale přepisovat a vyjde ti 542,542,542,

    řádek 36: Tohle se dělalo v BASICu, tady to není dobrý nápad. Osobně bych dal přednost tomuhle způsobu: int j=2, r[]={542,12,58};

    řádek 41: Když už máš funkci main() nadeklarovanou jako int, tak musíš také nějaký int vracet, takže tam připiš return 0;.
    A protože main() nepřebírá žádné vstupní hodnoty, je vhodné to zdůraznit: int main(void), protože když tam nedáš nic, překladač automaticky předpokládá že tam má být nějaký int.

    A na závěr je slušnost poslední řádek souboru ukončit klávesou Enter, ono by tam některým programům mohlo to \n chybět. To poznáš sám až budeš načítat ze souboru...
    30.9.2011 21:05 mr.x
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV

    To kopirovani jsem prepsal na :

    k=r[j];
    r[j]=r[j+1];
    r[j+1]=k;

    U toho noveho zpusobu (nevim jak se tomu rika v cecku, v matice je to myslim mnozina vsech cisel R) je to efektivnejsi, dekuji moc za navrh.

    Ohledne toho enteru, napsal jsem tam  printf("\n"); nebo jste myslel neco jineho? Kazdopadne dekuji za pripominky a jsem Vam velmi vdecny, jsem o neco chytrejsi.

    30.9.2011 21:16 Radovan
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    Měl jsem na mysli poslední řádek zdrojového kódu v tom sestaveni.c, se znakem }, který nebyl odentrovaný. Třeba v Pascalu to je kritická chyba :-D

    To printf("\n"); je v pořádku, jen trochu pomalé, v tomhle případě by úplně stačilo putchar('\n');.

    Ještě jednu radu, já začínám tím že si napíšu
    #include <stdio.h>
    
    int main(void)
        {
    
        return 0;
        }
    
    a pak teprve do téhle kostry začnu psát, nebo spíš doplňovat program ;-)
    30.9.2011 21:23 mr.x
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    Ok, diky moc ;-) i tebe se chci zeptat, jelikoz v tom mas praxi a si dobry, mival jsi podobne problemy jako ja? jen aby me to psychicky rozladilo /povzbudilo
    30.9.2011 21:31 Radovan
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    Já ty problémy mám pořád, takže jsem si prostě našel způsoby jak se jim pokud možno vyhnout, a těch se držím.
    Ale stále říkám že jsem ještě horší programátor než Bill Gates :-D
    30.9.2011 21:39 mr.x
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    :-) dekuji mnohokrat
    30.9.2011 22:41 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    A protože main() nepřebírá žádné vstupní hodnoty, je vhodné to zdůraznit: int main(void), protože když tam nedáš nic, překladač automaticky předpokládá že tam má být nějaký int.

    Vy nějaký takový znáte? Obávám se, že si to spíš pletete s tím, že ve starších dialektech C se při neuvedení návratového typu implicitně předpokládal int.

    3.10.2011 12:47 Sten
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    řádek 41: Když už máš funkci main() nadeklarovanou jako int, tak musíš také nějaký int vracet, takže tam připiš return 0;. A protože main() nepřebírá žádné vstupní hodnoty, je vhodné to zdůraznit: int main(void), protože když tam nedáš nic, překladač automaticky předpokládá že tam má být nějaký int.
    Tohle se dělo u návratových typů. Pokud neuvedete void jako parametr, překladač předpokládá, že o parametrech té funkce nic neví a tedy mohou být jakékoliv. Což je u main, když ty parametry nepoužijete, vlastně pravda.
    martin-ux avatar 30.9.2011 20:30 martin-ux | skóre: 18 | Bratislava
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    fuh .. co bola myslienka toho programu ? je to poriadny des :)

    ked ladis program, skompiluj ho aj s debug symbolmi; t.j. napriklad tvoj serazeni.c skompiluj ako:
    gcc -Wall -g -o atest serazeni.c
    
    kde atest bude tvoj spustitelny program. ten mozes spustit zapomoci gdb debuggeru, napriklad:
    mato@foxi:(~/lair/abc)$ gdb ./atest
    GNU gdb 6.1.1 [FreeBSD]
    
    (gdb) run
    Starting program: /home/mato/lair/abc/atest
    
    Program received signal SIGBUS, Bus error.
    0x0000000000400665 in serazeni (r=0x7fffffffeaf0, i=2) at abc.c:20
    20            if(r[j]>r[j+1]){
    (gdb)
    
    
    a vidis, kde nastal problem (najskor pretecenie pola).
    ..when you do things right, people won't be sure you've done anything at all..
    30.9.2011 20:53 mr.x
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV

    no, smyslem toho programu bylo porovnavat hodnoty a prehazovat je s vedlejsim (levym) prvkem v poli do te doby, dokud to nebude serazene od nejmensiho po nejvetsi... bohuzel jsem se opet zasekl a ten cyklus (upravil jsem to)

    for(g=0;r[g]<r[++g];){
    if(g==i){
    complete=1;
    break;
    }
    }

    udela nekonecnou smycku (zajimave je, ze je vytezovano jen 1 jadro ze 4... a to jadro druhe... :D

    jinak zatim dekuji za ten debugging... a kdyz jsme u te syntaxe a smyslu, jelikoz jsem zacatecnik, tak se jenom zeptam.. na psani uspesnych a funkcnich  programu porebuji praxi (psat a psat) nebo na to existuje nejaka publikace? dekuji Vam.

    martin-ux avatar 30.9.2011 21:13 martin-ux | skóre: 18 | Bratislava
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    programovat sa clovek nauci len programovanim - to je ako so vsetkym inym. samozrejme dobra literatura existuje. dokonca i tu na abclinuxu bola spominana: pavel herout - ucebnice jayzka C. ja som pouzival dve starsie "zelene" vydania z roku 1994; boli vynikajuce.
    tak isto aj od samotnych autorov C vysla kniha: The C programming language. Tieto knihy vysvetlia od zakladov jazyk C a ucia spravnym navykom -- to je podla mna velmi dolezite.

    ak som teda spravne pochopil ten program sa snazi robit bubblesort (bublinkove triedenie)? zotriedenie pola vyriesia 2 jednoduche cykly:

    int a,b,temp;
    for (a =0 ; a < MAX; a++) {
       for (b =0 ; b < MAX-1; b++) { 
          if (pole[b] > pole[b+1]) {  /* swap n+1 with n */
               temp = pole[b]; 
               pole[b] = pole[b+1]; 
               pole[b+1] = temp; 
          }
       } 
    }
    
    
    (kde MAX je zadefinovany ako dlzka pola).

    ..when you do things right, people won't be sure you've done anything at all..
    30.9.2011 21:21 mr.x
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    jo, knihu programovaci jazyk c od K&R mam doma, je to paradni kniha... taky mam doma v elektronicke podobe knihu od pana Herouta... zatim vetsinu prikladu z knihy jsem splnil uspesne, ale zastavil jsem se nad shelovym algoritmem a chtel jsem napsat neco podobneho, ale aby se to tridilo sousedni->sousedni prvek. no jak vidim, tak ten muj plan skoncil fiaskem... :( jak vidim, tak ty si vyborny programator, chci se zeptat, jestli si mival podobne problemy, nebo jen ja jsem blby a nic neumim...
    martin-ux avatar 30.9.2011 21:37 martin-ux | skóre: 18 | Bratislava
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    teraz si ma troska pobavil ;-) ja mam velmi daleko od dobreho programatora; ale i ten sebalepsi programator pise _obcas programy s bugmi.

    kazdy zacinal na zelenej luke, zaciatky su tazke (pre niekoho viac, pre niekoho menej).treba sa naucit rozmyslat v danom jazyku - to chce cas. comu nerozumies mozes preskocit a vratit sa neskor.

    drz sa tych knih co mas, tie su naozaj dobre.

    ..when you do things right, people won't be sure you've done anything at all..
    30.9.2011 21:43 mr.x
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    tych knih se urcite budu drzet, nic jineho snad ani neni :-D, jinak diky za vysvetleni.
    3.10.2011 12:10 MadCatX
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    Zdravím,

    BubbleSort bych sice psal jinak (viz diskuze výše), ale kdybych chtěl adaptovat tvůj algoritmus, upravil bych ho nějak takto:
    #include <stdio.h>
    
    void serazeni(int r[], int i)
    {
      int j, k, g;
      
      for(j = 0;; j++) {
        for(g = 0; r[g] < r[g+1]; g++) {
          if(g == i-1)
    	return;
        }
        if(j == i)
          j = 0; 
        if(r[j] > r[j+1]) {
    	k = r[j];
    	r[j] = r[j+1];
    	r[j+1] = k;
        }
      }
    }
    
    int main()
    {
      int i, size;
      int r[] = {542, 12, 58, 10, 7};
      size = sizeof(r)/sizeof(int);
      serazeni(r, size);
      
      for(i = 0; i < size; i++) {
        printf("%d, ", r[i]);
      }
      printf("\n");
      
      return 0;
    }
    
    Ušetřím si tak jeden cyklus a kód je o dost čitelnější. Tvůj algoritmus se zasekne v nekonečné smyčce kvůli téhle části:
    if(j==i){
          j=0;
        }
    else {
    
    Tedy Pokud jsi prošel celé, pole vrať se na začátek, v jiném případě proveď porovnání. Neporovná se ti první a druhý (či lépe nultý a první) prvek v poli a algoritmus tak nikdy nedoběhne.
    3.10.2011 12:13 MadCatX
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    Korekce: Cyklus samozřejmě neušetřím, ale návratem z funkce serazeni() jakmile je pole setříděné si ušetřím proměnnou "complete" a její testování.
    3.10.2011 18:37 mr.x
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    Dekuji moc, muzu se jeste zeptat, co tam dela ta funkce sizeof(hlavne nechapu tu s hodnotou int), nebylo by lepsi pouzit strlen(r)? Ale i tak diky... (po vysvetleni bych chtel diskuzi uzavrit a podekovat vsem prispevatelum, jsem vam moc dluzny :-) )
    3.10.2011 19:42 MadCatX
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    sizeof() vrací velikost nějakého prvku v paměti v bytech. Např.:
    int pole[10];
    sizeof(pole);
    
    V tomhle případě sizeof() vrátí 40 (na 64 bitové architektuře 80) protože máme pole o 10 prvcích, každý 4 byty (8 bytů) velký.

    int pole[10];
    sizeof(pole)/sizeof(int);
    
    Vrátí počet prvků v poli děleno velikostí jednoho prvku - význam je předpokládám jasný.
    Další možností je i
    int pole[10];
    sizeof(pole)/sizeof(pole[0]);
    
    čili velikost celého pole děleno velikostí prvního prvku v poli.

    strlen() je funkce na zjištění délky řetězce. Očekává pole charů, které postupně čte a jakmile narazí na 0, vrátí počet prvků pole, které přečetla.
    3.10.2011 19:56 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    na 64 bitové architektuře 80

    Jak na které. Třeba u gcc na x86_64 je to 40.

    3.10.2011 20:27 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    Asi drobná záměna s long, kde u LLP64 a LP64 (Windows a Linux) tento rozdíl je.
    ILP64 (int má 64bitů) tak na SPARC64 :-)
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    4.10.2011 20:17 mr.x
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    Ok, zcela chapu, dekuji vsem za diskuzi, muzete lock.
    Tarmaq avatar 3.10.2011 12:55 Tarmaq | skóre: 39
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    Rekl bych ze uz tu byly rozebrany vsechny slabiny tveho programu - tedy bylo by fajn treba oznacit dane prispevky jako reseni, at sem nemusi lezt dalsi lide v domneni, ze jeste neni vyreseno.
    Jinak co jsem tak koukal do tveho kodu, nebylo by taky od veci sjednotit odsazovani napr. na mezery. Mas tam nekolik tabulatoru a muze to zpusobit necitelnost v jinak nakonfigurovanych editorech.
    Don't panic!
    3.10.2011 18:39 mr.x
    Rozbalit Rozbalit vše Re: C-kompilace: ok, spuštění programu: SIGSEGV
    No, mel bych si to nastavit, casem se to urcite vyplati...

    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.