Bu tarz bir programlama mümkün mü?

Başlatan picmanya, 14 Haziran 2024, 19:19:42

picmanya

Aynı fonksiyon içinde goto - label kullanımından haberim var.
#include <setjmp.h> kütüphanesindeki, LongJmp - SetJmp fonksiyonlarıyla iş göremedim. ( Bu benim beceriksizliğimde olabilir.)
Altdaki koddaki tarzda; Fonksiyonlar arasında sıçrama yapılabiliyor mu? Fonksiyonlar işlemci tanımlı ve kullanıcı tanımlı olabiliyorlar.
Yapmak istediğimi alt da kısaca kod halinde yazmaya çalıştım.  Kodu düzenleyerek göstermeniz mümkünmüdür?

void CN_Interrupt()             // işlemci giriş pin kesmesi interruptu.
{   
   ...kodlar...
   if(şartlar1) Atla_1;
   ...kodlar...            
}

void TIMER1_Interrupt()            // işlemci timer kesmesi interruptu.
{
   ...kodlar...
   if(şartlar2) Atla_2;
   ...kodlar...   
}

void Calis(void)                        // kullanıcı tanımlı yazılan fonksiyon.
{
   ...kodlar...
   if(şartlar3) Atla_3;
   ...kodlar...   
}

int main(void)
{
   ...kodlar...

   while(1)   
   {
      ...kodlar...     
      ...kodlar...
      Atla_1:   
      ...kodlar...     
      ...kodlar...
      Atla_2:
      ...kodlar...     
      ...kodlar...
      Calis();
      ...kodlar...     
      ...kodlar...
      Atla_3:
      ...kodlar...     
      ...kodlar...
   }
}

mustafa_cmbz

İki farklı fonksiyon var ve birinde etiket oluşturmuşsun ve o fonksiyon içinde dönsürürken başka bir fonksiyon çağırıp o fonksiyon içinde diğer fpnksiyondaki etiketleri çağırıyorsun. Bu sıkıntı yaratır diye biliyorum.

Bende lcd için Basic ten kalma alışkanlık Bi fonksiyon çağırıp o fonskiyon içinde etiketlere dallanıyorum fakat yanlış hatırlamıyorsam senin yaptığın gibi yapmaya çalıştığımda olmamıştı.

Bu yüzden programı yazarken ona göre akış belirlemelisin

picmanya

mustafa_cmbz,
3 farklı fonksiyonum + Main() fonksiyonum var.
3 nün içeriği aynı. Etiket oluşturulan hangisi? Etiket ne?


mehmet

İnterrupt ve fonksiyonlar içinde sadece bir/bir kaç değişkenin değerini değiştirin. Ana döngüde de bu değerlere göre diğer fonksiyonlara dallanın.
Durum makinası (state machine) konusunu inceleyiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

picmanya

işlemci ucuz hafıza - kapasite ve hızı düşük.
dediğiniz tarzda-şekilde kod çok uzuyor, sığmıyor. çok karmaşıklaşıyor. her türlü senaryoya göre kod yazmak gerekiyor.
İyi bildiğiniz gibi; goto label ile aynı fonksiyon içinde istenilen yere dallanılabiliyor. olay karmaşıklaşmadan kolayca halledilebiliyor.
Bana herhangibir fonksiyon içinden, Main() fonksiyonu içindeki While() döngüsü içerisinde herhangibir yere atlayabileceğim bir yapı lazım.
#include <setjmp.h> kütüphanesindeki, LongJmp - SetJmp yapıları bu işi sağlamak içinmi verilmiş? İstediğimi yapabilecek yapılar bunlarmı?
state machine ne de bakarım, ama şimdi yoğunlaşmam gereken yer farklı ise, öncelikle ona bakmak isterim.

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

picmanya

Microchip 30F2010 ve 30F2011 modelleri,
ucuz olanları, kullanabildiklerim ve minimum donanımları yeterli gelenler bunlar.
işlemi bunlarla yapmak zorundayım.

C dilinde bu türden bir işi yapabilecek anahtar kelimeler;
#include <setjmp.h> LongJmp - SetJmp mıdır? Araştırmam gereken kısım bunlarmı?
Başkada bir yere çıkan bir cevap bulamadım henüz. Her yerde bunlara atıf yapılmış.

mehmet

Hala "state machine" konusunda ısrarcıyım. Bir yere sıçradığınızda geri döneceğiniz yeri bilmezseniz sıkıntılar çıkar. Mutlaka fonksiyon kullanınız.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

mustafa_cmbz

yukarıda arkadaşların bahsettiği şekilde geri döneceğin yeri belirtmen lasım mantığı var


void main()

{

ok tuşuna basıldı ise fonksiyonu çağır 


} // main son 



fonksiyon()
{

menu1:   // etiket ( basicten kalma alışkanlık... iki nokta ile belirtilen kısımlara etiket der idik ) 

çıkış tuşuna basıldı ise exit menuye git ve fonksiyon geldiği yere gitsin 

ok tuşuna basıldı ise menu2' ye git gibi 

goto menu1


menu2:

goto menu2


exıt_menu:



} // fonksiyon sonu


