Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: pax - 31 Mayıs 2015, 20:55:27

Başlık: #Define mı const mı?
Gönderen: pax - 31 Mayıs 2015, 20:55:27
Değişken tanımlarken sabit bir değeri #Define veya  const olarak tanımlama farkı nedir? Veya en doğrusu hangisidir?
Başlık: Ynt: #Define mı const mı?
Gönderen: MrDarK - 31 Mayıs 2015, 20:59:09
Değişkene atanan değerlerin const olmasından yanayım.

#define bilgisi ile derleyiciye nereyi derlemesi gerektiğini söyleyebiliyoruz bu sayede yazılımın belli başlı yerlerini kesmek mümkün olabiliyor.

Detaylı araştırırsak daha güzel yorumlar bulacağımıza eminim.

#define 'ın bir ön işlemci kodu olduğunu biliyorum, const neye giriyor acaba ?   
Başlık: Ynt: #Define mı const mı?
Gönderen: Tagli - 31 Mayıs 2015, 21:06:58
Aslında const kullanmak daha iyi sabitler için. Ancak ayrıntıları hatırlamamakla birlikte C ve C++'ın const ifadesine yaklaşımı farklı diye biliyorum. C++ const kullanılan bazı yerlerde C derleyicileri hata veriyor. Sorunla nerede karşılaştığımı hatırlamıyorum ama ya enumaration ya da switch case yapısı ile ilgili bir şeydi. Galiba C'de mesela #define BIR 1 diye (saçma da olsa) bir tanım yaptık. Bunu case BIR: diye kullanabiliyoruz. Ama const int BIR = 1; diye tanımlamışsak kullanamıyoruz. Ancak C++'ta bu yapılabiliyor.
Başlık: Ynt: #Define mı const mı?
Gönderen: Icarus - 31 Mayıs 2015, 21:11:08
O tip sabitlerin tanımlanması için bunların dışında 3-4 teknik daha var.
Önemli nokta sabitin neyi etkilediği ?
Başlık: Ynt: #Define mı const mı?
Gönderen: erenbasturk - 31 Mayıs 2015, 23:43:49
pax

const hafıza üzerinde optimizasyon yapılmasını sağlayan bir komuttur. const'u bir degişken tipinden önce kullandığınız zaman derleyiciye bunu rw-data'ya değil ro-data'ya yazın diyorsunuz. Sabit değerler için const kullanmak avantaj sağlar. debug yapabilme, tip güvenilirliği sağlamaktadır.

C'de switch case yapısında. Case kısmına sadece tam sayılar yazılabilir. Ondalıklı sayılar yada degişkenler yazılamaz. Ne kadar const'da kullanılsa bu sadece derleyicinin hafıza tutulduğu yeri değiştirmektir. Sonuç olarak case kısmına C'de degişken yazılamaz.

Alıntı yapılan: Tagli - 31 Mayıs 2015, 21:06:58
Aslında const kullanmak daha iyi sabitler için. Ancak ayrıntıları hatırlamamakla birlikte C ve C++'ın const ifadesine yaklaşımı farklı diye biliyorum. C++ const kullanılan bazı yerlerde C derleyicileri hata veriyor. Sorunla nerede karşılaştığımı hatırlamıyorum ama ya enumaration ya da switch case yapısı ile ilgili bir şeydi. Galiba C'de mesela #define BIR 1 diye (saçma da olsa) bir tanım yaptık. Bunu case BIR: diye kullanabiliyoruz. Ama const int BIR = 1; diye tanımlamışsak kullanamıyoruz. Ancak C++'ta bu yapılabiliyor.
Başlık: Ynt: #Define mı const mı?
Gönderen: z - 01 Haziran 2015, 02:51:39
const ile değerlere anlamlı kelimeler iliştirmiş oluyoruz.

define da yanlış hatırlamıyorsam bunun ötesinde komut bile atayabiliyoruz.

Örneğin programın pek çok yerinde send(10,12,45); satırı geçecekse

define yolla send(10,12,45) tanımı yapıp

yazıp ardından komut aralarında yolla; diyebiliyoruz.

Başlık: Ynt: #Define mı const mı?
Gönderen: yamak - 01 Haziran 2015, 08:18:24
İkisinin de kullanım alanları farkı.
Mesela sabit bi array var ve program içinde bu arrayin farklı indexlerdeki elemanlarına erişmek istiyosun. Bu durumda const kullanırsın böyle birşeyi define ile yapamazsın yani  define bu kadar esneklik sağlamaz. Ama atıyorum pi sayısını bi çok yerde kullanmak istiyosun pi sayısını define ile tanımlayıp her seferinde 3.1415... yazmaktan kurtulursun.
Siz sorunuz hangi durum için sordunuz?Örnek verirseniz daha açıklayı cevaplar verilebilir.
Başlık: Ynt: #Define mı const mı?
Gönderen: pax - 01 Haziran 2015, 09:24:22
Alıntı yapılan: yamak - 01 Haziran 2015, 08:18:24
İkisinin de kullanım alanları farkı.
Mesela sabit bi array var ve program içinde bu arrayin farklı indexlerdeki elemanlarına erişmek istiyosun. Bu durumda const kullanırsın böyle birşeyi define ile yapamazsın yani  define bu kadar esneklik sağlamaz. Ama atıyorum pi sayısını bi çok yerde kullanmak istiyosun pi sayısını define ile tanımlayıp her seferinde 3.1415... yazmaktan kurtulursun.
Siz sorunuz hangi durum için sordunuz?Örnek verirseniz daha açıklayı cevaplar verilebilir.

