Selamlar,
Dev-C++ Ide üzerinde C ile basit bir program yazıyorum,
main.c;#include <stdio.h>
#include <stdlib.h>
int a=0;
#include "alt_programlar.c"
int main(int argc, char *argv[])
{
topla();
system("PAUSE");
return 0;
}
alt_programlar.c;void topla(void){
a=a+5;
}
a yı global olarak tanımlıyorum ama derlediğimde a tanımlanmadı diye hata veriyor, ccs c de boyle birşeyle karşılaşmıyorum, sorun nedir?
merhaba,
alt_programlar.c; dosyasının üstüne
extern int a; yaz yada header file var ise alt_programlar.h içine de yazabilirsin
sorunun çözülmüş olur...
ama global değişken bu neden extern kullanayım ki?
alt_programlar.c zaten değişkenler tanımlandıktan sonra dahil ediliyor, yani dahil edildiği an a zaten tanımlanmış olmalı,
yanlış mı düşünüyorum
selam,
bildiğim kadarı ile,
compile aşamasında her .c dosyası ayrı ayrı obje dosyaları oluşur en sonda obje dosyaları linker vasıtası ile calıştırılabilir dosya haline gelir(aşağıda resmi var)
her .c dosyasının kullanıdığı değişken fonksiyon kütüphane vs birimlerinin bir referans noktası olması gerekitğidir,
alt_programlar.c dosyasının yalnız başına obje file olarak değerlendirdiğinde "a" değişkeninin bir referansı olmadığından compiler hata verir.
kolay gelsin...
(http://www.cs.bu.edu/teaching/cpp/writing-makefiles/chart.gif)
Dediğiniz mantıkla sorun çözülüyor,
CCS C de bu durumlarda extern ihtiyacıyla karşılaşmıyorum ama MPLAB IDE ve MBLABX IDE de aynı sorunla karşılaşmıştım,
Sanırım CCS C işi kolaylaştırmış, diğerleri ANSI C den devam ediyorlar,
Peki #define x 5
şeklinde bir tanımlama yaparsak x e diğer kod sayfalarından nasıl ulaşacağız?
İlginize teşekkür ederim, zaman zaman takıldığım bir problemi çözdüm gibi,
Alıntı yapılan: esensoy - 25 Aralık 2013, 12:52:24
Peki #define x 5
şeklinde bir tanımlama yaparsak x e diğer kod sayfalarından nasıl ulaşacağız?
header dosyasına bu tanımlamaları yapıp, çağırdığınız her dosyada bu tanımlamaları kullanabilirsiniz.
cillop gibi oldu, uzun zamandır anlamaktan kaçındığım bir durumu çözümledim, teşekkürler tekrar,
Şimdi benden sonrakiler tırmalamasın diye toparlarsak (yanlışım varsa düzeltiniz);
defineler.h#ifndef __definelar_h__
#define __definelar_h__
#define a 15
#define b 10
#endif
main.h#ifndef __main_h__
#define __main_h__
#include "definelar.h"
#endif
main.c#include <stdio.h>
#include <stdlib.h>
#include "main.h"
int c;
int main(int argc, char *argv[])
{
c=a+b;
topla();
system("PAUSE");
return 0;
}
alt_prg1.h#ifndef __alt_prg1_h__
#define __alt_prg1_h__
extern int c;
void topla(void);
#endif
alt_prg1.c#include "definelar.h"
#include "alt_prg1.h"
void topla(void){
c=a-b;
}
şeklinde dosyaları hazırlayınca problemsiz derleniyor
alt_prg1.h dosyanızı
extern int c;
void topla(void); //topla fonksiyonun prototipi
olarak değiştirmenizi yani kullandığınız fonksiyonların prototipini yazmanızı tavsiye ederim.
Ayrıca header dosyalarınızın sonuna fazladan 1-2 boş satır yani enter eklemenizi tavsiye ederim, mplabx hata veriyor böyle yapmayınca.
dediğiniz gibi düzenledim,
merhaba,
c projesi hazırlarken her daim her yeni c file için header file oluşması ve bunlarında
diğer c file lardan cağırılması gerekir
dikkat edilecek husus her c file dan cağırılan header fille lar compiler da redefine yarartmaması için yazılacak olan prototip define vs leri aşağıdaki bloğun arasında yazılması gerekir
#ifndef __XXXXX_H__
#define ___XXXX_H__
..
.
.
.
.
#endif
Alıntı yapılan: ercan_t - 25 Aralık 2013, 15:31:36
#ifndef __XXXXX_H__
#define ___XXXX_H__
#endif
bu dediğinizi de ekledim,
selamlar,
Bu işlermleri her daim tekrar yapmak istemiyorsan ,
iyi editörlerim(IDE) create file c/h için bir template manager ları olur. bu tanımları otomatik yapar. bu ayarları yapabilirsin.
yukarıdaki #ifndef XXX olayını yapmadığın durumda aynı header file bir kaç c file ile cağırdığında fonksiyon define vs ler her zaman tekrar tanımlanmış gibi olur compiler hata veya warning verir.
bazı yukarıda belirtmişsin compiler da hata vermemiş bunun nedenide compiler derleme aşamsında hata atla, mesaj verme ,debug level vs parametreleri verilmesidir.