Tema: Re: Segmentation fault (html)
Autorius: Vilius Jakas
Data: 2010-11-25 20:58:09
2010.11.25 17:20, Jornada Del Muerto rašė:
> "Vilius Jakas" <vilius@anet.lt <mailto:vilius@anet.lt>> wrote in message
> news:icltku$o8r$1@trimpas.omnitel.net...
> /> On 11/25/2010 04:55 PM, Jornada Del Muerto wrote:
>  >> O cia kokia C ? gal dosine kokia ir islendi per segmento dydi ar
> kazkas tokio...
>  >>
>  >>
>  >> "Vilius Jakas"<//vilius@anet.lt/ <mailto:vilius@anet.lt>/> wrote in
> message //news:iclt82$nju$1@trimpas.omnitel.net//...
>  >>> Sveiki. Band=iau spresti IT olimpiados uzdavinius ir su tam tikrais
>  >>> testais gaunu arba blogą atsakymą arba segmentation fault
>  >>>
>  >>> Štai kodas
>  >>>
>  >>> #include<stdio.h>
>  >>>
>  >>> int main(){
>  >>>
>  >>> int Pi[100],Ti[100], N, S,i,sum=0,max=0;
>  >>> FILE *in, *out;
>  >>> in=fopen("keliautojas-vyr.in","r");
>  >>> out=fopen("keliautojas-vyr.out","w");
>  >>>
>  >>>
>  >>> //Nuskaitymas
>  >>> fscanf(in,"%d %d",&N,&S);
>  >>> for(i=0;i<N;i++)
>  >>> fscanf(in,"%d %d",&Pi[i],&Ti[i]);
>  >>> for(i=0;i<N;i++)
>  >>> printf("%d %d\n",Pi[i],Ti[i]);
>  >>> //zaidziam
>  >>> S=S-1; //nes masyve skaiciai pradedami nuliu
>  >>>
>  >>> for(i=0;i<N;i++){
>  >>> sum=sum+(Pi[S]); //prideda pinigus
>  >>> if(sum>max)max=sum;
>  >>> Pi[S]=0; //panaikina laukelio reiksme
>  >>> S=Ti[S]; //sekantis laukelis
>  >>> }
>  >>>
>  >>> //fprintf(out,"%d\n",sum);
>  >>>
>  >>> printf("suma %d \n",sum);
>  >>> //for(i=0;i<N;i++)
>  >>> // printf("%d %d\n",Pi[i],Ti[i]);
>  >>>
>  >>> getchar();
>  >>> getchar();
>  >>> return 0;
>  >>> }
>  >>>
>  >>> O štai čia keliautojas-vyr.in su kuriuo gaunu seg fault
>  >>>
>  >>> 5 3
>  >>> 2 5
>  >>> 1 1
>  >>> -7 5
>  >>> -4 2
>  >>> 2 4
>  >>>
>  > Taip, dosinė(iš terminalo leidžiu) Supratau klaidą
>  > >> for(i=0;i<N;i++){
>  > >> sum=sum+(Pi[S]); //prideda pinigus
>  > >> if(sum>max)max=sum;
>  > >> Pi[S]=0; //panaikina laukelio reiksme
>  > >> S=Ti[S]; //sekantis laukelis
>  > o turėtu būti
>  > >> for(i=0;i<N;i++){
>  > >> sum=sum+(Pi[S-1]); //prideda pinigus
>  > >> if(sum>max)max=sum;
>  > >> Pi[S-1]=0; //panaikina laukelio reiksme
>  > >> S=Ti[S-1]; //sekantis laukelis
>  >
>  > dėl tos pačios masyvo numeravimo savybės/
> Siaip del kodo stiliaus tureciau kelis komentarus:
> *1. Hardcodinimas teksto i koda:*
> in=fopen("keliautojas-vyr.in","r");
> out=fopen("keliautojas-vyr.out","w");
> Geriau yra kurtis konstantas, kurios butu vienoje vietoje, o dar geriau
> 1 faile, o ne rasyti hardcodintas reiksmes i koda:
> sukuri koki: defauts.c
> ir surasai:
> /**
> * Failai
> */
> #define MY_IN_FILE "keliautojas-vyr.in" // Ieinantis failas
> #define MY_OUT_FILE "keliautojas-vyr.out" // Iseinantis failas
> /**
> * Kazkas kita
> */
> #define MY_KAZKOKI_KITI_NUSTATYMAI 10
> Ir taip viska graziai su komentarais, tada ka turesi tai kad kode
> nereikes ieskoti kur ka pakeisti panorejus nes viska turesi 1 vietoje ir
> siaip programuojant blasko demesi kazkoks pasalinis tekstas kuris ner
> programos dalis o duomenys.
> *2. Rasineti salygas ir ciklus be lauztiniu skliaustu gal ir kruta, bet
> daro prasciau skaitoma koda*, pvz.:
>  >>> //Nuskaitymas
>  >>> fscanf(in,"%d %d",&N,&S);
>  >>> for(i=0;i<N;i++)
>  >>> fscanf(in,"%d %d",&Pi[i],&Ti[i]);
>  >>> for(i=0;i<N;i++)
>  >>> printf("%d %d\n",Pi[i],Ti[i]);
>  >>> //zaidziam
>  >>> S=S-1; //nes masyve skaiciai pradedami nuliu
> Cia jau tenka siek tiek laiko pamastyt kas parasyta, 1 dalykas viena
> funkcija sulipdyta su kita, ta prasme tik 1 komentaras, kas bus aisku ka
> tai daro pirma menesi bet ne po metu laiko, 2 norint plesti
> funkcionaluma vistiek teks dadelioti skliaustus, tai daug graziau ir
> suprantamiau atrodytu taip:
> // Darbas su nuskaitomu failu
> // Skaitoma informacija
> fscanf(in,"%d %d",&N,&S);
> // Atliekamas toks anoks ciklas
> for(i=0;i<N;i++) {
> fscanf(in,"%d %d",&Pi[i],&Ti[i]);
> }
> // Atliekamas ciklas b - daro ta ana
> for(i=0;i<N;i++) {
> printf("%d %d\n",Pi[i],Ti[i]);
> }
>
> // zaidziam
> S=S-1; //nes masyve skaiciai pradedami nuliu
> Nes kai viska sumala zmones i kuva poto ir kyla klausimai kodel kazkas
> neveikia, nes paciam baisu ziureti i savo kurini ir sunku jame ka nors
> suprasti, gal cia ir kodas olimpiadai bet kaip iprasi rasyti taip rasysi
> visada, del to geriau pradzioj pakenteti pasistengti o su laiku taip
> iprasi ir negalesi kitaip, tada kolegos uz nugaros taves nekeiks kad
> nenori tavo kodo taisinet nes jame velnias galva nusisuktu ;)
> JDM.
Buvo dvi klaidos.
Pirmoji: dėl masyvo numeracijos nuo nulio, o ne nuo vieneto. Žioplas
Antorji: Išvesdavau suma po paskutinio ciklo karto, o ne maksimalia 
pinigu suma (max). Dvigubai žioplas.

Dėl kintamųjų. Naudojau tokius, kokie buvo pateikti užduoties pavizdyje, 
kad susigaudyti kitiems būtų lengviau.

Ačiū už pastabas, paredagavau kodą, taigi prašau įvertinkite ar yra kiek 
nors porgreso sintaksėje.
http://pastebin.com/E6Mq6e1s

Beje, štai čia užduotys 
http://www.olimpiados.lt/component/option,com_docman/task,doc_download/gid,1525/Itemid,254/ 
  keliautojas-vyr.pdf