Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

#Define mı const mı?

Başlatan pax, 31 Mayıs 2015, 20:55:27

Farukc

Örnekler üzerinden açıklayalım:

Basit Kullanım:

#include <stdio.h>

#define SABIT1 "Bu bir Stringdir.\n"
const char *SABIT2 = "Bu bir Stringdir.\n";

int main() {
    printf(SABIT1); 
    printf("%s",SABIT2);
    return 0;

}


Denemek için: http://codepad.org/rA9KqP9e
Burada mantıklı olan seçim bence #define kullanmak. ön işlemci ile tüm sabitler yerine yazılacak ve debug için assembler a ayriyetten bir yük bindirmeyeceğiz.


Glabal Sabit Tanımlama Problemi:

#include <stdio.h>


void deneme();

int main() {
    #define OZELSABIT1  1
    const int OZELSABIT2 = 2;
    printf("Main Fonksiyonu:");
    printf("OZELSABIT1");
    printf("%i",OZELSABIT2);

    deneme();

    return 0;

}


void deneme () {
     printf("Main Fonksiyonu:");
     printf("OZELSABIT1");
     printf("%i",OZELSABIT2); // Derleyici burada hata verecektir.
    /* Çünkü const özel olarak tanımlanmıştır. 
     Fakat define ise global olarak tanımlandığı için üstte hata vermez. 
     Eğer sabitlerinizi özel olarak tanımlamak istiyorsanız const kullanmak daha mantıklı.*/
}


Denemek için:
http://codepad.org/XtGMn06B

Sabit ismi tanımlama Problemi:

#include <stdio.h>


/*
Hatalı Kullanım:

const char *SABIT_ADI="SABIT1";
const int SABIT_ADI=1;

SABIT_ADI="SABIT2";
SABIT_ADI=2;

*/

#define SABIT_ADI SABIT1
const int SABIT_ADI =1;

#define SABIT_ADI SABIT2
const int SABIT_ADI =2;



int main() {
    printf("SABIT1:%i\n  SABIT2:%i\n",SABIT1,SABIT_ADI); // SABIT_ADI yerine SABIT2 de yazabilirdik. 
   //Fakat son tanımlanan SABIT_ADI degeri SABIT2 olduğu için buda aynı kapıya çıkacaktır.
   return 0;

}


Doğru Kullanım için:
http://codepad.org/rK0IvgrI
Hatalı Kullanım için:
http://codepad.org/DXaAx3rq



Bunlar gibi bir sürü örnek verilebilir. Benim anlatmaya çalıştığım şey ise yazacağınız programa göre kullanım alanları değişir. Bunlarda program yazarken edineceğiniz tecrübeler sonucu oluşacaktır.
Hadi anlat const ile define nın farkı denilemez. Ben ne kadar anlatsamda denemeler yapmadan tecrübe edinmeden farkın tam olarak anlaşılayamayacağı kanaatindeyim.

Umarım anlatabilmişimdir..

pax

Verdiğiniz örnekler için sağolun. benim anlamaya çalıştığım , merak ettiğim sizin 1. örneğinizdeki kullanım şekliydi. 2.ve 3. örnek kullanımları ile ilgili bir sorun yok.  bu şekilde anlamış oldum teşekkürler.

Farukc

Alıntı yapılan: pax - 01 Haziran 2015, 11:29:54
Verdiğiniz örnekler için sağolun. benim anlamaya çalıştığım , merak ettiğim sizin 1. örneğinizdeki kullanım şekliydi. 2.ve 3. örnek kullanımları ile ilgili bir sorun yok.  bu şekilde anlamış oldum teşekkürler.

Anlatabilmişsek ne mutlu..

trgtylcnky

#define bir önişlemci olarak derleyici tarafından program derlenmeden önce bakılır. Mesela #define pi 3.14 demişsek pi görülen yerlere 3.14'ü yapıştırıp öyle derler. Ama const ile tanımladığımız değer bellekte saklanıyor. #define ile yazılan daha hızlıdır diyebiliriz sanırım çünkü bellek adresine müracaat etmek yerine literal kullanılıyor.

RaMu

Hep vurgulanmış, nerede nasıl kullanıldığına göre değişir.
Kullanılan dil, derleyici,
kullanılan işlemci, mikrodenetleyici, bunlar durumu çok değiştirebilir.

