C18'de Dosyalar Arası Global Değişken Tanımlamak

Başlatan Tagli, 28 Temmuz 2011, 16:49:07

Tagli

C18'de yazmakta olduğum bir kodu, modüler bir yapıda olması için farklı .c dosyalarına bölerek yazıyorum. Ana programın kullanacağı fonksiyonları kütüphane yazar gibi farklı .c dosyaları içine koyup bunlar için .h dosyaları yazıyorum.

Sorun şurada: Ana programdaki bir değişkeni global olarak bir başka .c dosyası içinde kullanmam gerekiyor ancak derleme sırasında derleyici bu değişkenin tanımlanmamış olduğundan yakınıyor. Ne yapmam gerekir?
Gökçe Tağlıoğlu

CoşkuN

Genelde projelerde global değişkenleri ayrı bir modül olarak tanımlayıp diğer modüllerde de bu modülü include etmek iyi bir yöntemdir.
globaller.h gibi mesala.

controller

Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

Sepiroth

aslinda her .c dosyasina (kutuphane fonksiyonuna karsilik gelen) bir .h yazmaniza gerek yok, ayni gorev/konu ile ilgilileri tek bir header ile include edebilirsin.
global olarak tanimlayacagin degiskeni eger yanlis hatirlamiyorsam once asil kullanacagin yerde tanimlayacaksin. sonra kullanmak istedigin fonksiyonlarda (bu durumda baska .c dosyalarinda) extern olarak tekrar deklare edeceksin. mesela

main.c
int gVar;
int main(){
gVar=5;
}


fonksiyon_1.c
extern int gVar;

void fonksiyon(){
gVar++;
}


boyle olmasi lazim. ama her .c dosyasinda bunu extern olarak deklare edecegine, ayri fonksiyonlari topladigin header icine bi kere gom mutlu mesut yasa:)
Either you feel it, or not...

Tagli

Dediklerinizi denedim, tüm yöntemler hata veriyor. Ayrıca, ben değişkeni #pragma idata alanı içinde tanımlamak istiyorum. global.h gibi bir dosya içinde bu tanımlamayı yapıp diğer dosyalarda include ettiğim zaman derleyici birden fazla defa tanımlandığını söyleyerek hata veriyor. Halbuki tüm .h dosyalarında header guard koymuş durumdayım.

Burada değişkenin iki tarafta da extern olarak tanımlanması gerektiği söylenmiş. Bu şekilde de denedim. Sadece tanımlama yapılırsa hata vermiyor. Ancak değişkeni bir yerde kullanmak istediğim zaman hata veriyor.
Gökçe Tağlıoğlu

controller

Alıntı yapılan: Tagli - 28 Temmuz 2011, 17:31:06

Burada değişkenin iki tarafta da extern olarak tanımlanması gerektiği söylenmiş. Bu şekilde de denedim. Sadece tanımlama yapılırsa hata vermiyor. Ancak değişkeni bir yerde kullanmak istediğim zaman hata veriyor.

Bunun sebebi, değişkeni kullanmaz iseniz derleyici optimizasyon gereği deişkeni tanımlanmamış gibi kabul eder.

Hata almanızın sebebi farklı olabilir. Değişkeni diğer modüllerde extern olarak tanımlayarak kullanabilmeniz gerekir.

Bir diğer hatırlatma, değişken ana modülde static olarak tanımlanırsa local değişken gibi işlem görür, diğer modüllerden erişilemez.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

Tagli

Çözümü burada buldum. global.h içinde extern ile tanımlama yapılacak. Onun dışında, sadece bir kez #pragma idata gibi bir yerde  yerleştirme işlemi yapılacak.

Yani decleration ve definition kavramlarını birbirine karıştırmamak lazım. Bu konuda dikkatsiz davranmışım  :-[ Sadece bir kez definition yapılabilir, ama pek çok kez decleration yapmak mümkündür.

Gerçi oradaki kodda adam #define extern gibi birşey yazmış. Onun mantığını anlayamadım, kullanmadım da zaten.

İlgilenen arkadaşlara teşekkürler. Program henüz PIC'e yazılıp denenebilecek duruma gelmediği için yazdığım şekliyle doğru çalışıp çalışmadığından emin değilim. Bir sorunla karşılaşırsam yine burada dile getiririm.
Gökçe Tağlıoğlu

bymrz

Hocam kısaca ana mantık şu;

Her "C" dosyasında fonksiyonları ve değişkenleri extern olmaksızın başta tanımlarsın.
Daha sonra aynı dosya isminde bir de h uzantılı dosya oluşturursun . Bu "h" dosyasında "c" dosyasındaki dışarıdan kullanmak istediğin değişken ve fonksiyonları, başına extern koyarak tanımlarsın.

Ayrıca "h" dosyasındaki bütün kodları şu aralık içine yazmakta fayda var:
#ifndef MAIN_H
#define MAIN_H

//extern Değişkenler
//extern fonksiyonlar
//

#endif



aynı zamanda, eğer bu "h" dosyası içinde bazı "h" dosyaları gerekliyse onlarda buraya eklenir;
#ifndef MAIN_H
#define MAIN_H

#include "pic18.h"
#include "port_tanimlamalari.h"

//extern Değişkenler
//extern fonksiyonlar
//

#endif





Daha sonra bütün dosyalar compile edilip ardından linker yardımıyla "Rebuild All"edilerek sonuca ulaşabilirsiniz...