Şimdi Ara

Header Kodlama

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
13
Cevap
0
Favori
1.144
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Arkadaslar c programlama tek tek butun header dosyalarini tanimlamak yerine bi header dosya ya butun header dosyalarini tanimlasak ve her programda bu header dosyayi kullanmak istiyorum...

    header dosya kodlama hakkinda her türlü yardim please


    //By_AraGorn



  • yapmak istedigin tavsiye edilmez, ama cok israr edersen bir header dosyasi ac ve sisteminde bulunan butun header dosyalarini #include yap.

    ornek:

    //dosya.h
    #include <stdio.h>
    #include <math.h>
    .....


    daha sonra da kendi programinda sadece #include <dosya.h> yapman yeterli olacaktir.

    sanirim c'ye alisik olmadigin icin biraz zorlaniyorsun ve boyle bir kolay yol ariyorsun, ama zamanla teker teker kodlamaya alisirsin...

    buyuk dosyalarda kullanilan bir teknik bu esasinda, yani her kaynak kodu dosyasinda 10 satir header yazmak yerinde sadece bir satir ile programi temiz tutmak da mumkun. Ama burada header dosyalarina sadece gerekli olanlar konuluyor, senin ornegindeki gibi sistemdeki butun dosyalar degil.

    #include komutu pre-processor'a bu dosyayi getirmesini soyluyor, yani sen sistemindeki butun header dosyalarini kaynak koduna eklemis olacaksin, bu da gereksiz.




  • hocam demek istediginizi cok iyi anliyorum vede bunun gereksiz bi yontem oldugunuda dusunuyorum....

    hocam tam olarak nasil yazacagiz diger header dosyalarde #indefine kullanilmis biraz daha fazla bilgi verir misiniz?

    //By_AraGorn
  • gocam tamam yaptigim header dosya oldu fakat benim baska bi sorum olcak...

    header dosyar nasil calisir biraz anlatirmisiniz?

    ornegin <stdio.h> dosyasinin icinde

    /* stdio.h

    Definitions for stream input/output.

    Copyright (c) 1987, 1991 by Borland International
    All Rights Reserved.
    */

    #ifndef __STDIO_H
    #define __STDIO_H

    #if !defined( __DEFS_H )
    #include <_defs.h>
    #endif

    #ifndef NULL
    #include <_null.h>
    #endif

    #ifndef _SIZE_T
    #define _SIZE_T
    typedef unsigned size_t;
    #endif

    /* Definition of the file position type
    */
    typedef long fpos_t;


    /* Definition of the control structure for streams
    */
    typedef struct {
    int level; /* fill/empty level of buffer */
    unsigned flags; /* File status flags */
    char fd; /* File descriptor */
    unsigned char hold; /* Ungetc char if no buffer */
    int bsize; /* Buffer size */
    unsigned char *buffer; /* Data transfer buffer */
    unsigned char *curp; /* Current active pointer */
    unsigned istemp; /* Temporary file indicator */
    short token; /* Used for validity checking */
    } FILE; /* This is the FILE object */

    /* Bufferisation type to be used as 3rd argument for "setvbuf" function
    */
    #define _IOFBF 0
    #define _IOLBF 1
    #define _IONBF 2

    /* "flags" bits definitions
    */
    #define _F_RDWR 0x0003 /* Read/write flag */
    #define _F_READ 0x0001 /* Read only file */
    #define _F_WRIT 0x0002 /* Write only file */
    #define _F_BUF 0x0004 /* Malloc'ed Buffer data */
    #define _F_LBUF 0x0008 /* line-buffered file */
    #define _F_ERR 0x0010 /* Error indicator */
    #define _F_EOF 0x0020 /* EOF indicator */
    #define _F_BIN 0x0040 /* Binary file indicator */
    #define _F_IN 0x0080 /* Data is incoming */
    #define _F_OUT 0x0100 /* Data is outgoing */
    #define _F_TERM 0x0200 /* File is a terminal */

    /* End-of-file constant definition
    */
    #define EOF (-1) /* End of file indicator */

    /* Number of files that can be open simultaneously
    */
    #if __STDC__
    #define FOPEN_MAX 18 /* Able to have 18 files (20 - stdaux & stdprn) */
    #else
    #define FOPEN_MAX 20 /* Able to have 20 files */
    #define SYS_OPEN 20
    #endif

    #define FILENAME_MAX 80

    /* Default buffer size use by "setbuf" function
    */
    #define BUFSIZ 512 /* Buffer size for stdio */

    /* Size of an arry large enough to hold a temporary file name string
    */
    #define L_ctermid 5 /* CON: plus null byte */
    #define P_tmpdir "" /* temporary directory */
    #define L_tmpnam 13 /* tmpnam buffer size */

    /* Constants to be used as 3rd argument for "fseek" function
    */
    #define SEEK_CUR 1
    #define SEEK_END 2
    #define SEEK_SET 0

    /* Number of unique file names that shall be generated by "tmpnam" function
    */
    #define TMP_MAX 0xFFFF

    /* Standard I/O predefined streams
    */

    #if !defined( _RTLDLL )
    extern FILE _Cdecl _streams[];
    extern unsigned _Cdecl _nfile;

    #define stdin (&_streams[0])
    #define stdout (&_streams[1])
    #define stderr (&_streams[2])

    #if !__STDC__
    #define stdaux (&_streams[3])
    #define stdprn (&_streams[4])
    #endif

    #else

    #ifdef __cplusplus
    extern "C" {
    #endif
    FILE far * far __getStream(int);
    #ifdef __cplusplus
    }
    #endif

    #define stdin __getStream(0)
    #define stdout __getStream(1)
    #define stderr __getStream(2)
    #define stdaux __getStream(3)
    #define stdprn __getStream(4)

    #endif

    #ifdef __cplusplus
    extern "C" {
    #endif
    void _Cdecl clearerr(FILE *__stream);
    int _Cdecl fclose(FILE *__stream);
    int _Cdecl fflush(FILE *__stream);
    int _Cdecl fgetc(FILE *__stream);
    int _Cdecl fgetpos(FILE *__stream, fpos_t *__pos);
    char *_Cdecl fgets(char *__s, int __n, FILE *__stream);
    FILE *_Cdecl fopen(const char *__path, const char *__mode);
    int _Cdecl fprintf(FILE *__stream, const char *__format, ...);
    int _Cdecl fputc(int __c, FILE *__stream);
    int _Cdecl fputs(const char *__s, FILE *__stream);
    size_t _Cdecl fread(void *__ptr, size_t __size, size_t __n,
    FILE *__stream);
    FILE *_Cdecl freopen(const char *__path, const char *__mode,
    FILE *__stream);
    int _Cdecl fscanf(FILE *__stream, const char *__format, ...);
    int _Cdecl fseek(FILE *__stream, long __offset, int __whence);
    int _Cdecl fsetpos(FILE *__stream, const fpos_t *__pos);
    long _Cdecl ftell(FILE *__stream);
    size_t _Cdecl fwrite(const void *__ptr, size_t __size, size_t __n,
    FILE *__stream);
    char *_Cdecl gets(char *__s);
    void _Cdecl perror(const char *__s);
    int _Cdecl printf(const char *__format, ...);
    int _Cdecl puts(const char *__s);
    int _CType remove(const char *__path);
    int _CType rename(const char *__oldname,const char *__newname);
    void _Cdecl rewind(FILE *__stream);
    int _Cdecl scanf(const char *__format, ...);
    void _Cdecl setbuf(FILE *__stream, char *__buf);
    int _Cdecl setvbuf(FILE *__stream, char *__buf,
    int __type, size_t __size);
    int _Cdecl sprintf(char *__buffer, const char *__format, ...);
    int _Cdecl sscanf(const char *__buffer,
    const char *__format, ...);
    char *_Cdecl strerror(int __errnum);
    FILE *_Cdecl tmpfile(void);
    char *_Cdecl tmpnam(char *__s);
    int _Cdecl ungetc(int __c, FILE *__stream);
    int _Cdecl vfprintf(FILE *__stream, const char *__format,
    void *__arglist);
    int _Cdecl vfscanf(FILE *__stream, const char *__format,
    void *__arglist);
    int _CType vprintf(const char *__format, void *__arglist);
    int _Cdecl vscanf(const char *__format, void *__arglist);
    int _Cdecl vsprintf(char *__buffer, const char *__format,
    void *__arglist);
    int _Cdecl vsscanf(const char *__buffer, const char *__format,
    void *__arglist);
    int _CType unlink(const char *__path);
    int _Cdecl getc(FILE *__fp);

    int _Cdecl getchar(void);
    int _Cdecl putchar(const int __c);

    int _Cdecl putc(const int __c, FILE *__fp);
    int _Cdecl feof(FILE *__fp);
    int _Cdecl ferror(FILE *__fp);


    #if !__STDC__
    int _Cdecl fcloseall(void);
    FILE *_Cdecl fdopen(int __handle, char *__type);
    int _Cdecl fgetchar(void);
    int _Cdecl flushall(void);
    int _Cdecl fputchar(int __c);
    FILE * _Cdecl _fsopen (const char *__path, const char *__mode,
    int __shflag);
    int _Cdecl getw(FILE *__stream);
    int _Cdecl putw(int __w, FILE *__stream);
    int _Cdecl rmtmp(void);
    char * _Cdecl _strerror(const char *__s);
    char * _Cdecl tempnam(char *__dir, char *__pfx);

    #define fileno(f) ((f)->fd)
    #endif

    int _Cdecl _fgetc(FILE *__stream); /* used by getc() macro */
    int _Cdecl _fputc(char __c, FILE *__stream); /* used by putc() macro */

    #ifdef __cplusplus
    }
    #endif

    /* The following macros provide for common functions */

    #define ferror(f) ((f)->flags & _F_ERR)
    #define feof(f) ((f)->flags & _F_EOF)

    #define getc(f) \
    ((--((f)->level) >= 0) ? (unsigned char)(*(f)->curp++) : \
    _fgetc (f))

    #define putc(c,f) \
    ((++((f)->level) < 0) ? (unsigned char)(*(f)->curp++=(c)) : \
    _fputc ((c),f))

    #define getchar() getc(stdin)
    #define putchar(c) putc((c), stdout)

    #define ungetc(c,f) ungetc((c),f) /* traditionally a macro */

    #endif


    //By_AraGorn



    < Bu mesaj bu kişi tarafından değiştirildi B__Aragorn -- 4 Ekim 2006; 17:37:34 >




  • sorunu tam olarak anlamadim...

    benim yazdigimi mi anlamadin?

    1. kendine yeni bir header dosya ac.... ismi dosya.h olsun... bu dosyaya sistemdeki butun header dosyalarini koy..
    #include <sistem_dosyasi1.h>
    #include <sistem_dosyasi2.h>
    ...//butun dosyalari yazarsin..

    2. kendi programinda da sadece dosya.h eklemen yeterli olacaktir.
    #include <dosya.h>

    bu arada < > ve " " arasindaki farki da anlayip buna da dikkat etmelisin. " " kaynak kodu ile ayni klasor demek, ama burada ozellikle klasorun konumunu da belirtebilirsin, ornegin "C:\header.h" gibi. < > ise sistem dosyalari demek. kendi yazdigin dosyayi da bir sekilde sisteme ekleyerek programlarinda < > kullanabilirsin.

    #define, #ifndef #ifdef, #else, #endif, vs, bunlar makro komutlari oluyor. bunlari kullanarak header dosyalarini kontrol edebilirsin.

    #include <stdio.h> ve printf() ile ornek verelim. printf() kullanmadan once, derleyicinin boyle bir fonksiyonun varligindan haberdar olmasi gerekiyor. Derleyiciyi de #include <stdio.h> ile bu fonksiyonlarin varligindan haberdar ediyoruz. Header dosyalari sadece fonksiyon prototiplerini tutar, fonksiyonlarin kendileri baska yerdedir bunlari bulmak da linker'in gorevi. linker nasil calisiyor diye bana sorma, bir sekilde calisiyor iste. sistem lib ve dll dosyalarinin nerde oldugunu linker biliyor ve oradan o fonksiyonlari kendisi buluyor. Ayni sekilde kendin lib yada dll yazdiysan bunlarin bulundugu yeri de linker'a bildirmek zorundasin.

    makrolara geri donelim...

    diyelim ki projende birden fazla kaynak kodu ve header var, kaynak kodlari da birbiri ile bagli olsun. Bir dosyada fonksiyon, digerinde de bu fonksiyonu kullanan baska bir fonksiyon. Yani bir dosyada yazdigin fonksiyonun varligini #include <header> ile diger kaynak dosyalarina bildireceksin. Ama bir fonksiyonu bir peojede birden fazla dosyada cagiriyorsan, ve dolayisiyla prototipin bulundugu header dosyasini da projede birden fazla kere #include yapiyorsan sistemin kafasi karisacak. Buradaki problem fonksiyon prototipinin projede bir kereden fazla bildirilmesi oluyor. Her ne kadar bu prototipler ayni olsa da derleyici bunu kabul etmeyecek.

    Bu riski ortadan kaldirmak icin de #ifndef komutu makrolari kontrol etmek icin kullaniliyor. if-not-defined olarak oku bunu. ornek vereyim....

    //benim_header.h
    #ifndef __mantikli_bir_text_yazilacak_buraya__ // if - n - define turkcesi: bu makro tanimlanmis mi daha once?
    #define __mantikli_bir_text_yazilacak_buraya__ // makro tanimla

    // dosyanin normal kismi buraya

    #endif // bitir....

    bu ornekte, preprocessor (bunun turkcesi ne?) __mantikli_bir_text_yazilacak_buraya__ diye bir text (makro) proje ortaminda var mi diye kontrol ediyor yoksa bunu tanimliyor ve dosyanin geri kalanini da projeye ekliyor. Ama makro daha once ortama eklendiyse, ayni dosya ikinciye cagirildiginda preprocessor makronun varligindan haberdar oldugundan ayni kaynak kodu eklenmiyor.



    < Bu mesaj bu kişi tarafından değiştirildi Ali_7 -- 4 Ekim 2006; 18:22:39 >




  • Ben yazarken mesaj gondermissin, benim cevabim onceki mesajin icindi....

    stdio.h dosyasi #ifndef ile basliyor, yani bu dosya makrolar ile korunmus, o yuzden istedigin kadar cagir sistem hatasi olusmaz.. bu dosya __STDIO_H diye bir makro ekliyor senin calisma ortamina..

    gerisini #ifdef ve #define anladiktan sonra kendin de anlayabilirsin...

    bu arada su asagidaki ornegi yaptiniz mi daha once?

    #define PI 3.14 // pi icin deger belirle
    ....

    main() {
    ....
    cember_alani=PI*r*r; // PI'nin ne oldugunu derleyici biliyor...
    .....
    }


    #define sık kullanılan degiskenleri sistem seviyesinde tanimlamak icin de kullanilir.
  • quote:

    Orjinalden alıntı: B__Aragorn

    Arkadaslar c programlama tek tek butun header dosyalarini tanimlamak yerine bi header dosya ya butun header dosyalarini tanimlasak ve her programda bu header dosyayi kullanmak istiyorum...

    header dosya kodlama hakkinda her türlü yardim please


    //By_AraGorn


    Bu söylediğin şey zaten düşünülmüş ve yapılmış bir şey. Hangi ortamı kullanıyosun bilmiyorum ama Visual Studio 2005'te zaten program başına eklenen tek bir header var. Diğer gerekli olanların hepsi o header'ın içine eklenmiş+sen de istediklerini ekleyebilirsin. Bence söylediğin şey kesinlikle mantıksız veya gereksiz değil. Özellikle bunların sayısı arttıkça daha düzgün bir kaynak kod görünümün olur




  • Yapay Zeka’dan İlgili Konular
    php database veri eklemede hata
    geçen yıl açıldı
    Daha Fazla Göster
  • dostum biraz kaba olcak kusura bakma ama sen C programcılıgının içine ...yorsun denir kısaca limon sıkayorsun denir.

    neden diyecek c nin temel programcılık yapısı içinde bellegi optimal kullanmak diye bişi vardır yani gereksiz hiç bir sey bellege yüklenmez programda

    sen bu dosyaları birlestirerek 2 sayıyı ble toplayacak olsan binlerce hgreksiz kodu bellege yüklemiş olcaksın ve buda bilgisayrın sacmalamasına yaptıgın .exe dosyalarının calısması için dakikalarca beklemeye yol acar ve buda cok can sıkıcı olur
    nu yüzden c nin temel yapısında gereksiz dosyaları yüklememk vardır böylece bellegi optimal kullanıorsın

    kusura bakma ama böyle bir seyi düsünecegine adam akıllı biraz programa kafayı yorsan daha iyi olur senin için ve bütün c programcıları için milleti yanlıs seylere sevk etmeyelim

    kusura bakma ve yanlıs anlama sakın
    hadi kolay gelsin
  • quote:

    Orjinalden alıntı: astral32

    dostum biraz kaba olcak kusura bakma ama sen C programcılıgının içine ...yorsun denir kısaca limon sıkayorsun denir.

    neden diyecek c nin temel programcılık yapısı içinde bellegi optimal kullanmak diye bişi vardır yani gereksiz hiç bir sey bellege yüklenmez programda

    sen bu dosyaları birlestirerek 2 sayıyı ble toplayacak olsan binlerce hgreksiz kodu bellege yüklemiş olcaksın ve buda bilgisayrın sacmalamasına yaptıgın .exe dosyalarının calısması için dakikalarca beklemeye yol acar ve buda cok can sıkıcı olur
    nu yüzden c nin temel yapısında gereksiz dosyaları yüklememk vardır böylece bellegi optimal kullanıorsın

    kusura bakma ama böyle bir seyi düsünecegine adam akıllı biraz programa kafayı yorsan daha iyi olur senin için ve bütün c programcıları için milleti yanlıs seylere sevk etmeyelim

    kusura bakma ve yanlıs anlama sakın
    hadi kolay gelsin


    Haklısın tabii ki. Eğer arkadaş bu tip bir şey ima ederek konuyu açtıysa gerçekten gereksiz bir şey gerçekleştirmiş olur. Ama ben daha ziyade, programda zaten kullanmakta olduğu header'ları daha düzenli bir şekilde organize etmek istediği gibi bi izlenime kapıldım. Umarım doğru anlamışımdır:)




  • quote:


    neden diyecek c nin temel programcılık yapısı içinde bellegi optimal kullanmak diye bişi vardır yani gereksiz hiç bir sey bellege yüklenmez programda


    gereksiz header include etmek, bellek optimizasyonunu etkilemez.. sadece derleme suresini biraz uzatir, adi ustunde, preprocessor dosyalari bunlar. Derleyiciye fonksiyonlarin varligini haberdar etmek icin kullaniliyor bunlar.

    sonucta linker sadece gerekli fonksiyonlari alacak ve executable yapacak. linker header dosyalarini eklemez ki??
  • Ali_7 dostum sadece söyle birsey söylemek istiyorum

    Eger böyle bir sey mümkün olup senin dediğin gibi mükemmel calıssaydı sanırım şimdiye kadar bunu dili yaratanlar bunu coktan yapmıs olurlardı
    degil mi?
  • quote:

    Eger böyle bir sey mümkün olup senin dediğin gibi mükemmel calıssaydı sanırım şimdiye kadar bunu dili yaratanlar bunu coktan yapmıs olurlardı
    degil mi?


    Merak ettim. 2 tane Hello world programi yazdim.. birincisi normal stdio.h ile, ikincisi gereksiz 10 tane header ile.. ve sonucu tahmin et, exe dosyasi her iki durumda da ayni, yani linker header dosyalarini eklemedi... Demek ki derleyici gercekten de akilli, ve bu programi yazanlar preprocessing, processing, linking olarak 3 farkli adimlari kullaniyorlar. Hatta ben soyledim diye degil, 1970lerde boyle dizayn ettiler ve bizlere de boyle ogrettiler....

    Derleme suresini de olctum, yukarida da dedigim gibi, derleme suresi %30 daha uzun surdu. Bunun sebebi de, derleyici gereksiz dosyalari calisma ortamina ekledi, ve onlarin hepsine bakti. Ama baktiktan sonra bunlarin kapadi.

    Benim soyledigimde nerede hata var ben anlamadim... biraz daha aciklayabilirsen sevinirim...

    Ben arkadasa butun header dosyalarini yuklemesini zaten tavsiye etmiyorum, ama exe dosyasini da etkilemez... gereksiz header dosyalari var diye, exe boyutu etkileniyorsa, derleyici iyi yazilmamis demektir...

    test ortami: Linux

    //dosya
    #include <stdio.h>
    #include <pthread.h>
    #include <math.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stddef.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <sys/socket.h>
    #include <time.h>

    int main() {

    printf("hello world\n");
    return 0;
    }

    test 1) 10 tane header:

    exe boyutu: 6.6kb
    derlene suresi: 250-300 ms arasi (6 derleme sonrasi)

    test 2) sadece stdio.h ile

    exe: 6.6kb
    derleme suresi: 160-200 ms arasi (6 derleme)

    Ekleme: GNU GCC ile derlendi... derleme suresi shell'den time ile olculdu...



    < Bu mesaj bu kişi tarafından değiştirildi Ali_7 -- 24 Ekim 2006; 1:33:31 >




  • dostum sanırım burada demek istediğin programda kullanılan fonksiyon hangi baslık dosyası içerisinde ise amac kod üretilirken derleyici sadece bu baslık dosyasını yüklüyor digerlerini ise işleme katmıyor diyorsun.

    yanlıs anladıysam kusura bakma

    böyle olunca dogru söylüyosun fakat butun baslık dosyalarını tek bir kütüphane içerisine atarsan derleyici bu tek baslık dosyasını es gecemeyecek her defasında programama aktaracaktır.Cünkü hangi fonksiyonu kullanırsan kullan bu tek baslık dosyası içerisinde olacaktır.
    Bu aradada derleme için tek baslık dosyasının belirtilmesi gerekiyor ve buda yeni bir derleyici yazılması gibi bir problem ortaya cıkarıyor

    Fakat senin yazdıgın programda es gecmesi normal cünkü printf fonksiyonu stdio.h içerisinde digerlerini eklememesi normal geliyo bana.


    sunuda belirtiyim su forumda c den anlayan ve takdir ettiğim 3-5 kişiden birisin
    kolay gelsin




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.