From: Recai Oktas (roktas@omu.edu.tr)
Date: Mon 15 Sep 2003 - 17:50:23 EDT
* Murat ALKAN <oceanrat@linuxmultimedia.org> [2003-09-15 18:02:37+0300]
>
> Merhaba,
>
> Programimda kullanmak icin seek2line( adli bir fonksiyon yazdim..
> Fonksiyonun amaci \n karakterlerini sayarak herhangi bir satiri TEK basina
> gostermek.
> Fonksiyon soyle:
> char * seek2line(char *where,int line){
> int s;
> char *seek2;
> seek2=malloc(500);
> // Tahminen burada segmentation fault.
> sprintf(seek2,where);
> for(s=1;s!=line;s++){
> sprintf(seek2,(strchr(seek2,'\n'))+1);
> }
> return strtok(seek2,"\n");
> }
>
> Yukarida yazdigim gibi sprintf fonksiyonunu kullanirken segfault aliyorum..
> Bir de fonkisyonu su sekilde kullandigimda hata almiyorum:
> buffer=seek2line("Deneme\nSegfault\n3.satir\n",2);
> Ama su sekilde kullandigimda hata...:
> for(count=1;sprintf(parser,seek2line(conf,count));count++){
>
> Nedir problem.. yardimlariniz icin simdiden tesekkurler..
`seek2line' islevine gecirdiginiz degerler buna yol aciyor, misal
`count' varolmayan bir satiri gosteriyor. Sorunun olusumunu takip etmek
icin `gdb' altinda adimlama yapabilirsiniz.
Problemi birkac degisiklikle (range kontrolu, vesaire) cozmek mumkun ;
fakat bence bu islevi veya daha iyisi butun bir tasarimi bastan
kurgulayin, yazdiginiz islevin benzer baska sorunlara yol acacak onemli
kusurlari var.
Bazi tasarimlarda kendisini cagiracak ust islevlerin dikkatli
davranacagi kabuluyle bir islevin kucuk ve basit olarak kodlanmasi
tercih edilebilir. Boyle durumlarda soz konusu isleve bol miktarda
`assert' konulmasi yerinde olur. (`assert' hakkinda `libc'
belgelerinden veya kalburustu herhangi bir C kitabindan bilgi
alabilirsiniz.)
Birkac oneri daha:
- Cok geleneksel bazi durumlar disinda, icice islev cagrilariyla dolu
kod yazmayin, bu tip kodlamalar basa bela aciyor. Or.
sprintf(seek2,(strchr(seek2,'\n'))+1);
yerine:
str = strchr(seek2, '\n')) + 1;
sprintf(seek2, str);
- Stilistik bir oneri: operatorler (`=' gibi) cevresinde ve
virgul/noktali virgulden sonra mutlaka bir bosluk birakin, kod
boylelikle daha rahat takip edilebilir.
-- roktas