Tüm dallanmalardan çıkıp main foksiyonuna nasıl dönülür

Başlatan izturk, 15 Aralık 2014, 13:47:18

izturk

Arkadaşlar herkese kolay gelsin.

Programda void main içerisinde bir ana program ve birçok da program parçası var diyelim. Ana program 1.programı çağırıyor. 1. program işini bitirdiğinde ana programa dönmeden 2. programı çağırıyor. böyle peşpeşe 4-5 tane dallanma oluyor program içerisinde.

Sorum 5. programda herhangi bi zamanda işlemi başa döndürmek istediğimde return; kullanıyorum. ama program void main içerisine değil bir üst programa çıkıyor. Ben direk void main içerisine dönsün ve tüm işlem baştan başlasın istiyorum.

Bunu nasıl yapabilrim.

İyi Çalışmalar.

Kabil ATICI

Bu işi asm 'de yapıyor olsaydın,alt program çağrıldığında geri dönüş adresinin yığın (stack) içinde saklandığını ve oradan adresi alıp kullanmanı söyledim, fakat C'de bir işi yapmak için ne kadar dallanma yaptığını kestirmek güç.
ambar7

Salih

Program parçası derken fonksiyonları kast ediyorsun herhalde.
İşin normali fonksiyonlardan sırayla çıkarak main fonksiyona dönmendir.
Diğer türlü problemler oluşur.
Ayrıca iç içe gidilmiş fonksiyonlardan main fonksiyonuna gidilmesi
programlama açısından hata ayıklarken çok zor olur gibime geliyor.

iruraz

Alıntı yapılan: izturk - 15 Aralık 2014, 13:47:18
Sorum 5. programda herhangi bi zamanda işlemi başa döndürmek istediğimde return; kullanıyorum. ama program void main içerisine değil bir üst programa çıkıyor. Ben direk void main içerisine dönsün ve tüm işlem baştan başlasın istiyorum.

Hocam bu her şeyin yeniden başlaması olayı 'reset' atmak değil midir?

izturk

Salih hocam başta söylediğiniz gibi yazmaya başlamıştım ama sonradan işler çığırından çıktı. Bu haldeyken çıkmanın bi yolunu bulmam lazım

mesaj birleştirme:: 15 Aralık 2014, 14:29:30

iruraz hocam aslında reset. Ama reset değil de programların ilk çağrılmaya başladığı yere dönebilsem çok çok iyi olacak. Çünkü başta eepromdan değer okumalar ekran açılıp marka model yazıları falan var. daha sonra while içerisindeki ana programa giriyor. ben bu while a dönmek istiyorum.

Reset yapmak istesek nasıl yaparız?

omereliusuk

Return 1 ve return 0 gibi bir mantik kullanin. 1 ise fonksiyina devam et 0 ise bir ust fonksiyona cik boylece maine kadar gidersin. Buyuk ihtimalle menu vari bir sey yapiyorsun.

Burak B

#6
main() fonskiyonunu tekrar çağırmaya çalışmak yapısal olarak projede büyük sorunlar olduğunun göstergesidir. Yani milyonlarca yazılımcının mutlaka bir bildiği olmalı ki main() fonksiyonunu çağırmayı düşünmüyorlar.

Reset atmak en pratik çözüm görünüyor bu durumda.  Yada basitçe return ile tüm fonksiyonlarından geri çıkacaksın. Buna mani olan ve bunda yanlış olan nedir ? Yani bu yaklaşımda gözünü korkutan nedir ? Herhangi bir zamanda işlemi başlatıp sonlardırmak durumu kontrol mekanizmaları ile alakalıdır. Eğer kontrol mekanizmalarını düzgün tasarladıysan kod tıkır tıkır çalışır. Ana programın while(1) {..} sonsuz döngüsü içerisinde çalışıyor değil mi ?

Kullandığın MCU' nun bir reset komutu vardır yoksa bile bir reset vektörü vardır oraya atlayacaksın. Derleyicinin bunun için sağladığı imkanları bir araştır. Bana göre senin sorununda reset bir çözüm değil.

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

izturk

Hocam dediğim gibi işler çığırından çıktı. ama sona geldim bu saatten sonra tekrar düzenleyemem. return 1 0 mantıklı geldi şimdi deneyeceğim.

ana program while in içinde çalışıyor.

iruraz

@Burak BAYRAK hocamın dediklerine katılıyorum.

Sadece sorunuza karşılık bir fikir üretmek açısından: "goto" kullanılsa nasıl olur? Bir kesme oluşturulup tetiklendiği zaman etiket ismine (label_name) yönlendirilir.

label_name:
while(1)
{
    ..................
}

Kabil ATICI

Gideceğin yere goto ile gitmedi isen geri dönüşte yığından veri alınamadığı için yığın dolacağı için taşar ve hata oluşur.
ambar7

izturk


iruraz

Alıntı Yap
Gideceğin yere goto ile gitmedi isen geri dönüşte yığından veri alınamadığı için yığın dolacağı için taşar ve hata oluşur.

@ambar7 hocam, gideceğin yere normal programın akışıyla gidiyorsun, goto diyelim bir harici kesmeye (bir düğme ile) bağlandı. Düğmeye basıldığında goto işletiliyor ve program etiket adına  gidiyor. Yanlış mı düşünüyorum?

@izturk hocam, CCS C kullanmıyorum ama kullanım hatası yapmış olabilir misiniz? Kabul etmeme sebebi ne?

F493

Selam,
  Buradaki asıl sorun okadar alt program oluşturmak. Sonuçta işlemcinin de bir stack sayısı var. Sanırım 16f877 de 8 olması lazim. Birincisi buna dikkat.

Bir sonraki soru bütün alt.programlardan return ile çıkmak zorundasın ki stack yapısı  geri sayip orayi boşaltsin.

Main in tekrar kendisini çağırması recursive işlemi yapmak demektir ki işlemcinin anasini aglatir. Cunku tum main i saklayip 2. Main i çağıracak ve bir noktada patlar.


Ozetle alt program faydali fakat cokta iç içe fonk. çağırmamak lazim


Esen kalin.

izturk

iruraz hocam goto yu taa başlarda da denemiştim. ama böyle dalanmadan başa dönünce kabul etmiyor. başka yerlerinde kullanıyorum programın. kullanım hatası olduğunu zannetmiyorum.

F493 hocam ben fonksiyonları fonksiyon_adı(); şeklinde çağırıyorum. işini bitirip dönüyor. ama return ile dönmüyorum. bu mecburi bişey mi? cehaletimi mazur görün.

kudretuzuner

Merhaba,
CCS C bilmiyorum.Algoritmayı tasarlarken GOTO yerine (asm CALL) CCS C karşılığı komutu kullanarak 1. alt rutini işletin return ile main'in ikici komutu olan 2.alt rutini işlete gelir.2. alt rutin işlenir, bu böyle istediğiniz kadar yapılabilir.
Amatör