Bu sayfadaki yazılar
Sayfanın metni
Sayfa 34
Yukarıdaki örnekte 2 sayısının 0-10 arası üst kuvvetini alan bir fonksiyonun kullanımını görüyorsunuz. 2 sayısının istenilen değerdeki üst kuvveti alındıktan sonra, return komutuyla fonksiyondan bir kodla dönülür. Burada dikkat edilmesi gereken, fonksiyonun istediği parametreleri doğru vermektir. Aksi takdirde istenmeyen bir kodla karşılaşabiliriz.
Örnekte de olduğu gibi fonksiyon içerisinde parametreler bulunabilir. Fonksiyonu çağırırken kullandığımız değişkenlerle, fonksiyon içerisindeki değişkenler arasında adres olarak bir bağ yoktur. Yani bu parametrelerin yalnızca değeri alınarak işleme sokulur, adresler eşitlenmez.
Şimdi de fonksiyonların birbirleri ile iletişiminde kullanılan extern sıfatını öğrenelim.
Extern değişkenler, global değişkenlerdir. Herhangi bir değişkenin başına konularak, o değişkenin global olduğu belirtilir.
int p;
main() {
int k,l; …….
func() {
extern int p; ….. }
Yukarıdaki örnekten de anlaşılacağı gibi, p global bir değişken olarak tanımlanmıştır. Fakat burada farklı bir kullanım mevcuttur. func() fonksiyonunun içerisinde p değişkeni extern olarak belirtilmiştir. Yani burada func() fonksiyonu aynı source listesi içinde olmasa bile, p değişkenini global olarak diğer source programına bağlayacaktır. Aslında buradaki kullanım modüler bir çalışmada daha çok kullanılır. Modüler programlarda önce ana program compile edildikten sonra obje haline yani linke hazır hale getirilir. Daha sonra diğer program parçasıyla link edilirken, birinci program modülünün global değişkenlerini kullanmak isteyen ikinci program modülü, kullanacağı bu global değişkenleri extern olarak tanımlar. Yani artık ikinci program modülü de birinci program modülünün global değişkenlerini kullanabilecektir.
C dilinde fonksiyonlar da external olarak tanımlanmaktadır. Bu nedenle C dili, bir fonksiyon içerisinde yeni bir fonksiyonun tanımlanmasına izin vermez.
C dilinde kullanılan diğer bir değişken tipi de, register (yazmaç) değişkenlerdir. Bu değişkenler, herhangi bir bellek kullanmaz. Yani direkt olarak makinenizin mikroişlemcisinin register'larını kullanır. Bu da programınızın kod kısmının kısalmasını ve hızlanmasını sağlar. Register değişkenler, global olarak kullanılmazlar.
Bir fonksiyon içerisinde birkaç tane değişken register olarak yakalanabilir. Aslında bu mikroişlemcinin kullandığı register sayısına bağlıdır. Register değişkenler int, char ya da pointer olarak tanımlanırlar.
f(c, n) register char c; {
register int i; …
} C dilinde global diziler tanımlanırken, başlangıçta herhangi bir eleman atılabilir (initializing).
int nwhite=0; int nother=0; int ndigit[10]={0,0,0,0,0,0,0,0,0,0 }; main() { … }
Buradaki örnekte ndigit[] dizisi tanımlanırken bütün elemanları otomatik olarak sıfırlanmaktadır. Dikkatinizi çektiyse bunu yaparken süslü parantezler kullandık. Çünkü burada bir sıfırlama fonksiyonu mevcut.
Şimdi son olarak C dilindeki önişlem komutlarını görelim. Bunların başlıcaları #include ve #define komutlarıdır. Bu komutlar aslında programımızı daha çok compiler'a hazırlar. #include "isim" Bu komut "isim" adındaki C listesine (source) geçmemizi gösterir. Compiler programı ilk olarak bu source listesini compile etmeye başlar. Bu kısımda daha çok tanımlamalar ve fonksiyonlar mevcuttur. #define YES 1
#define komutu, C dilinde sabit değişkenleri tanımlamada kullanılır. Buradaki YES sabit değişkeni, program içerisinde herhangi bir fonksiyonda kullanılabilir. Fakat burada değişkenin sabit olduğunu unutmamak gerekir.
#define komutu ile sabit değişkenlere farklı tanımlamalar da yapabiliriz; #define then #define begin { #define end };
if(i>0) then begin a=1; b=2; end ya da,
#define square(x) x*x şeklinde kullanılabilir. Burada square(5) yazdığımızda, 5 sayısı işleme sokulur. Yani x*x, 5*5 gibi değerlendirilir. #define komutu ile buna benzer birçok fonksiyon da tanımlanabilir.
Daha önce yaptığımız print alt programını şimdi #define komutundan yararlanarak yapalım, _______ ___
#define printi(x) printf("%c\n",x); #define printfl(x) printf("%f\n",x); #define printc(x) printf("%c\n",x);
mainO {
int i; float f; char c;
printi(i); printfl(f); printc(c); }
Örnekten de anlaşılacağı gibi, #define ile tüm print fonksiyonlarını belirtebiliriz.
Bu ayki konularımız biraz önemli. Çünkü fonksiyonlar, C dilinin temelini oluşturmaktadır. Fakat bu konuları da atlattıktan sonra, artık siz de daha rahat C diline hakim olabilirsiniz.
Şimdilik bu kadar. Gelecek ay Dizi ve İşaret (array, pointer) değişkenlerini öğreneceğiz. Hoşçakalın.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 35
Merhaba... Geçen ay, son olarak LINE INPUT# BASIC komutu ile dersimizi tamamlamıştık. Bu ay LIST komutundan başlayarak tanıtımlarımızı sürdürüyoruz.
LIST KOMUTU:
Kullanım Şekli: LIST [satır] LIST [başlangıç satırı] [-] [bitiş satırı] [,dosya adı]
Bu komut, bellekteki programı AmigaBasic'in liste penceresinde ya da dosya adı ile belirtilen bir sürücüye listeler. Herhangi bir parametre belirtilmeden baştan sona tüm programın listesi alınabileceği gibi; satır etiketi ya da numarası verilerek belli bir satırın ya da başlangıç ve bitiş satırlarının numara veya etiketleri ile bir satır grubunun listesi de alınabilir.
satır, numara ya da alfanümerik bir etiket olabilir.
LIST komutu ile üretilen liste, normalde Liste penceresinde görüntülenir. Ancak komuta ".dosya adı" parametresi eklenmişse, program listesi bir dosyaya veya sürücüye gönderilecektir.
Aşağıda LIST komutunun kullanım şekillerine ait örnekler göreceksiniz:
LIST Tüm programı listeler. LIST 50 50 numaralı satırı listeler. LIST Başla-Renkseç Başla etiketinden
Renkseç etiketine kadar olan kısmı listeler. LIST Başla- Başla etiketinden programın sonuna kadar olan tüm satırları listeler. LIST -Renkseç Programın başından Renkseç etiketine kadar olan tüm satırları listeler. LIST,"SCRN:" Liste Basic penceresinde görüntülenir. LIST,"PRT:" Liste printer'a gönderilir.
AMIGA
LIST,"DF0:Test" Program listesi, diskete ASCII formatta gönderilir.
LLIST KOMUTU:
Kullanım Şekli: LLIST [başlangıç satırı] [-] [bitiş satırı]
Bu komut, LIST komutu ile aynı işleve sahiptir; ancak bellekteki program listesini Amiga'ya bağlı bir printer'a gönderir. LIST komutu ile aynı şekilde kullanılır.
LOAD KOMUTU:
Kullanım Şekli: LOAD [dosya adı],R
Disketten, diskten ya da RAM'den bir dosyayı belleğe yükler.
dosya adı, daha önceden kaydedilmiş (Save) bir dosyanın adı olmalıdır. Komutta, dosya adı parametresi kullanılmazsa, yüklenecek dosya adını girmenizi isteyen bir pencere görüntülenecektir.
Dosya adından sonra ",R" parametresi belirtilmişse, program yüklenir yüklenmez otomatik olarak çalıştırılacaktır.
LOAD komutu çalıştırıldığında, bellekte açık olan tüm dosyalar kapatılır; program satırları ve değişkenler temizlenir. Ancak komutta R opsiyonu kullanılırsa, program yüklendikten hemen sonra çalıştırılacağından, açık olan data dosyaları açık kalır. Bu nedenle komutun bu şekli birden fazla program ya da aynı programın bölümleri arasında değişiklik yaparken kullanılabilir. Programların birbirinin data dosyalarını kullanması sağlanarak, aralarında bilgi geçişi sağlanacaktır.
Örnekler: LOAD" Adresler" LOAD"dh0:Adresler" LOAD"DF1 :DATA/Adresler" LOAD"Prog/Adresler"
LOC KOMUTU:
Kullanım Şekli: değer=LOC(dosya-no)
LOC fonksiyonu, rasgele erişimli dosyalarda yazma ya da okuma için son kullanılan kayıt numarasını verir.
Aynı fonksiyon sırasal dosyalarda kullanıldığında, biraz farklı bir sonuç alınır. Burada sırasal dosyaya yazılan ya da buradan okunan byte'ların sayısı bulunur. Bu sayı, byte sayısının sırasal dosyalar için tanımlı kayıt uzunluğuna (128 byte) ya da OPEN yönergesinde dosya için belirtilen kayıt uzunluğuna bölünmesi ile bulunur. Matematiksel formül şu şekildedir:
BASIC
LOC değeri=Okunan veya Yazılan Byte'ların sayısı/OPEN yönergesindeki Kayıt Genişliği
KYBD: ya da COM1: cihazlarına açılan dosyalar için LOC, dosyadan okunan bir karakter varsa 1, aksi takdirde 0 değerini alır.
LOCATE KOMUTU:
Kullanım Şekli: LOCATE [satır], [sütun]
Çıkış kursorunu ekranın belirli bir pozisyonuna yerleştirir, satır ve sütun değerleri, pozitif değerler olmalıdır; zira (1,1) pozisyonu, ekranın sol üst köşesinin satır ve sütun değeridir. 60 karakter modunda kullanılabilecek en büyük satır numarası 21, sütun numarası 62 iken 80 karakter modunda bu değerler 23 ve 77'dir.
LOCATE sütun ve satır pozisyonlarının tespitinde, çıktı penceresi fontunun 0 karakterinin genişliğini kullanır.
CLS LOCATE 10,1 PRINT "Adınızı Girin: "
Örneğinde, önce ekran temizleniyor; sonra da 10. satırın 1. sütunundan itibaren "Adınızı Girin" mesajı yazılıyor.
LOCATE 5.20:PRINT "MERHABA"
Örneğinde ise 5. satır, 20. sütuna "MERHABA" yazılıyor.
LOF KOMUTU:
Kullanım Şekli: LOF(dosya-no)
Bu fonksiyon dosya-no ile belirtilen dosyanın byte olarak uzunluğunu bulur.
LOF fonksiyonu SCRN:, KYBD: ve LPT1: cihazları için genellikle 0 değerini alır.
Diyelim ki bir grafik objeyi okumak istiyorsunuz. Komut:
INPUT(LOF(1).l)
şeklindedir: 1 numaralı dosyadan tüm karakterler okunur ve bir dizi içinde paketlenir. Tek tek karakterleri okumak isterseniz, bir döngü kurarsınız:
FORx=1 TO LOF(l)
LOG KOMUTU:
Kullanım Şekli: değer = LOG(değer)