Bu kodlar arasındaki fark nedir?

Başlatan Yasin, 02 Nisan 2018, 12:05:18

Yasin

Merhaba arkadaşlar.

IF A=1 THEN GOTO SAY


ile

IF A=1 THEN SAY


kodları arasında fark var mıdır? Birinde GOTO kullanılması, diğerinde kullanılmamasının oluşturacağı fark nedir?

Diğer sorum, bazen yazdığım programlarda GOSUB ile gittiğim etiketlerden, şartlara bağlı olarak RETURN yapmadan GOTO ile başka yerlere gitmem gerebiliyor. Örneğin;

PROGRAM:
   .
   .
   .
   .
   GOSUB KONTROL
GOTO PROGRAM

KONTROL:
   .
   .
   .
   .
   IF A=1 THEN GOTO PROGRAM
RETURN


Bu durum stack taşmasına neden olur mu?

ete

THEN GOTO SAY ile THEN SAY arasında hiç bri fark yok. Yalnızca komut kısaltması var.
Derleme esnasında ikiside aynı şekilde değerlendiriliyor.

Gosub ile gidilmiş bir etiket den başka bir etikete Goto ile gidebilirsiniz. Ama oradan mutlaka yine RETURN ile ilk geldiğiniz yere dönmeniz gerekir. Aksi halde stack taşması kaçınılmaz olur.
Stack mantığını anlarsanız iş daha kolay kavrarsınız.
İşlemci bir GOSUB komutu görünce hemen oraya gitmek ister ama gitmeden önce ayrıldığı adresi STACK denilen ara hafıza ya atar. İŞlemlerini yapıp RETURN komutunu görünce hemen gidip STACK dan geri döneceği adresi alıp oraya geri döner.
Siz GOSUB ile bir yere gittiniz. Oradan  GOTO ile başka bir adrese gittiğinizde Stack aynen bekler. Ama oradan tekrar aynı yere Goto ile gelirseniz bir müddet sonra program Yeniden GOSUB komutunu çalıştıracak demektir. Bu durumda ikinci okunan GOSUB içinde stack'a bir adres atılır ve ilk adres ikinci sıraya geriler sonra atılan ilk sırada bekler. Bu şekilde devam ederseniz stack bir müddet sonra biter çünki hiç Return görmeden sürekli Gosub komutuna maruz kalır program. Taşma da bu durumda meydana geliyor zaten. Doluyor ve taşma olunca program ne yapacağını nereye gideceğini şaşırıp donup kalıyor.

Ete

Yasin

Alıntı yapılan: ete - 02 Nisan 2018, 12:50:37
THEN GOTO SAY ile THEN SAY arasında hiç bri fark yok. Yalnızca komut kısaltması var.
Derleme esnasında ikiside aynı şekilde değerlendiriliyor.

Gosub ile gidilmiş bir etiket den başka bir etikete Goto ile gidebilirsiniz. Ama oradan mutlaka yine RETURN ile ilk geldiğiniz yere dönmeniz gerekir. Aksi halde stack taşması kaçınılmaz olur.
Stack mantığını anlarsanız iş daha kolay kavrarsınız.
İşlemci bir GOSUB komutu görünce hemen oraya gitmek ister ama gitmeden önce ayrıldığı adresi STACK denilen ara hafıza ya atar. İŞlemlerini yapıp RETURN komutunu görünce hemen gidip STACK dan geri döneceği adresi alıp oraya geri döner.
Siz GOSUB ile bir yere gittiniz. Oradan  GOTO ile başka bir adrese gittiğinizde Stack aynen bekler. Ama oradan tekrar aynı yere Goto ile gelirseniz bir müddet sonra program Yeniden GOSUB komutunu çalıştıracak demektir. Bu durumda ikinci okunan GOSUB içinde stack'a bir adres atılır ve ilk adres ikinci sıraya geriler sonra atılan ilk sırada bekler. Bu şekilde devam ederseniz stack bir müddet sonra biter çünki hiç Return görmeden sürekli Gosub komutuna maruz kalır program. Taşma da bu durumda meydana geliyor zaten. Doluyor ve taşma olunca program ne yapacağını nereye gideceğini şaşırıp donup kalıyor.

Ete

Peki hocam stack sıfırlamak için bir komut yok mu?

ete

