Hata olursa program akışını değiştirmek

Başlatan z, 20 Ocak 2014, 12:41:54

z

1, Hata ile dönmek, 0 ise hatasız dönmek anlamına gelsin.

    err=fnk1();
    ......
    ......
    if(!err) err=fnk2();
    ......
    ......
    if(!err) err=fnk3();
    ......
    ......
    if(!err) err=fnk4();

B satırı

    if(err) 
       {
          ......
       }
    else
       {
          ......
       }   


B satırına gelindiğinde hata olup olmadığını err değişkenine bakıp anlayabiliriz.

Bu yazım şekline alternatif yazım şekilleriniz nelerdir? (Rahatsızlık duymuyorsanız Goto da kullanabilirsiniz)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Analyzer

Selam,

IDE'niz destekliyorsa exception handling yaptırırsınız. Mesela Delphi BCB de kullanımı şöyle :

http://www.delphibasics.co.uk/Article.asp?Name=Exceptions

Analyzer
Üşeniyorum, öyleyse yarın!

z

Ortamı belirtmedim ama ARM işlemcilerde keil kullanıyorum.

Aklıma gelen konu C'de Basicteki On Error Goto yapısının benzerini oluşturmaktı zaten. Bunu tartışmanın en sonuna saklıyorum.

Şimdilik C yazım şekillerinizi merak ediyorum. Altermatifleriniz varmı?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

coderun

#include <stdio.h>

int i=0;

	typedef int (*u8v_fonkPointer)(void);
	u8v_fonkPointer  currentState; 

int fonksiyonEksilt(void)
{
	i-=2;
	printf("çarpım fonk. geldim %d\n\n",i);
	currentState = fonksiyonArttirma;
	return 0;
	
}	
	
int fonksiyonCarpim(void)
{
	i*=i;
	printf("çarpım fonk. geldim %d\n\n",i);,
	currentState = fonksiyonEksiltme;
	return 0;
	
}

int fonksiyonArttirma(void)
{
	
	i++;
	printf("bir_artma fonk. geldim %d\n\n",i);
	currentState = fonksiyonCarpim;
	return 0;
}

main ()
{

	currentState = fonksiyonArttirma; //başlangıç olarak fonksiyonArttirma
	
	
/********************************************************
* While ile fonksiyonArttirma fonksiyonu çağrılır.
* fonksiyon hata ile dönmez ise fonksiyonCarpim çağrılır
* fonksiyonCarpim da hata ile dönmez ise fonksiyonEksilt
*çağrılır.
*
*
*eğer bir fonksiyon hata ile dönülürse while altındaki kodlar işlenir.

*********************************************************/	
	while( !currentState() ); 
	

}


burada fonksiyonlara dallanma sırayla değilde koşullara göre de yapılabilinir.ayrıca hatalı dönen fok. hangisi
o da bulunabilinir.

z

Neyse farklı yazım önerisi yok galiba.

Ben şu şekilde bir yapı düşünüyorum.

ErrorAdr=Hata durumunda gidilmek istenen adres tanımı yapıldıktan sonra
herhangi bir fonksiyonun içinde RTN(); fonksiyonu çağrılırsa doğrudan ErrorAdr değişkeninde yazan adrese dallanılacak.
Burada olası stack kirliliği sorununu çözeceğim. Şu anda bu kısma takılmayın.

Nasıl çok pratik olmaz mı?

char fonk1()
{

   if (err) RTN();
   return(...);
}

int fonk2()
{

   if (err) RTN();
   return(...);
}

void main()
{
   ErrorAdr=&Error; yada buna benzer bir kod
   fnk1();
   fnk2();
   ....
   ....

Error:

}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Analyzer

Selam,

İlk mesajınız ile son mesajınız içerisindeki kod olarak çok fazla fark göremedim. Sadece if clause larını fonksiyon
içerisine almışsınız. İlk mesajınızda fnk1 den hatasız dönerse fnk2, hatasız ise fnk3 ü çalıştırmısınız ama ikinci yazımda
fonksiyon sırayla çalışıyor. RTN den dönebilirse fnk2 yi de çalıştırabilir anlamında. Debug edip bakmak lazım tabi ama
stacki sanki eşit oranda meşgul edecek gibi görünüyor her iki kod da. Exception keilda da mevcutmuş bu arada bilmiyorduk.

