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 12:55 | Nová verze

    Microsoft vydal novou velkou aktualizaci 2404.23 v září 2019 pod licencí SIL Open Font License (OFL) zveřejněné rodiny písma Cascadia Code pro zobrazování textu v emulátorech terminálu a vývojových prostředích.

    Ladislav Hagara | Komentářů: 0
    dnes 05:33 | Nová verze

    OpenTofu, tj. svobodný a otevřený fork Terraformu vzniknuvší jako reakce na přelicencování Terraformu z MPL na BSL (Business Source License) společností HashiCorp, bylo vydáno ve verzi 1.7.0. Přehled novinek v aktualizované dokumentaci. Vypíchnout lze State encryption.

    Ladislav Hagara | Komentářů: 0
    včera 23:55 | Humor

    Spouštět webový prohlížeč jenom kvůli nákupu kávy? Nestačí ssh? Stačí: ssh terminal.shop (𝕏).

    Ladislav Hagara | Komentářů: 5
    včera 18:11 | Nová verze

    Yocto Project byl vydán ve verzi 5.0. Její kódové jméno je Scarthgap. Yocto Project usnadňuje vývoj vestavěných (embedded) linuxových systémů na míru konkrétním zařízením. Cílem projektu je nabídnou vývojářům vše potřebné. Jedná se o projekt Linux Foundation.

    Ladislav Hagara | Komentářů: 0
    včera 17:56 | Nová verze

    Operační systém 9front, fork operačního systému Plan 9, byl vydán v nové verzi "do not install" (pdf). Více o 9front v FQA.

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

    Svobodná webová platforma pro sdílení a přehrávání videí PeerTube (Wikipedie) byla vydána v nové verzi 6.1. Přehled novinek i s náhledy v oficiálním oznámení a na GitHubu. Řešeny jsou také 2 bezpečnostní chyby.

    Ladislav Hagara | Komentářů: 3
    včera 12:33 | Zajímavý software

    Lennart Poettering na Mastodonu představil utilitu run0. Jedná se o alternativu k příkazu sudo založenou na systemd. Bude součástí systemd verze 256.

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

    Hudební přehrávač Amarok byl vydán v nové major verzi 3.0 postavené na Qt5/KDE Frameworks 5. Předchozí verze 2.9.0 vyšla před 6 lety a byla postavená na Qt4. Portace Amaroku na Qt6/KDE Frameworks 6 by měla začít v následujících měsících.

    Ladislav Hagara | Komentářů: 13
    29.4. 21:44 | Komunita

    Ubuntu 24.10 bude Oracular Oriole (věštecká žluva).

    Ladislav Hagara | Komentářů: 14
    29.4. 20:22 | Nová verze

    Byla vydána nová verze 2.45.0 distribuovaného systému správy verzí Git. Přispělo 96 vývojářů, z toho 38 nových. Přehled novinek v příspěvku na blogu GitHubu a v poznámkách k vydání. Vypíchnout lze počáteční podporu repozitářů, ve kterých lze používat SHA-1 i SHA-256.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (75%)
     (8%)
     (2%)
     (16%)
    Celkem 893 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: 1131×
    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.