Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => Konuyu başlatan: esensoy - 25 Aralık 2013, 10:47:10

Başlık: C Değişken tanımlaması
Gönderen: esensoy - 25 Aralık 2013, 10:47:10
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?
Başlık: Ynt: C Değişken tanımlaması
Gönderen: ercan_t - 25 Aralık 2013, 10:53:59
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...
Başlık: Ynt: C Değişken tanımlaması
Gönderen: esensoy - 25 Aralık 2013, 10:59:41
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
Başlık: Ynt: C Değişken tanımlaması
Gönderen: ercan_t - 25 Aralık 2013, 11:06:57
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)
Başlık: Ynt: C Değişken tanımlaması
Gönderen: esensoy - 25 Aralık 2013, 12:52:24
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,
Başlık: Ynt: C Değişken tanımlaması
Gönderen: Gökhan BEKEN - 25 Aralık 2013, 13:15:45
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.
Başlık: Ynt: C Değişken tanımlaması
Gönderen: esensoy - 25 Aralık 2013, 13:49:34
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
Başlık: Ynt: C Değişken tanımlaması
Gönderen: Gökhan BEKEN - 25 Aralık 2013, 14:27:32
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.
Başlık: Ynt: C Değişken tanımlaması
Gönderen: esensoy - 25 Aralık 2013, 14:38:33
dediğiniz gibi düzenledim,
Başlık: Ynt: C Değişken tanımlaması
Gönderen: ercan_t - 25 Aralık 2013, 15:31:36
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


Başlık: Ynt: C Değişken tanımlaması
Gönderen: esensoy - 25 Aralık 2013, 15:36:43
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,
Başlık: Ynt: C Değişken tanımlaması
Gönderen: ercan_t - 25 Aralık 2013, 15:43:05
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.