bende sizinle hem fikirim özellikle lcd lere menu yaparken çok anlaşılır ve pratik oluyor böyle fakat

başka bir fonksiyonda iken başka bir fonksiyon altında tanımladığın etikete dallanır isen orada işler karışıyor...




picmanya

#9
mustafa_cmbz,
aynı fonksiyon içinde bir yere sıçramada kullanılan goto label den bahsediyorsunuz.
bundan haberim var ve kullanıyorum.
peki fonksiyonlar arasında sıçrama nasıl olacak.
sizin kodunuz üzerinden ilerlersek;
Void main() içine bir while() döngüsü ve bununda içerisine bir etiket koyalım ve
fonksiyon() adlı fonksiyonunuz içinden bu etikete sıçramaya çalışalım.
Bu iş nasıl olacak? Bunun yöntemi lazım bana.

Alıntı yapılan: mehmet - 14 Haziran 2024, 23:02:26Hala "state machine" konusunda ısrarcıyım. Bir yere sıçradığınızda geri döneceğiniz yeri bilmezseniz sıkıntılar çıkar.
Mutlaka fonksiyon kullanınız.
Hocam fonksiyon kullanmada sıkıntı yok. kullandığım bir yapıdır. fonksiyonla basitce makul şekilde olabilse fonksiyonla yaparım zaten.
fonksiyonun ilave kodların geçmediği kısımlar olabiliyor. Kısaca basit bir sıçrama yapmak gerekebiliyor.

Bilen varsa bir fonksiyon içinden Main() içindeki while() döngüsü içerisine sıçrama yöntemini birisi anlatabilirse sevinirim.
#include <setjmp.h> kütüphanesindeki, LongJmp - SetJmp bu yapıylamı yapılıyor? Başka yöntem varmı?

picmanya

Birde bu geri dönme meselesi çıktı, buraya çok takılınılıyor, her yerde yazıyor bu geri dönülecek adres meselesi,
herkesde buna takıyor. 99 bin yerde goto; label; de sıkıntı geri dönülecek adresi tutmak bilmek lazım gibi.
Kullanıpda geri dönenide görmedim hiç. Yada bu tarz bir geri dönüş kullanımı varsada, benim onunla hiç işim yok.
Geri dönmeye çalışan yok. Geri dönüş yok. Hep ileri gitmek var. Arkama bile bakmayacağım.

Anlatımı çok basit, sıçra komutuna gelindiğinde, sıçranılacak yere gidilecek.
Ve sıçranılan yerden itibaren aşağıya doğru sırası ile komutlar-kodlar işletilecek.
Ne sıçra komutunun olduğu yerden sonraki blok içindeki kodlar, nede sıçranılan yerden önceki komutlar bir seferliğine işletilmeyecek.
geri dönüş olmayacak yani.

Aynen yukarıda mustafa_cmbz nin bahsettiği ve bilenen düz-klasik goto; ve label: ikilisi gibi olmalı.
Yalnız bunlar aynı blok-fonksiyon ({}) işerteleri içinde çalışır bize bunun gelişmiş modeli lazım. Farklı bloklar içinde çalışma ruhsatına sahip olmalı.

Bayram önü son gün, yokmu sevabına el atacak meseleye. Teşrik Tekbirleri sonrası hayır dua ediveririm.

Epsilon

#11
CCS den anlamam ama basic de program yazarken GOSUB ile gönderilen alt programda (LABEL da) son satırına RETURN yazdığında  geldiği GOSUB satırının hemen altına gelir oradan devam eder.

Muhtemelen aynı konuyu anlatan CCS ile ilgili :Bu forumdaki linki

picmanya

Yok sizde geri dönmeniz gereken yerin 1 satır altına döndünüz. Bir nevi alt programa git gel yaptınız. Geri dönmeye çalıştınız.

C de o işi donanım kesmeleri, yazılım kesmesi ve gerektiğinde kullanılan, kullanıcının yazdığı-oluşturduğu fonksiyonlar yapıyorlar.

Benim dediğimde geri dönüş yok. Aslında sanıyorum herhangibirşeyi çağırmakda yok denebilir galiba.
En azından C de yazılımda ben birşeyi çağırmayacağım, geri planda ben görmeden bir şey çağrılıyorsa bilemem.

Çok basit-sade şekilde, bir kelime ile yönlendirilip, direkt yönlendirilen yere git ve ordan program satırlarını koşturmaya devam et.
Anlatması çok basit. Ama henüz yapamadım.

mehmet

#13
Switch-case ile şartlarınıza göre ana döngünüzü yazın. Gerekli değişkeni de; interrupt, harici girişlerle değiştirirsiniz. Buna göre kodlar istediğiniz şekilde çalışır.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

sadogan

Interrut rutininden veya subritinden return kullanmadan ayrıldığınızda
stack taşması olur.