C programlada Enumeration işlemi

Başlatan z, 28 Nisan 2014, 12:45:17

z

Picusta bir başka başlık altında verdiğim örnek programlarda enumeration işlemi yapmamı önerdi.

Şimdi farkettim de güzel bir noktaya değindi.

Bu başlık altında enumeration işlemi yaparak programlarımızı daha okunaklı ve daha kolay değiştirilebilir yapmayı öğreneceğiz.

Ben anlatmayacağım. Gönüllü bir hoca devam etsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Bu forumda C den anlayan yok galiba. Bunu da mi ben anlatayim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

M_B

#2
@Z  hocam enumeration merak ettim ve nete baktığımda  gördum ki  enum parametresinin   tanımıymış. Ben farklı bir şey sanıyordum ;) enum biliyor ama kullanmıyordum.

enum struct tan pek bir farkı yok.

enum :
Bu tip, değişkenin alabileceği değerlerin belli(sabit) olduğu durumlarda programı daha okunabilir hale getirmek için kullanılır. enum örnekleri Program 13.1 ve Program 13.2 de gösterilmiştir. Genel yazım biçimi:

          enum TipAdı{değer1,değer2,...,değerN}DeğişkenAdı;
TipAdı programcı tarafından verilen tip ismidir. DeğişkenAdı ise program içinde kullanılacak olan değişkenin adıdır. Eğer kullanılmazsa program içinde daha sonra enum ile birlikte kullanılır. Örneğin:

          enum bolumler{programcilik, donanim, muhasebe, motor};
tanımı ile derleyici programcilik için 0, donanim için 1, muhasebe için 2 ve motor için 3 değerini kabul ederek atamaları buna göre yapar. Değişken adı bildirilirse daha sonra enum kullanmaya gerek kalmaz.

          enum renkler{kirmizi,mavi,sari} renk;
          enum gunler{pazartesi,sali,carsamba,persembe,cuma,cumartesi,pazar};
Şimdi istenirse tanımlanan bu tipler program içinde kullanılabilir.

          enum bolumler bolum;
          enum gunler gun;

          bolum = muhasebe /* bolum = 2 anlaminda */
          gun   = cuma;    /* gun = 4 anlaminda   */
          renk  = kirmizi; /* renk = 0 anlaminda  */

Program 13.1 : 3 sabit renk için enum kullanımı
/* enum1.c */
2:  enum renkler{kirmizi,sari,mavi};
3:
4:  main(){
5:       enum renkler renk;
6:       renk = sari;
7:       printf("\n%d",renk);
8:  }


Program 13.2 : 5 sabit bölüm için enum kullanımı
1:  /* enum2.c */
2:  enum bolumler{
3:    programcilik, donanim,   muhasebe, motor, buro
4:  }bolum;
5:
6:  main(){
7:     bolum = donanim;
8:     printf("\n%d",bolum);
9:     bolum +=2;  /* bolum=motor */
10:    printf("\n%d",bolum);
11: }

Alıntı yapılan adres: http://www.kadirga.k12.tr/egitim/c_programlama/ders.php-id=13.htm
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

JKramer

Alıntı yapılan: M_B - 30 Nisan 2014, 07:58:19
          enum bolumler{programcilik, donanim, muhasebe, motor};
tanımı ile derleyici programcilik için 0, donanim için 1, muhasebe için 2 ve motor için 3 değerini kabul ederek atamaları buna göre yapar.
Ek olarak; atamaları kullanıcı da yapabilir:
enum bolumler{programcilik=4, donanim=2, muhasebe, motor};

Bu durumda programcılık  4, donanim  2, muhasabe 0, motor 1 olur.

Bunun dışında enum için C'de şöyle bir kötü taraf var:
enum bolumler{programcilik=4, donanim=2, muhasebe, motor}bolum;
(...)
bolum=35;

bolum'e atama yapılırken tip tanımındaki değerler kontrol edilmiyor, bu yüzden derleyicinin fazladan özelliği yoksa yukarıdaki satır hata vermeden derlenir.

MT

#4
ek olarak;
enum  içinde tanımlı elemanlar en fazla integer büyüklüğünde değer alabilir.

enum içinde tanımlı elemandan sonra tanımlanan eleman değeri ilk değer verilmedikçe her zaman 1 fazlasıdır.

yani;
enum degisken{a=-10,b,c=0,d,e,f=11,g};

/*
bu durumda elemanların alacağı değerler
a=-10   b=-9   c=0    d=1   e=2   f=11 g=12
şeklinde olacaktır
*/


fonksiyon olarak kullanımına örnek verecek olursak;

enum eleman{
              a=0,
              b,
              c,
              d 
           };

void fonksiyon(enum eleman deger)
{

     unsigned char dizi[]={11,22,33,44};
     unsigned char sayi=dizi[deger];
     printf("%d\n",sayi);
 
}


stm8 kütüphanesinde de BOOL kullanımına aşağıdaki şekilde tanımlama yaparak izin veriyor
typedef enum{FALSE,TRUE}BOOL;


Erhan YILMAZ

#5
Durum makinesi şeklinde kod yazınca kullanılabilir okunabilirliği arttırmak için. Örneğin;

enum
{
	START,
	SENDDATA_1,
	SENDDATA_2,
	END,
	RETURNSYNC_1,
	RETURNSYNC_2,
	STOP
}TransmissionStates;

enum{
	TX_IDLE=0x00,
	SEND_LOOP_STATE_QUERY_REPLY=0x10,
	SEND_LOOP_INPUT_READ_REPLY=0x20,
	SEND_AUTO_LEARN_REPLY=0x30,
	SEND_YSss_REPLY=0X40,
	SEND_YOss_REPLY=0x50,
	SEND_END_OF_REPLY=0x60
}bTransmitStaes;

enum
{
	LOOP_INITIALIZE,
	LOOP_NORMAL_OPERATION,
	LOOP_LOAD_CONFIGURATION,
	LOOP_STATE_QUERY,
	LOOP_OUTPUT_SET_RESET,
	LOOP_READ_INPUT,
	LOOP_DEVICE_OUTPUT_SET_RESET,
	LOOP_AUTO_LEARN,
	LOOP_RESET,
	LOOP_DEVICE_TEST,
	SIZE_OF_MAIN_STATE_MACHINE
} MAIN_PROGRAM_STATES;


switch(bMainStateMachine)
   {
   	   case LOOP_INITIALIZE:
   	    // Kod buraya
   	   break;

           case LOOP_NORMAL_OPERATION:
            // Kod buraya
           break;

           case LOOP_LOAD_CONFIGURATION:
            // Kod buraya
           break;

           case LOOP_DEVICE_TEST:
            // Kod buraya
           break;
}

SpeedyX

Soru:
Bir char değişkeninin değerinin bilindik bir enum a ait değerler dışında olduğunu yada enumun değerlerinden biri olduğunu nasıl kontrol edersiniz?

Örnek enum:
typedef enum
{
  SET   = 'S',
  GET   = 'G',
  FOTA  = 'F',
  STAT  = 'T',
  _ACK  = 'A',
  NACK  = 'N',
  PING  = 'P',
  REPEAT = 'R',
  _RESET = 'E'
} pti_t;


Bir çözüm:
  switch(RFD.Frame.Pti)
  {
    case SET   :
    case GET   :
    case FOTA  :
    case STAT  :
    case _ACK  :
    case NACK  :
    case PING  :
    case REPEAT:
    case _RESET :
      break;
    default:
      RFD.Frame.Pti = NACK;
      break;
  }


Bunun dışında nasıl çözümler olabilir?