Bu sayfadaki yazılar
Sayfanın metni
Sayfa 26
FRE komutu ile kullanılabilen -1, 0 ve 1 parametreleri, nedense hep aynı değerleri vermekte. Bunun sebebi, herhalde AC-BASIC'in programlanmasındaki bir hatadan kaynaklanmakta. Bu yüzden bu komutu kullanmanın pek anlamı yok. Aynı şekilde CLEAR komutu da çalışmakta. İstediğiniz değeri girin, AC-BASIC bunu CLEAR gibi algılayacaktır. Bu komutun zaten pek faydası yok; çünkü compile edilen programlar sistem rutinlerini kullandıklarından gerektiği kadar hafızayı otomatik olarak ayırırlar.
AC-BASIC'in bir diğer dezavantajı da matris değişkenlerinde ortaya çıkıyor. Bildiğiniz gibi, AmigaBASIC maksimum 255 matris değişkenine izin veriyor. AC-BASIC bu konuda çok daha cimri; izin verdiği matris değişkeni sayısı 7!
Alt-rutinlerde DIM SHARED komutu kullanılamaz; çünkü compiler hazırlanırken, piyasadaki AmigaBASIC de bu komutu alt-rutinlerde kullanamıyordu. Fakat compiler ile birlikte verilen SORTSUBS programı sayesinde bu tür hatalar engellenebilir.
AmigaBASIC matris değişkenlerinin hepsi dinamiktir. Bu, matrisin gerektiğinde ekstra komut kullanımı gerekmeden istenilen boyuta getirebileceği anlamına gelmekte. Fakat compiler bunun yanı sıra bir de statik matrislere izin vermekte. Bunları tanımlamak için matrisi DIM komutu ile yaratırken satırın sonuna STATIC kelimesini eklemek yeter. Bu durumda derleyici compile işlemi sırasında tüm statik matrisleri ve bunlara ait tüm adresgöstergeçleri (addresspointer) yaratarak bunları programa hafıza adresleri olarak girer. Bu sayede compile edilen program, sonuçta bir hayli hızlı çalışacaktır. Fakat bu hızın da bir (hatta daha çok) bedeli vardır:
1. ERASE komutu statik matrislerde kesinlikle kullanılamaz.
2. Statik bir matris değişkeninin boyutları, program akışı sırasında değiştirilemez, sabit kalmalıdır.
3. Matris değişkenlerinde grafik saklanacaksa (grafik için olan GET ve PUT komutlarıyla), bunların boyutunu iyi planlayarak hesabınızı yapmanız gerekmekte. Grafikler çok renkli ise, 3 boyutlu bir matris işinizi görecektir.
4. OPTION BASE komutunu, ilk matris tanımlamasından (gerek statik, gerek dinamik) ve ilk matris kullanımından önce kullanmalısınız.
DEF (DEFDBL, DEFINT, DEFLNG, DEFSNG, DEFSTR ve DEF FN) komutlarını kullanırken de bazı garipliklere rastladım. Bunun sebebi, komutu yanlış yerde kullanmam oldu. Bu komutlar DIM SHARED komutundan önce kullanılmalı. Ayrıca DEFINT'te de nedenini çözemediğim bir hata var. Bu yüzden bu komutu ya kullanmamanızı ya da çok dikkatli olmanızı tavsiye ederim.
Bu kadar hatanın ve dezavantajın üzerine AC-BASIC compiler'ın avantaj ve fazlalıklarına geçebiliriz. Bunlar arasında en yararlı bir tanesi var ki, bunun sayesinde kilometrelerce süren IF ... THEN ... ELSE ... IF ... dizimlerinden kurtulabiliriz. Sadece compiler'da bulunan bu güzel komut paketi, SELECT ... CASE ... END SELECT komut dizimidir. Bunlar sayesinde rahatlıkla iç içe döngüler gerçekleştirebilirsiniz. Aşağıda bu iki yeni komutu kullanan ufak bir program bulunmakta. Bu sayede, komutların kullanımını rahatlıkla öğrenebilirsiniz:
INPUT a,b PRINT "a değişkenini" SELECT CASE a CASE-1,>0 PRINT "ya -1 ya da pozitif bir değerdir." CASE 7 TO 11 PRINT "6'dan büyük ve 12'den küçük bir değerdir."
CASE <b PRINT "b değişkeninin değerinden kü- çük bir değerdir."
CASE ELSE PRINT "şartlarda belirtilenlerden farklı bir değerdir."
END SELECT
CASE komutunda kullanılabilecek şart operatörleri; =, <>, >, <, <=, >= ve == olarak sıralanabilir. CASE ELSE'deki işlem, ancak belirtilen bütün şartlar yerine gelmezse gerçekleştirilir. Bu yeni komutları AmigaBASIC anlayamayacağından programınızı test etmek zorlaşacaktır. Zira CASE komut dizimine eş düşen IF komut dizimi, bir hayli karışıktır.
AC-BASIC'in başka bir iyi yanı ise, alt-rutinlerin rekursif olabilmesidir. Bu, alt-rutinin kendi kendini direkt olarak ya da başka alt-rutinler yardımıyla dolaylı olarak istediği kadar çağırabilmesi anlamına gelmekte. Bu sayede, yapay zeka programları gayet rahat bir şekilde yapılabilir. Fakat AmigaBASIC'te böyle bir şey yapmak bir hayli zordur ve genelde karşınıza bir sürü anlamsız hatalar çıkabilir.
AC-BASIC'in tanıtımı için bu kadar bilgi yeter herhalde. Bu arada bu compiler hakkında daha detaylı bilgi edinmek isteyenlere, gelecek sayılarda açıklanacağını müjdeleyebilirim.
* HI-SOFT BASIC: Kaliteli ve hızlı bir editörle, yine kaliteli ve hızlı bir compiler'ı birleştirirseniz ne olur? Gayet basit, elinizde Hi-Soft Basic olur! Editörü üzerinde olan ve compile işleminin menüler üzerinden yapıldığı bir derleyici, sanırım herkesin hoşuna gider. Kullanıcıya bir sürü yeni komut sağlayan bu compiler hakkında, mümkün olduğunca detaylı bilgi vereceğiz. Gerekli yerlerde AmigaBASIC ile karşılaştırma yaparak anlatacağımdan, bu güzel compiler'ı anlamakta zorlanmayacağınızı umuyorum.
İlk ele alacağımız komut, sistem library'lerindeki alt-rutinlerin kullanımına izin veren LIBRARY komutudur. Bu komut, Hi-Soft'ta iki şekilde kullanılabilir:
LIBRARY "libs/dos.library" DECLARE FUNCTION CreateDir& LIBRARY
... (programın devamı) END İkinci varyasyon: GOSUB IncludeLibs ... (programın devamı) IncludeLibs: LIBRARY "libs/dos.library" DECLARE FUNCTION CreateDir& LIBRARY RETURN
Bu iki yöntem de, normal çalıştırmada hatasız çalışırlar. Fakat compile işleminden sonra, ikinci varyasyonumuz bazen hatalar çıkarabilir. Bu hatalar, genelde görüntüde oluşabilecek bazı bozukluklar şeklindedir. Fakat, Exec ve Dos library'leri kullanıldığında alet kilitlenebilir.
AmigaBASIC'te SUB ile tanımlanan alt-rutinler, programın istenen yerinde olabilir. Fakat compiler'ımız bu alt-rutinleri illa programın sonunda istemekte.
Compiler'ın program yazımında koyduğu bazı kurallar var. Bu kurallar, programlama stili ile alakalıdır ve düzgün stilde yapılmayan programlar devamlı hata verir. Aşağıda iki örnek görebilirsiniz. Bunlardan ilki, normalde AmigaBASIC'te çalışabilir, fakat compiler'da çalıştırılmaya kalktığınızda, güzel bir hata mesajı alabilirsiniz. Aynı programın değişik bir stilde yazılmışı (ikinci program) ise hem AmigaBASIC'te, hem de compiler'da hatasız olarak çalışabilir.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 27
FOR i=l TO 10 IFdeg=l THEN NEXT i ... (programın devamı)
Burada FOR ... NEXT döngüsü sadece 'deg' değişkeninin değeri 1 olduğunda devam eder. Aynı rutinin daha düzenlisi aşağıdaki şekilde olabilir:
FORi=l TO 10 IF deg<>l THEN con NEXT i con:
... (programın devamı)
Burada koşulun tersi alınarak komutların dizilişinin de değiştirildiği gözünüze çarpmıştır. Ama iki programın da işlevi aynıdır.
Fakat daha düzgün şekilde çalışmayı sevenler için Hi-Soft'un yeni komutları arasında REPEAT ... END REPEAT, DO ... UNTIL ve WHILE ... WEND döngü komutları vardır. Bunlarla iki örneğe bakacak olursak:
WHILE sart=l
WEND Veya Do ……… UNTIL sart<>l
AmigaBASIC'te FOR ... NEXT döngüsünde, döngü değişkeninin NEXT'ten sonra tekrar verilmesi gerekmez. Hi-Soft da aynı toleransı göstermekte; fakat iç içe döngüler kurduğunuzda, karşınıza bazen hatalar çıkabilir. Bu yüzden, NEXT'ten sonra döngü değişkenini her zaman vermenizde fayda var. Hem böylece programınızın okunabilirliğini artırırsınız.
Aynı şekilde CALL ... SUB prosedür komutlarında CALL komutu girilmeden de prosedür çağrılabilir, fakat compiler'da bu bazen hata çıkarabilir. Ayrıca prosedür çağrılırken bunu ayrı bir satırda yaparsanız bazı sinir bozucu ufak hatalardan da kurtulabilirsiniz.
Bu compiler'ın kötü yanlarından bir diğeri, değişken ve alt-rutin isimlerinin aynı tabloda toplanmasıdır. Bu, değişken isimlerini alt-rutin ismi olarak kullanamayacağımızı şart koşan bir eksiklik. Buna bulduğum en uygun çözüm; değişken isimlerinin başına VAR, alt-rutin isimlerinin başına da JMP harflerini eklemek oldu. Bu sayede değişkenlerle alt-rutin isimleri gayet güzel ayrılmış oluyor.
Bildiğiniz gibi AmigaBASIC'te komutların yanı sıra bazı özel kelimeler değişken ya da alt-rutin ismi olarak kullanılamaz. Aynı kural HiSoft için de geçerli. HiSoft'ta normal BASIC komutlarına ek olarak kullanılabilecek komutlar da aynı şekilde değişken/alt-rutin ismi olarak kullanılamaz. Ayrıca bir library açtığınızda buna ait tüm alt-rutinlerin isimleri de programınızda değişken/alt-rutin ismi olarak kullanılamaz. Tüm library'lerde kullanılan alt-rutin isimlerini ROM Kernel Manual: Libs & Devices'ta bulabilirsiniz.
Alt-rutinlerle ilgili bir kural daha: Uzun bir program hazırlamaya başladığınızı farz edin. Böyle bir programda genelde bir menü ve bunun aracılığıyla erişilebilen alt-menüler bulunur. Normalde ana menü ekranını hazırladıktan sonra bunun alt-rutinlerini yavaş yavaş ekleyebilirsiniz. Programı AmigaBASIC'te çalıştırdığınızda menü çıkacaktır; fakat daha alt-rutini hazırlanmamış bir fonksiyon seçtiğinizde, program gayet haklı olarak hata mesajı vererek çıkacaktır. Fakat HiSoft'ta böyle bir şey mümkün değil. Ana menüyü hazırladıktan sonra tüm alt-rutinleri yaratmanız gerekmekte. Derleyicimiz compile işlemi sırasında tüm alt-rutinlerin hafızadaki yerlerini hazırlayacağından eksik bir alt-rutin ya da fazla bir alt-rutin ismi hata mesajı ile karşılaşmanıza yol açacaktır. Bunun için en basit çözüm tüm alt-rutinleri hazırlayarak bunları boş bırakmak. Daha sonra zaman buldukça bu alt-rutinleri teker teker yazmaya başlayabilirsiniz. Fakat dikkat edin; eğer alt-rutine GOSUB ile gidiyorsanız alt-rutinin sonuna (bu durumda başına) RETURN eklemeyi unutmayın. Alt-rutini yazacağınız zaman, alt-rutin ismiyle RETURN komutu arasına boş satır açar ve buraya programınızı yazabilirsiniz.
AmigaBASIC'te CLEAR komutu yardımıyla fazladan hafıza kullanabilirken (biliyorsunuz, AmigaBASIC açılışta sadece 25000 byte'lık text saklama bölgesi açmakta), HiSoft'ta bu komut pek işe yaramamakta. Nedeni de basit; çalışma alanının boyutunu menüden preferences yardımıyla ayarlayabilirsiniz. Fakat yine de programınızın kendi hafızasını ayarlamasını istiyorsanız ilk satıra şu komutu girin:
REM SOPTION k80
Bu size 80 KByte'lık bir çalışma alanı açacaktır. k80 yerine istediğiniz KByte değerinin başına <k> harfi koyarak kullanabilirsiniz.
Çalışma alanı hakkında bir diğer dikkat edilecek husus da çalışma alanının büyüklüğünün, programın disketteki uzunluğunun en az 4 katı olması gerektiğidir. Bunun nedeni, compile edilen programın her zaman ilk halinden daha uzun olmasıdır.
Biz biraz cömert davranarak 4 katı kullandık; bu sayede derleyicimiz çok daha rahat çalışabilir.
Bu arada yine çalışma alanıyla ilgili olan ve benim karşıma çıkan bazı ufak sorunları kısaca tanımlamak istiyorum. Bu sorunlardan ilki, bilgisayarın hafızası 1 MByte'da iken ve program uzunluğu 100 KByte'dan uzun olduğunda bazen ortaya çıkıyor. Hafızadaki program gayet iyi bir şekilde hatasız olarak compile ediliyor; fakat çalıştırıldığında, karşıma bir 'INTERNAL ERROR' mesajı çıkıyordu. Bunun sebebi, compiler'ın değişkenler için ayırdığı hafızanın yetmemesinden kaynaklanıyor olması. Ayrıca program uzun olunca, dallanmalarda da belki sorun yaratıyor olabilir. Bunun için bulduğum gayet basit bir yöntem var: programın içindeki tüm gereksiz REM satırları, boşlukları ve satır aralıklarını silmeniz gerekli. Ayrıca mümkünse bilgisayarınızın hafızasını artırın.
Uzun programlarda çıkan başka bir hata, compile işlemi sırasında HiSoft BASIC'in programınıza zaman zaman istenmeyen bir karakter eklemesi. Bu, benim başıma sık geldi ve kısa sürede buna da bir çözüm buldum: saçma karakter eklenen satırı bir aşağı itin ve aradaki boş satırın başına REM yazarak ekran sonuna kadar boşluk verin. Artık yine saçma bir karakter çıktığında bu, REM satırına denk geleceğinden hiçbir sorun yaratmaz. 100-150 KByte arası programlarda bu hata değişik yerlerde bir hayli çıkabiliyor. Bütün hata yerleşen yerlere bir REM satırı probleminizi çözecektir.
Çok ender olarak karşılaştığım diğer bir hata, LOCATE komutunun çalışmamasıydı. Buna da çözüm gayet basit. Aşağıdaki satırları programınıza eklemeniz yeterli:
REM Bu iki satır programın başına ge- lecek: LIBRARY "graphics.library" rastport&=WINDOW(8)
REM Bu satırlar ise en sona eklenmeli: SUB XPRINT(x,y,t$)
CALL Move&(rastport&,x,y) CALL Text&(rastport&,SADD(t$),LEN(t$)) END SUB
Bu satırları programınıza ekledikten sonra aşağıdaki satırda olduğu gibi bu prosedürü çağırırsanız; hem yazılar ekrana normal PRINT komutunda olduğundan daha hızlı gelir, hem de yazıyı grafiksel olarak istediğiniz x, y koordinatlarında basabilirsiniz.
CALLXPRINT 100,50,"Selam!**
Son bir hatadan daha bahsetmek istiyorum. Grafik için kullanılan GET ve PUT komutlarının kullanımına dikkat edin. Ekran dışından bir bölgeyi GET ile alıp, bunu PUT ile tekrar basmaya kalkıştığınızda, bilgisayarınızın ruhu bir an Hindistan'a gidip gelebilir (=Guru Meditation). Bu şekilde bilgisayarı kilitlemek gayet basit; bu sebeple programlarınızı yazarken, mümkün olan tüm hata kontrollerini kullanmanızda fayda var.