Printf ile ilgili ornek

Başlatan mcan, 24 Kasım 2011, 19:06:02

mcan

Merhaba,
printf keilde nasil kullanicaz?
Func(char x) gibi bir fonksiyonumuz olsun bunu
printf(func,"abc")   olarak kullanmak istiyorum ancak
Alıntı Yapclean-main.c(74): error:  #167: argument of type "void (*)(char)" is incompatible with parameter of type "const char *restrict"
seklinde hata aliyorum. Restrict nedir? Bu tip tanimini bulamadim.

MC_Skywalker

restrict manası kısıtlmak demek. bir veri tip vb. değil.

kodun şu parçacığında sıkıntı var
printf(func,"abc")

mcan

Alıntı yapılan: MC_Skywalker - 24 Kasım 2011, 19:19:35
restrict manası kısıtlmak demek. bir veri tip vb. değil.

kodun şu parçacığında sıkıntı var
printf(func,"abc")

Alıntı Yapextern _ARMABI int printf(const char * __restrict /*format*/, ...) __attribute__((__nonnull__(1)));
printf ile ilgili bu kisimda __restrict nedir?  Anlami kisitlamak evet ama hata kodunda restrict kelime anlami olarak kullanilmamis , derleyicinin bir ozelligi ancak ne onu tam anlayamadim.Verilen ornegide anlamadim,elinde acik ornegi olup kisaca anlatabilecek biri varsa super olur, bu arada bende netten arastirmaktayim.

mcan

#3
Alıntı yapılan: gerbay - 24 Kasım 2011, 20:38:08
siz restrict e takmayın, parametre tipi olarak beklediği parametreyi vermediğiniz için hata veriyor..

fonksiyonun prototip tanımında ilk parametre olarak "const char *"  tipinde bir parametre bekliyorken sizin verdiğiniz parametre bir fonksiyon ve tipi de "void (*)(char)" tipinde ..   keil da olay o şekilde olmuyor..

prototipe bakarak  Kodu printf("abc"); burada const char* "abc" oluyor,bu sekilde yazdim sorunsuz derledi, ancak a b c karakterlerini nereye hangi alana gonderdi? bunu nerede belirliyoruz?Keilde nasil oluyor?

ErsinErce

Alıntı yapılan: mcan - 24 Kasım 2011, 19:06:02
Func(char x) gibi bir fonksiyonumuz olsun bunu
printf(func,"abc")   olarak kullanmak istiyorum ancakseklinde hata aliyorum. Restrict nedir? Bu tip tanimini bulamadim.

ilk olarak Func fonksiyonu tek char alırken siz bir dizi göndermeye çalışıyorsunuz,
ikincisi CCS deki gibi printf içine gönderilecek fonksiyon yazılamıyor bunun yasak olduğunu söylüyor keil, belki sprintf ile yapılabilir denemek lazım.

mcan

Alıntı yapılan: gerbay - 24 Kasım 2011, 21:13:45
şurayı inceleyebilirsiniz;

http://www.keil.com/support/man/docs/gsac/gsac_retargetcortex.htm

scanf fonksiyonunu da kullanabilmek istiyorsanız "int getkey   (void);"  tipinde bir fonksiyon daha yazmanız lazım

Çözümünüz çalışıyor, çok teşekkür ederim. Şimdi fputc yi stdio nun içinde
Alıntı Yapextern _ARMABI int fputc(int /*c*/, FILE * /*stream*/) __attribute__((__nonnull__(2)));
Şeklinde tanımlamış. Aynı şekilde printf yi de bu şekilde tanımlamış
Alıntı Yapextern _ARMABI int printf(const char * __restrict /*format*/, ...) __attribute__((__nonnull__(1)));
Peki printf nin fputc yi çağıracağı nerede belirtilmiş?

mcan

#6
Alıntı yapılan: gerbay - 24 Kasım 2011, 21:47:07
printf in içinden standart "fputc" metodunu çağırıyor.. eğer siz kendi kodunuzda bir fputc metodu yazmamışsanız standart kütüphaneden gelen fputc metodu ile linkliyor ve o metodu çağırıyor. sizin kendi projenize dahil ettiğiniz kod dosyalarınızda standart kütüphane de de olan bir fonksiyonu yeniden yazmışsanız önce link edilen sizin yazdığınız metoda bağlanıyor çağrılar..

yani sizin kodda bir "fputc" metodu var, kütüphane dosyalarında da bir "fputc" metodu var. link edilirken sizin projenizdeki fputc metodu ile link ediliyor, standart library de ki "fputc" boşa çıkıyor..
Okuyorum ancak anlayamiyorum , verdiginiz linkdeki yazidan ve buradaki aciklamanizdan kendi fonksiyounumuzu olustiuracagimizi anladim.Ancak yine anlamadigim nokta neden printf fputc yi kullaniyor? Yani printf nin fputc yi cagirdigi kisim nerede?
En basit olarak özet olarak anlatmak istersem :

Printf(){ fputc();}

gibi bir tanımlama nerede yapılmış?

Bir sorum daha var stdio dosyasında
Alıntı Yaptypedef struct __FILE FILE;
extern FILE __stdin, __stdout, __stderr;
olarak yazılmış, biz
Alıntı Yapstruct __FILE{
   char c;
};
şeklinde bir struct oluşturduğumuz zaman zaten __stdin, __stdout, __stderr bunların tipini tanımlamış olmuyormuyuz ?

Aynen yazdığınız gibi
Alıntı YapFILE __stdout; // linker hatasi vermemesi icin gerekli
FILE __stdin;
FILE __stderr;
başka bir yerde şeklinde tanımlamayınca derleme esnasında hata almasamda program istediğim gibi çalışmıyor.

Sizin yazdığınız şekilde yazarsam çalışıyor.

mcan

Alıntı yapılan: gerbay - 24 Kasım 2011, 22:23:08
tanımında gördüğünüz gibi standart input, standart output ve standart error için tanımlanan FILE stream ler "extern" tanımlı, yani stdio yu include eden dosyalar derlerken hata vermesin diye.. derleme işlemi ile link işlemi farklı şeyler. bunlar kullanılıyor ise bir C dosyasında da örnekleri oluşturulmalı.. o örnekler bizim yazdığımız örnekler, isterseniz o file struct tanımını genişletebilir farklı file lar tanımlayıp farklı farklı device lara fputc içinden kontrol ederek karakter gönderebiliriz "fprintf" metodunda file stream belirterek..

"printf" in kodu keil tarafından yazılmış ve kaynak kod vermeden sadece statik kütüphane olarak derlenmiş hali keil ile birlikte geliyor ve eğer siz projenizi standart library ile link ediyorsanız (ki default olarak ediyor zaten) o durumda sizin kodunuz derlendiğinde oluşan object file ile keil ın kütüphaneleri link edilip bağlanıyor..
Şimdi anlayabildim,neyse ki olay çözüldü ve ilk örneğimi
https://www.picproje.org/index.php/topic,36356.new.html#new konu başlığı altına koydum, tekrar teşekkür ederim