  Ŀ
  Ŀ
                                                                          
                      "Trkiye in alyoruz"                          
                                                                          
  ٳ
   Recep Tezkol 
  



> Merhaba Dostlar,

  Benim tiyatrocu, yazar, amatr radyocu, bilgisayar programcs olarak
  tandm (bunlarn dnda daha bir ok konudada uralar olduuna da
  eminim) deerli bir insanmz, u anda aramzda olmayan ama her zaman
  hatralarmzda yaayan ALTAN ERBULAK aebeyimizi saygyla anyorum.
  Yllar nce TRT'de bilgisayar konulu bir program yapmt. (Ak retimin
  bilgisayar dersleri hari) daha sonra televizyonda bu trden programlara pek
  rastlanmad. Televizyonun iyi kullanldnda eitim iin gzel bir ara
  olduu herkesin malumu. Ne yazk ki rating kayglar yznden kdm
  kdmlar, bandra bandralar izlemek zorunda braklyoruz.

  imdilerde Kanal D'de yaymlanan bir program var, ad BLGSARAY. Magazin
  arlkl bir program olsa da zevkle izliyorum. Getiimiz hafta minik
  CANSU'yu konuk etti. Aman efendim o ne yumurcak, bilgisayara ilgi
  duyan, duymayan televizyonun karsnda soluksuz izledik, hatta gururlandk.
  Sevgili Ziya Bahtiyar geenlerde, CANSU'nun 4-5 yanda, iyi bir bilgisayar
  kullancs ve CANSU virsn ilk bulan kii olduunu sylediinde hayretler
  ierisinde kalmtm. yle ki CANSU virs, PC WORLD'n ubat 1992 saysnda
  sevimli CANSU'nun babas tarafndan rapor edilmiti. Buna gre CANSU, virs
  bulduunda 2 yanda olmalyd. Programda CANSU'yu izledikten sonra artk
  tm kukularm silindi...

  Kk CANSU'ya salkl, mutlu bir yaam ve BLGSARAY' hazrlayanlara
  baarlar diliyorum.


                                

> Geen ay, mmkn olduu srece karlatmz en az bir probleme ve
  zmne yer vereceimizden bahsetmitik. Bu ayki konumuz C'de (...). Evet
  bir yanllk yok konumuz nokta nokta nokta.

  Bir sre nce C renme sevdasna dtm. Aldrma geici bir heves falan
  derken, bu sefer C++ ile resmen kara sevdaya tutuldum. Hereyi bir kenara
  brakp bu dil ile bouurken karma u mehur ...  ls kt.


             C dilinde;

             void ornek(int deg,...)
             {
             }


  eklinde bir fonksiyon, bu haliyle hi bir ie yaramasa da sorunsuz
  derlenebiliyor.

  Buradaki  nokta(...) bu fonksiyona aktarlacak parametre saysnn
  deiken olduunu bildirir ki; printf, scanf gibi standart fonksiyonlar bu
  ekilde dzenlenmilerdir. Buraya kadar bir sorun yok ama, says deien bu
  parametrelere eriim tam bir muamma. in garibi kime sorduysam (Elimdeki C
  kitaplar dahil. Burada sevgili Memik'e hak vermemek elde deil.) cevap hep
  '?' oluyordu.

  Bir gn header dosyalar arasnda bulunan STDARG.H dikkatimi ekti. Biraz
  incelediimde tm problemler kendiliinden zlverdi. Bunun iin
  hazrlanm makrolar grnce iin ne kadar kolay olduunu anladm.
  isterseniz hemen buna bir rnek verelim.


Ŀ
#include <stdarg.h>   /* va_list, va_start, va_arg, va_end */               
                                                                            
void ornek(int adet,...)                                                    
{                                                                           
va_list nrd;                                                                
int i;                                                                      
                                                                            
     va_start(nrd,adet);                                                    
     for(i=0;i<a1;i++) printf("%d.parametre : %d\n",i+1,va_arg(nrd,int*));  
     va_end(nrd);                                                           
}                                                                           
                                                                            
void main()                                                                 
{                                                                           
     ornek(3,1,2,3);                                                        
     ornek(5,5,4,3,2,1);                                                    
}                                                                           
                                                                            


  Programn kts:

            1.parametre : 1
            2.parametre : 2
            3.parametre : 3
            1.parametre : 5
            2.parametre : 4
            3.parametre : 3
            4.parametre : 2
            5.parametre : 1


  Yukardaki programda ornek(int adet,...) fonksiyonu adet ile miktar
  bildirilen integer trnden saylar ekrana basar.

  Fonksiyonda,  va_list  nrd;  tanm fonksiyona aktarlan parametrelere
  eriim iin bir gsterge salar. Daha sonra va_start(nrd,adet);   adet ile
  belirtilen parametreden sonra gelen (isimlendirilmemi) parametrenin
  adresini gstergeye atar.

  va_arg makrosu, tipi belirtilen deeri dndrr ve gstergeyi bu tipe uygun
  olarak arttrarak, bir sonraki parametrenin almna hazrlar. Burada geri
  dndrlecek deerin tipini derleyici belirleyemeyecei iin bu programcya
  braklmtr. rnein printf fonksiyonunda format string'i alnacak
  parametrelerin tipi veya tipleri belirlemede kullanlmaktadr. Son olarak
  va_end ile derleyiciye parametre almnn bittiini bildiriyoruz.


                              

> C dilini renme abalarm srerken, yazlm C programlarn inceleyerek
  bir ok ey rendiimi syleyebilirim. Bu incelemelerim srasnda dikkatimi
  string deiken tanmlamalarnda yaplan hata (geri buna pek hata denemez
  ama ihml olarak adlandrlabilir) ekti. Bir ksm programclar fonksiyon
  iinde;

              void main()
              {
              char ornek[12]="recep tezkol";
              ....
              }

  eklinde tanmlamalar yapyorlar. Uygulamada bu bir sorun yaratmaz ama gerek
  bellek, gerek zaman israfna neden olaca kesindir.

  C derleyicisi local tanmlanan bu string'e ilk deer verilmesi durumunda
  verilen ilk deeri bir baka bellek alannda static olarak yaratr.
  Fonksiyon ierisindede local olarak bir bellek ayrr(bu stack'ta olacaktr)
  ve bu bellek alanna ilk deer bir fonksiyon ile kopyalanr. Bunun yerine
  bir static tanmlamas yaplarak bunun nne geilebilir. yle;


              void main()
              {
              static ornek[12]="recep tezkol";
              ....
              }


  Burada ornek static olarak oluturulan ilk tanmlamada kullanlan stringin
  adresi aktarlacak ve kopyalama ilemine gerek kalmayacaktr.


                                 

  Bu ay da bu kadar. Bu yazy okuduunuzda belki de 1995 ylna girmi
  olacaz. Yeni yln herkese mutluluklar, baarlar getirmesi dileiyle...


                 Gelecek ay grmek zere hoakaln
                 