http://www.keil.com/support/man/docs/armlib/armlib_BABIIGEB.htm

Analyzer
Üşeniyorum, öyleyse yarın!

atomx

Hüseyin TECER

mufitsozen

Alıntı yapılan: z - 20 Ocak 2014, 13:21:28
Ortamı belirtmedim ama ARM işlemcilerde keil kullanıyorum.

Aklıma gelen konu C'de Basicteki On Error Goto yapısının benzerini oluşturmaktı zaten. Bunu tartışmanın en sonuna saklıyorum.

Şimdilik C yazım şekillerinizi merak ediyorum. Altermatifleriniz varmı?

Sayin @z hocam, bu konu defalarca bahsedildi. Cde 'non-local goto' icin setjmp.h icindeki setjmp ve longjmp kullanilir.

http://en.wikipedia.org/wiki/Setjmp

https://www.picproje.org/index.php/topic,43301.msg315559.html#msg315559
https://www.picproje.org/index.php/topic,35908.msg258693.html#msg258693
https://www.picproje.org/index.php/topic,33757.msg236562.html#msg236562

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Elektroemre

#8
Uyduruk bir try-catch;

    // ----------------------------------c try-catch icin macrolar------------------------
    #define ERROR 1  
    #define OK    0 
    #define tryFunc(x)	{ if((x) == ERROR) { Succes = 0; break;} }

    #define try   {Succes = 1;};  do
    #define catch while(0); if(Succes == 0)
    char Success;
    //-----------------------------------------------------------------------------------------

    try
    {
        tryFunc( Func1() );
        tryFunc( Func2() );
        tryFunc( Func3() );
    }
    catch
    {
        printf("HATA!\n");
    }

    //Kaldigi Yerden Devam



try dendiginde basarim flagi 1 yapılıyor ve "do" blogu basliyor.
tryFunc macrosu ile fonksiyonlar sirayla cagriliyor. Eger cagrilan fonksiyon ERROR dönmüş ise başarım flagi 0 yapılıp do bloğu "break" ile kırılıyor.

Tüm fonsiyonlar başarılı dönmüş ise blok while(0)  kısmında bitiyor.(goto kullanmak yerine while(0) ile biten bir do bloğu kullandığımızda derleyici break dediğimiz an zaten otomatik "goto blok sonu" diyor)
Eğer Basarim flagi 0 ise catch bloğu işleniyor.


Uyduruk bir implementasyon oldu ama çalışıyor. Biraz daha macrolar ile uğraşılıp güzel bir mekanizma çıkarılabilir.

muhittin_kaplan

Hocam Aşağıdaki Fonksiyon STD lib in (CM4) I2C kütüphanesinden, Error yada Success döndürüyor.


ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)  {
	    	uint32_t lastevent = 0;
		uint32_t flag1 = 0, flag2 = 0;
		ErrorStatus status = ERROR;      	/* Check the parameters */    
		assert_param(IS_I2C_ALL_PERIPH(I2Cx));
    		assert_param(IS_I2C_EVENT(I2C_EVENT));  /* Read the I2Cx status register */
	
	flag1 = I2Cx->SR1;
    	flag2 = I2Cx->SR2;
    	flag2 = flag2 << 16;      /* Get the last event value from I2C status register */    
	lastevent = (flag1 | flag2) & FLAG_MASK;      /* Check whether the last event contains the I2C_EVENT */    
	

	if ((lastevent & I2C_EVENT) == I2C_EVENT)    {      /* SUCCESS: last event is equal to I2C_EVENT */      
		status = SUCCESS;    }   
	 else    
		{      /* ERROR: last event is different from I2C_EVENT */      
		status = ERROR;    
		}    /* Return status */    return status;
	  } 

Gökhan BEKEN

C'de try-catch yok. Bildiğim kadarıyla setjmp fonksiyonu ile yapılıyor. Mikrodenetleyicilerde işler mi bilmiyorum, bakmak lazım.
örnek: http://stackoverflow.com/questions/1692814/exception-handling-in-c-what-is-the-use-of-setjmp-returning-0
Özel mesaj okumuyorum, lütfen göndermeyin.