C Değişken tanımlaması

Başlatan esensoy, 25 Aralık 2013, 10:47:10

esensoy

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?
En tehlikeli an "zafer" anıdır.

ercan_t

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...

esensoy

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
En tehlikeli an "zafer" anıdır.

ercan_t

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...



esensoy

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,
En tehlikeli an "zafer" anıdır.

Gökhan BEKEN

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.
Özel mesaj okumuyorum, lütfen göndermeyin.

esensoy

#6
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
En tehlikeli an "zafer" anıdır.

Gökhan BEKEN

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.
Özel mesaj okumuyorum, lütfen göndermeyin.

esensoy

En tehlikeli an "zafer" anıdır.

ercan_t

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



esensoy

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,
En tehlikeli an "zafer" anıdır.

ercan_t

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.