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 08:22 | Nová verze

Byla vydána první beta verze Ubuntu 17.04 s kódovým názvem Zesty Zapus. Ke stažení jsou obrazy Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu GNOME, Ubuntu Kylin, Ubuntu Studio a Xubuntu. Dle plánu by Ubuntu 17.04 mělo vyjít 13. dubna 2017.

Ladislav Hagara | Komentářů: 0
včera 17:53 | Bezpečnostní upozornění

Google na svém blogu věnovaném počítačové bezpečnost informuje o nalezení "reálného" způsobu generování kolizí hašovací funkce SHA-1. Podrobnosti a zdrojové kódy budou zveřejněny do 90 dnů. Již dnes lze ale na stránce SHAttered nalézt 2 pdf soubory, jejichž obsah se liší a SHA-1 otisk je stejný (infografika).

Ladislav Hagara | Komentářů: 7
včera 17:51 | Nová verze

Vyšla nová verzia open source software na správu a automatizáciu cloudových datacentier Danube Cloud 2.4. Danube Cloud je riešenie postavené na SmartOS, ZFS, KVM a zónach. Obsahuje vlastnosti ako integrovaný monitoring, DNS manažment, zálohy, a samozrejme rozsiahlu dokumentáciu.

dano | Komentářů: 1
včera 17:46 | Pozvánky

V Plzni se 3. až 5. března 2017 uskuteční AIMTEChackathon. Je to akce pro vývojáře, grafiky, webdesignéry i veřejnost. Akci provází zajímavé přednášky IT odborníků. Více o programu a možnosti přihlášení na stránkách akce.

cuba | Komentářů: 0
včera 01:00 | Nová verze

Známý šifrovaný komunikátor Signal od verze 3.30.0 již nevyžaduje Google Play Services. Autoři tak po letech vyslyšeli volání komunity, která dala vzniknout Google-free forku LibreSignal (dnes již neudržovaný). Oficiální binárky jsou stále distribuované pouze přes Google Play, ale lze použít neoficiální F-Droid repozitář fdroid.eutopia.cz s nezávislými buildy Signalu nebo oficiální binárku stáhnout z Google Play i bez Google účtu

… více »
xm | Komentářů: 5
22.2. 23:14 | Nová verze

Po třech týdnech od vydání první RC verze byla vydána první stabilní verze 17.01.0 linuxové distribuce pro routery a vestavěné systémy LEDE (Linux Embedded Development Environment), forku linuxové distribuce OpenWrt. Přehled novinek v poznámkách k vydání. Dotazy v diskusním fóru.

Ladislav Hagara | Komentářů: 6
22.2. 17:28 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2017-6074 v Linuxu zneužitelné k lokální eskalaci práv. Jde o chybu v podpoře DCCP (Datagram Congestion Control Protocol). Do linuxového jádra se dostala v říjnu 2005. V upstreamu byla opravena 17. února (commit). Bezpečnostní chyba byla nalezena pomocí nástroje syzkaller [Hacker News].

Ladislav Hagara | Komentářů: 13
22.2. 15:00 | Zajímavý software

Společnost Valve vydala novou beta verzi SteamVR. Z novinek lze zdůraznit oficiální podporu Linuxu. Další informace o podpoře této platformy pro vývoj virtuální reality v Linuxu v diskusním fóru. Hlášení chyb na GitHubu.

Ladislav Hagara | Komentářů: 0
22.2. 06:00 | Nová verze

Po necelém roce od vydání verze 0.67 byla vydána verze 0.68 populárního telnet a ssh klienta PuTTY. Podrobnosti v přehledu změn. Řešeny jsou také bezpečnostní chyby.

Ladislav Hagara | Komentářů: 0
21.2. 21:32 | Nasazení Linuxu

Canonical představuje nejnovější verzi chytré helmy DAQRI s Ubuntu pro rozšířenou realitu. K vidění bude příští týden v Barceloně na veletrhu Mobile World Congress 2017.

Ladislav Hagara | Komentářů: 0
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (13%)
 (2%)
 (72%)
 (3%)
 (10%)
Celkem 693 hlasů
 Komentářů: 66, poslední 22.2. 18:57
    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: 989×
    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.