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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 17:02 | Pozvánky
Přijďte si popovídat o open source obecně a openSUSE konkrétně s dalšími uživateli a vývojáři. Oslava nového vydání openSUSE Leap se uskuteční 16. prosince od 17:00 v nových prostorách firmy SUSE v Praze. K dispozici bude nějaké občerstvení a DVD pro ty, kdo je sbírají nebo ještě mají mechaniku. Po párty v kanceláři se bude pokračovat v některé z hospod v okolí.
Miška | Komentářů: 0
dnes 14:55 | Zajímavý software

Byla vydána verze Alpha 1.0 otevřeného operačního systému pro chytré hodinky AsteroidOS. Podporovány jsou hodinky LG G Watch, LG G Watch Urbane, Asus ZenWatch 2 a Sony Smartwatch 3. Ukázka ovládání hodinek na YouTube. Jaroslav Řezník přednášel o AsteroidOS na chytrých hodinkách (videozáznam) na letošní konferenci OpenAlt.

Ladislav Hagara | Komentářů: 0
dnes 13:30 | Zajímavý software

Byly uvolněny zdrojové kódy známé rogue-like hry DoomRL. Počátky hry jsou v roce 2002. Je napsána ve FreePascalu a zdrojový kód je nyní k dispozici na GitHubu pod licencí GNU GPL 2.0. Autor pracuje na nové hře Jupiter Hell, která je moderním nástupcem DoomRL a na jejíž vývoj shání peníze prostřednictvím Kickstarteru.

Blaazen | Komentářů: 0
dnes 13:15 | Pozvánky

Přijďte s námi oslavit vydání Fedory 25. Na programu budou přednášky o novinkách, diskuse, neřízený networking atd. Release Party se bude konat 16. prosince v prostorách společnosti Etnetera. Na party budou volně k dispozici také propagační materiály, nová DVD s Fedorou 25 a samozřejmě občerstvení. Přednášky budou probíhat v češtině. Pro více informací se můžete podívat na web MojeFedora.cz. Jen připomínám, že tentokrát jsme zavedli

… více »
frantisekz | Komentářů: 0
včera 16:38 | Komunita

Byly zveřejněny videozáznamy přednášek a workshopů z letošní konference OpenAlt konané 5. a 6. listopadu v Brně. K videozáznamům lze přistupovat ze stránky na SuperLectures nebo přes program konference, detaily o vybrané přednášce nebo workshopu a dále kliknutím na ikonku filmového pásu. Celkově bylo zpracováno 65 hodin z 89 přednášek a workshopů.

Ladislav Hagara | Komentářů: 0
včera 11:30 | Komunita

Bylo oznámeno, že bude proveden bezpečnostní audit zdrojových kódů open source softwaru pro implementaci virtuálních privátních sítí OpenVPN. Audit provede Matthew D. Green (blog), uznávaný kryptolog a profesor na Univerzitě Johnse Hopkinse. Auditována bude verze 2.4 (aktuálně RC 1, stabilní verze je 2.3.14). Audit bude financován společností Private Internet Access [reddit].

Ladislav Hagara | Komentářů: 4
včera 06:00 | Komunita

Na YouTube byl publikován Blender Institute Reel 2016, ani ne dvouminutový sestřih z filmů, které vznikly za posledních 10 let díky Blender Institutu. V institutu aktuálně pracují na novém filmu Agent 327. Dění kolem filmu lze sledovat na Blender Cloudu. Videoukázka Agenta 327 z června letošního roku na YouTube.

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

Minulý týden byly vydány verze 1.2.3 a 1.1.7 webového poštovního klienta Roundcube. V oznámení o vydání bylo zmíněno řešení bezpečnostního problému nalezeného společností RIPS a souvisejícího s voláním funkce mail() v PHP. Tento týden byly zveřejněny podrobnosti. Útočník mohl pomocí speciálně připraveného emailu spustit na serveru libovolný příkaz. Stejně, jak je popsáno v článku Exploit PHP’s mail() to get remote code execution z roku 2014.

Ladislav Hagara | Komentářů: 1
8.12. 16:00 | Nová verze

Byla vydána verze 0.98 svobodného nelineárního video editoru Pitivi. Z novinek lze zmínit například přizpůsobitelné klávesové zkratky. Videoukázka práce s nejnovější verzí Pitivi na YouTube.

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

Stop motion je technika animace, při níž je reálný objekt mezi jednotlivými snímky ručně upravován a posouván o malé úseky, tak aby po spojení vyvolala animace dojem spojitosti. Jaký software lze pro stop motion použít na Linuxu? Článek na OMG! Ubuntu! představuje Heron Animation. Ten bohužel podporuje pouze webové kamery. Podpora digitálních zrcadlovek je začleněna například v programu qStopMotion.

Ladislav Hagara | Komentářů: 5
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 808 hlasů
 Komentářů: 50, poslední 29.11. 15:50
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: 981×
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.