Ben bildiğim yerden örnek vereyim:
Misal mcu nun pin_A0 pinine LED1 bağlanacak,
kullanılacak mcu pic16F serisi,
derleyici CcsC olsun:
1) const unsigned int8 LED1=PIN_A0;
veya
2) #define LED1   PIN_A0
ikiside kullanılabilir.
1. durumda daha fazla ram harcama ihtimali oluşabilir,
ayrıca program hafızasında kullanılacak alan kesinlikle artacak.
const ile tanımlanan değer kesinlikle program hafızasına yazılacak.
komutxxx(LED1) yazıldığında, öncelikle
LED1 program hafızasından okunacak,
daha sonra komutxxx(LED1) deki yerine yazılacak,
bu nedenle ram rom kullanımı artacak.

2. durumda ise programda komutxx(pin_A0) veya komutxxx(LED1)
yazmanın hiçbir farkı olmayacak,
çünkü derleyici LED1 yazan yere pin_A0 yazılmış gibi işlem yapacak.

Diğer durum şöyle olabilir:
Yukarıda örneklendiği gibi
program içinde sık kullanılan bir sabit sayı lazım,
1a)const unsigned int8 kazanc=3
vaya
2a)#define kazanc 3

Burada ise yine const ile tanımlandığında
kesinlikle program hafızasına bu değer yazılacak.
Kullanılırken program hafızasından okunacak,
(Bu arada program hafızasından değer okumak picde uzun iştir,
ram den okumak gibi olmaz)
komutxxx(kazanc);
dendiğinde değer romdan okunup sonra komutta işlem görecek.
2a durumunda ise
derleyici  komutxxx(kazanc); kısmını daha derlerken
komutxxx(3); olarak işleme sokcak,
optimizasyona göre veya kullanacağı komutlara göre,
oluşturduğu assembler komutlarında
romdan okuma kısmı olmayacak ve
bu kazanc değerini direk asm komutunun arguman kısmına yazıp
romdan ekstra biryer kullanmayadabilecek.


const ın asıl kullanım alanı
sabit bir tablo misal yazı fontu,
sinus üretmek için bir tablo,
7 segment display için dönüşüm tablosu gibi yerler.

Komuta parametre olarak geçecek bir değer için #define
tablo değerleri için const kullanmak daha iyi bence.

Ayrıca kullanılan mcu da işi çok değiştirir,
mcu nun asm komutları işlerken kullandığı
accumulator (akümülatör diyorlar) genelde W veya Wreg denen register veya register ları var,
misal 16F de W bir tane, (16F 8 bit işlemcili)
ama dspic30F2010 da (hatırladığım kadarıyla) 14 tane  (dspic30F 16 bit işlemcili)
ve asm komut seti olarakda çok farklılar,
misal 16F de iki sayıyı toplamak istiyorsak
sayılardan biri ramde tanımlı bir değişken
diğeri ise bir sabit veya W akü registerına geçici olarak alınmış bir değer olmalı.

Ama dspic iki farklı W registerında bulunan sayıları toplayabiliyor ve hatta bunu başka bir Wreg ına yazabiliyor.
Bazı mcular iki ram değişkenini toplayabiliyor.
Bu gibi durumlarda ve derleyici bunları iyi yönetebiliyorsa
en ufak kullanım şekli durumu hemen değiştirir.

O nedenle şartlara özel düşünmek zorundayız.
(Misal CcsC de const ile tanımlanan değer sadece okunabilirdir ve pointer da atanamaz, program hafızasına yazılır,
ama rom diyede sabit tanımlanabilir, hem okunur hem yazılır hemde pointer atanabilir, oda program hafızasına yazılır.)
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

newpronik

bildiğim kadarıyla define yapıldığında yazdığınız veri değişkene ekleniyor

Örneğin :
#define pi 3.14

float pi2 = pi;

#define kullanımında derleyici define değerlerini alarak direk kopyala yapıştır yaparak yazıyor yani siz yukarıdaki kodu yazıyorsunuz ama derleme sırasında

float pi2 = 3.14;   olarak değiştiriliyor.

ancak const kullandığınızda const o değişkeni değiştirilemez yapıyor.

const float pi = 3.14;   dediğiniz zaman
pi = 6.14;   yazarsanız bu kod çalışmaz değişkeni değiştiremez.


kullanım yeri bence tamamen kullanıcıya kalmış mesela bir yazılım olsun donanım olsun eğer deneme sürümü süresi yapacaksanız
const int denemeSurumu = 5;    demekte fayda var

ama siz bir sınır belirliyorsanız mesela zaman sınırı

#define zamanSiniri 10;     bu şekilde yazarsanız ve kodunuzda birden çok zaman var ve sınırlayıp istediğiniz zaman değiştirmek istiyorsanız define kullanmak daha mantıklı.



toparlamak gerekirse define genel oluyor const özel oluyor :)

pax

RaMu  sağolasın oldukça açıklayıcı oldu.