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

Byl vydán Docker 1.13. Přehled novinek na YouTube a v poznámkách k vydání na GitHubu. Docker umožňuje běh aplikací v softwarových kontejnerech (Wikipedia).

Ladislav Hagara | Komentářů: 0
dnes 15:51 | Komunita

Mozilla.cz informuje, že nástroje pro webové vývojáře se možná oddělí od Firefoxu a stanou doplňkem. Nástroje pro webové vývojáře prošly velkým přepisem a tým, který se stará o jejich vývoj, by uvítal možnost jejich častějších aktualizacích nezávisle na vydávání nových verzí Firefoxu.

Ladislav Hagara | Komentářů: 0
dnes 07:00 | Humor

Čtenářům AbcLinuxu vše nejlepší k dnešnímu Dni zvýšení povědomí o tučňácích (Penguin Awareness Day).

Ladislav Hagara | Komentářů: 0
dnes 06:00 | Komunita

Bylo spuštěno hlasování o přednáškách a workshopech pro letošní InstallFest, jenž proběhne o víkendu 4. a 5. března v Praze. Současně byla oznámena změna místa. InstallFest se letos vrací zpět na Karlovo náměstí do budovy E.

Ladislav Hagara | Komentářů: 0
dnes 02:48 | Komunita

Greg Kroah-Hartman potvrdil, že Linux 4.9 je jádrem s prodlouženou upstream podporou (LTS, Long Term Support). Podpora je plánována do ledna 2019. Aktuální jádra s prodlouženou podporou jsou tedy 3.2, 3.4, 3.10, 3.12, 3.16, 3.18, 4.1, 4.4 a 4.9.

Ladislav Hagara | Komentářů: 0
dnes 00:11 | Zajímavý článek

Výrobce síťových prvků, společnost Netgear, spustila nový program, který slibuje vývojářům, expertům, ale i běžným uživatelům vyplacení finanční odměny za nalezení bezpečnostních chyby v jejich produktech. Za nalezení zranitelnosti v hardware, API nebo mobilní aplikaci nabízí odměnu od 150 do 15 tisíc dolarů (dle závažnosti).

Michal Makovec | Komentářů: 0
dnes 00:08 | Pozvánky

V sobotu 18. 2. se v Praze v prostorách VŠE uskuteční od 9:30 již 4. ročník největší české konference o open source redakčním systému WordPress (WP) - WordCamp Praha 2017.

… více »
smíťa | Komentářů: 0
včera 23:58 | Komunita

Kryptoměnová komunita zahájila nový rok spuštěním projektu Blockchain.cz, jehož cílem je kolektivně nalézt ideální překlad pro čím dál frekventovanější slovo „blockchain“. Přispět návrhem může kdokoli. Sběr bude trvat až do konce září 2017. Následně bude probíhat dvoutýdenní veřejné hlasování, které bude zakončeno výběrem toho nejlepšího návrhu.

xHire | Komentářů: 8
včera 15:55 | Bezpečnostní upozornění

Společnost Oracle vydala čtvrtletní bezpečnostní aktualizaci svých softwarových produktů (CPU, Critical Patch Update). Opraveno je celkově 270 bezpečnostních chyb. V Oracle Java SE je například opraveno 17 bezpečnostních chyb. Vzdáleně zneužitelných bez autentizace je 16 z nich. V Oracle MySQL je opraveno 27 bezpečnostních chyb. Vzdáleně zneužitelných bez autentizace je 5 z nich.

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

Po půl roce od vydání verze 9.0 (zprávička) byla vydána verze 10.0 zvukového serveru PulseAudio. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 31
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (10%)
 (2%)
 (74%)
 (3%)
 (10%)
Celkem 337 hlasů
 Komentářů: 24, poslední 17.1. 10:14
    Rozcestník
    Reklama

    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: 985×
    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: 71 | 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: 71 | 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.