Stack ulaşılabilir bir hafıza değil maalesef.
Yeninesil işlemcilerde (18F serisi) stack taşınca reset attırma ile ilgilibir seçenek mevcut sadece.
Biraz dikkat edilerek akıllıca bir program yazılabilir. Şayet Gosub ile gidilen yerden Goto ile başka bir yere gidersen giderken sende bir bit değişkenini set edersin. Oradan dönüşte bit set ise RETURN ile dönersin değil ise normal GOTO ile dönersin.

Ete

Yasin

Alıntı yapılan: ete - 02 Nisan 2018, 13:14:43
Stack ulaşılabilir bir hafıza değil maalesef.
Yeninesil işlemcilerde (18F serisi) stack taşınca reset attırma ile ilgilibir seçenek mevcut sadece.
Biraz dikkat edilerek akıllıca bir program yazılabilir. Şayet Gosub ile gidilen yerden Goto ile başka bir yere gidersen giderken sende bir bit değişkenini set edersin. Oradan dönüşte bit set ise RETURN ile dönersin değil ise normal GOTO ile dönersin.

Ete

Anladım hocam. Peki IF THEN döngüsü içinde GOTO ile bir yere gitsek, oradan tekrar GOTO ile IF THEN döngüsü içine gitsek stack taşması olur mu? Şu şekilde mesela:

PROGRAM:
   IF ..... THEN
      .
      .
      .
      GOTO KONTROL
      D1:
         .
         .
         .
   ENDIF
GOTO PROGRAM

KONTROL:
   .
   .
   .
   .
   .
   IF ..... THEN D1
GOTO KONTROL
END

ete

Stack taşması GOSUB komutunu ilgilendiriyor. Goto nun bu konuda bir etkinliği yok. Ancak programı sürekli bir yerlere göndermekte çok akıllıca bir iş değil. Bütün derleyiciler GOTO komutunu pek sevmezler. Program normalde belli bir akış hızında aynı yerde satır takip etmek ister. Onu bir yerlere atlatmakla adamın işine mani olmuş oluyorsun bir yerde. Bu işi en hasarsız yapanda Basic ama yinede dikkatli olmak gerekir.

GOSUB çok sıklıkla program içinde tekrarlanan iler işler için oluşturulmuş bir alt programdır. Amacı aynı satırları tekrar tekrar yazmamak için oraya gönderme yaparsın ama RETURN ile dönersin. Böylece program akışında bir problem doğmaz.
GOTO ise bir işi yaparken tamamen farklı bir işi yapmak üzere başka bir yere gitmek gerektiğinde kullanılır. Bunu çok sıklıkla yapıyorsanız program algoritmanız çok iyi değil demektir.
Bu tür gidişleri genellikle Gosub ile yapmak gerekir. Çok sıkışırsanız işaretçi kullanmak en doğrusudur.
İşaretçi denilen şey bir bit değişkenidir. Set edilmiş ise oraya Gosub ile gelmişsin değilse goto ile gelmişsin farzedip ona göre dönüş imkanı Return yada yine Goto ile yapılmalıdır.

Ete

Yasin

Alıntı yapılan: ete - 04 Nisan 2018, 08:12:24
Stack taşması GOSUB komutunu ilgilendiriyor. Goto nun bu konuda bir etkinliği yok. Ancak programı sürekli bir yerlere göndermekte çok akıllıca bir iş değil. Bütün derleyiciler GOTO komutunu pek sevmezler. Program normalde belli bir akış hızında aynı yerde satır takip etmek ister. Onu bir yerlere atlatmakla adamın işine mani olmuş oluyorsun bir yerde. Bu işi en hasarsız yapanda Basic ama yinede dikkatli olmak gerekir.

GOSUB çok sıklıkla program içinde tekrarlanan iler işler için oluşturulmuş bir alt programdır. Amacı aynı satırları tekrar tekrar yazmamak için oraya gönderme yaparsın ama RETURN ile dönersin. Böylece program akışında bir problem doğmaz.
GOTO ise bir işi yaparken tamamen farklı bir işi yapmak üzere başka bir yere gitmek gerektiğinde kullanılır. Bunu çok sıklıkla yapıyorsanız program algoritmanız çok iyi değil demektir.
Bu tür gidişleri genellikle Gosub ile yapmak gerekir. Çok sıkışırsanız işaretçi kullanmak en doğrusudur.
İşaretçi denilen şey bir bit değişkenidir. Set edilmiş ise oraya Gosub ile gelmişsin değilse goto ile gelmişsin farzedip ona göre dönüş imkanı Return yada yine Goto ile yapılmalıdır.

Ete

Anladım hocam. Teşekkür ederim.

Powered by EzPortal