sizin de örnek verdiğiniz gibi örneğimiz pi sayısı olsun

#define pi 3.14

const float pi=3.14

benim anlamaya çalıştığm tam olarak verdiğim örenklerden hangisi en doğrudur.
Başlık: Ynt: #Define mı const mı?
Gönderen: yamak - 01 Haziran 2015, 09:34:44
Bu durumda #define kullanmanız daha mantıklı. Çünkü değişken olarak tanımlarsanız bi daha derleyici onu optimize etmekle uğraşacak.Ama bu durumda bile yine kullancağınız yere göre değişir.Mesela pi sayısı bi fonksiyona referans olarak geçirmek istiyosunuz;o zaman const ile tanımlamak mantıklı olur. Ya da mesela pi değil de başka bi örnek verirsek

size diye bişey tanımlamak isiyosunuz ve bununlar tanımladığınız array lerin size ı belirleme istiyosunuz örneğin aşağıdaki gibi

unsigned char UartBuffer[size];

bu durumda mecburen define kullanmak gerekir.
Yani dediğim gibi duruma göre değişir.
Başlık: Ynt: #Define mı const mı?
Gönderen: pax - 01 Haziran 2015, 09:42:51
Alıntı yapılan: yamak - 01 Haziran 2015, 09:34:44
Bu durumda #define kullanmanız daha mantıklı. Çünkü değişken olarak tanımlarsanız bi daha derleyici onu optimize etmekle uğraşacak.

anladım. peki define kullanınca hafızada daha az yer kaplar gibi bir durum var mı?
Başlık: Ynt: #Define mı const mı?
Gönderen: yamak - 01 Haziran 2015, 09:54:12
Yani sadece matematiksel işlemlerde pi yerine koyma için kullanılacaksa const ile tanımlarsanız flash ta değişken türüne göre yer ayrılır. Ama define'da böyle bişey olmaz.
Hocam bu sorular ucu açık sorular net olarak şöyle şöyle olur söylenemez.Dediğim gibi kullanım durumuna göre değişir.
Başlık: Ynt: #Define mı const mı?
Gönderen: Farukc - 01 Haziran 2015, 09:55:43
Const #define dan daha iyidir. Yada #define const tan daha iyidir demek yanlış bir yaklaşım. Her ikisininde kullanım alanları farklı.

Mesela const ile makro tanımlayamazsınız.
Başlık: Ynt: #Define mı const mı?
Gönderen: pax - 01 Haziran 2015, 10:06:39
Alıntı yapılan: Farukc - 01 Haziran 2015, 09:55:43
Const #define dan daha iyidir. Yada #define const tan daha iyidir demek yanlış bir yaklaşım. Her ikisininde kullanım alanları farklı.

Mesela const ile makro tanımlayamazsınız.

konu bu değil zaten.

konu

#define pi 3.14

const float pi=3.14

bu tanımlamalardan hangisinin en doğru olduğu.
Başlık: Ynt: #Define mı const mı?
Gönderen: Farukc - 01 Haziran 2015, 10:08:38
Bende diyorumki ikiside doğru yazdığın programa göre ikisinide kullanabilirsin. Hangisinin daha doğru olduğunu yazdığın programın özellikleri belirler. Vaktim olursa bir örnek atarım.
Başlık: Ynt: #Define mı const mı?
Gönderen: pax - 01 Haziran 2015, 10:50:19
Alıntı yapılan: Farukc - 01 Haziran 2015, 10:08:38
Bende diyorumki ikiside doğru yazdığın programa göre ikisinide kullanabilirsin. Hangisinin daha doğru olduğunu yazdığın programın özellikleri belirler. Vaktim olursa bir örnek atarım.
anladım. ben de bunu merak ediyorum.
Başlık: Ynt: #Define mı const mı?
Gönderen: Farukc - 01 Haziran 2015, 11:03:08
Ö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 (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 (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 (http://codepad.org/rK0IvgrI)
Hatalı Kullanım için:
http://codepad.org/DXaAx3rq (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..
Başlık: Ynt: #Define mı const mı?
Gönderen: 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.
Başlık: Ynt: #Define mı const mı?
Gönderen: Farukc - 01 Haziran 2015, 11:37:35
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..
Başlık: Ynt: #Define mı const mı?
Gönderen: trgtylcnky - 01 Haziran 2015, 13:41:26
#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.
Başlık: Ynt: #Define mı const mı?
Gönderen: RaMu - 01 Haziran 2015, 14:28:40
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.)
Başlık: Ynt: #Define mı const mı?
Gönderen: newpronik - 01 Haziran 2015, 14:38:11
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 :)
Başlık: Ynt: #Define mı const mı?
Gönderen: pax - 01 Haziran 2015, 14:40:31
RaMu  sağolasın oldukça açıklayıcı oldu.