C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

z

#720
Output() adında C fonksiyonu yazacağım.

Parametrelerini de örneğin aşağıdaki gibi göndereceğim.

Output(A0_0, A2_1, C4_0);

Bir başka yerde ise Output(D10_1);

Nekaddar yakışıklı bir şey bu. İlk komut GPIOA da A0 pinini 0,  A2 pinini 1 yaparken GPIOC de C4 pini 0 olmaktadır.

Alttaki satırda ise GPIOD de D10 pini 1 yapılmaktadır.

Şimdi ne gerek var buna diye bana alternatif fikirler sunuyorsunuz. Bana alternatif sunmayın. Yukarıdaki yakışıklı çözümü istiyorum.

Çözümüm varmı var. Bunu B planı olarak saklıyorum. Çünkü derleme işlemine müdahil olmak istemiyorum.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Erol YILMAZ

Alıntı yapılan: z - 27 Aralık 2013, 13:54:04
Output() adında C fonksiyonu yazacağım.
Parametrelerini de örneğin aşağıdaki gibi göndereceğim.
Output(A0_0, A2_1, C4_0);
Bir başka yerde ise Output(D10_1);
Nekaddar yakışıklı bir şey bu.

Function Overloading (Fonksiyon Aşırı Yüklemesi)
C++,birbirinden farklı parametreleri olduğu sürece aynı isimli birden fazla fonksiyonun tanımlamasına izin verir.
Bu yetenek fonksiyon aşırı yüklemesi olarak adlandırılır.

Gökhan BEKEN

Bu aralar düşündüğüm bir konu var, yardımcı olursanız sevinirim.

8 bitlik mikrodenetleyicilerde dinamik bellek yönetimi olmuyor bildiğim kadarıyla.
a) 8 bitliklerde malloc calloc gibi komutlar kullanmak mümkün müdür? Değilse neden böyle bir destek yok.
b) 16 bit ve daha yüksek mcu'larda mümkün mü?
c) Hangi diller desteliyor, hangi diller desteklemiyor?
d) Kendi fonksiyonlarımız ile bunu yapmak ne kadar mümkün, ne kadar sağlıklı?
Özel mesaj okumuyorum, lütfen göndermeyin.

z

8051 de malloc kullanabiliyorsun. İşlemcinin yeterince ramı varsa malloc komutu olmaması için neden yok gibi görünüyor.

http://www.nongnu.org/avr-libc/user-manual/malloc.html

---------------------------------------------------------------------------------

C de aşağıdaki isteğim gerçeklenebilirmi?

                       f1(a,b,c);
                       f2(x);

gibi f1 ve f2 fonksiyonlarım var.

f1 de kaç parametre var, f2 de kaç parametre var diye sorgulayabileceğim herhangi bir komut varmı?

Bakınca f1 de 3, f2 de 1 komut olduğunu görüyoruz. Bunu sorgulamak suretiyle öğrenmek istiyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

picusta

Benim verdigim kod çalismiyor, ama stack ve heap pointer'e bakarak bir çözüm olabilir diye dusundum.
Heap ve stack pointer'i su asagidaki kodda kullaniyorum (AVR) :

Alıntı Yap
int freeRam ()
{
 extern int __heap_start, *__brkval;
 int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}


B Plani ise makro kullanmak ve son parametreye hiç gelmeyecek bir deger vermek  FFFF (-1)
#define Led  LedInt(__VA_ARGS__,-1) 

...
Led(YA_0,SONDUR,1,....)

...

LedInt()
    while (*pI != - 1)
    {
        result += *pI++;
    }

muhittin_kaplan


fatih6761

Alıntı yapılan: picusta - 27 Aralık 2013, 19:36:45
Benim verdigim kod çalismiyor, ama stack ve heap pointer'e bakarak bir çözüm olabilir diye dusundum.
Heap ve stack pointer'i su asagidaki kodda kullaniyorum (AVR) :


B Plani ise makro kullanmak ve son parametreye hiç gelmeyecek bir deger vermek  FFFF (-1)
#define Led  LedInt(__VA_ARGS__,-1) 

...
Led(YA_0,SONDUR,1,....)

...

LedInt()
    while (*pI != - 1)
    {
        result += *pI++;
    }

Hocam optimizasyon aşamasında alt üst olur... O noktada derleyiciye müdahale etmek gerekir ki bu istenmeyen durum.

z

void f2()
{
       .....;
}


void f1()
{
       f2();
}

void main()
{
        f1(); 
        f2();
}



f2 fonksiyonu kendisini cagiran fonksiyonun adresini bilmek istiyor?

Dikkat!!! Hangi adresden cagrildigi sorulmuyor, hangi fonksiyondan cagrildigini dolayisi ile bu fonksiyonun baslangic adresi isteniyor?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Icarus

1. Seçenek
backtrace_symbols() = Stack trace yapar, kimler çağırmış adı ne ?

2. Seçenek
__builtin_return_address + addr2line aracı = Size çağıran fonskiyonun adı, dosyası ve satırını verir. Map File'dan bakarsınız çağıranın adresi neymiş.

3. Seçenek
Kendiniz Map file'i parse edersiniz.

Gökhan BEKEN

Alıntı yapılan: z - 27 Aralık 2013, 17:40:24
8051 de malloc kullanabiliyorsun. İşlemcinin yeterince ramı varsa malloc komutu olmaması için neden yok gibi görünüyor.
hi-tech c, c18 ve xc8 derleyicileri için araştırdım desteklemiyor, ancak desteklenemeyen şey ne? Anlamadım ki.
Alanın az veya çok olması o kadar önemli değil diye düşünüyorum.
Ben bellekten alan ayıracağım, eğer bellekte yer kalmamışsa zaten malloc, 0(sıfır) dönderir. Bunu yazılımla kontrol etmekteyiz zaten.

Özel mesaj okumuyorum, lütfen göndermeyin.

z

#730
Bir kutuphane'yi projeye dahil edip, kutuphaneden sadece bir dosyayi cagiran kucuk bir program yazip derledigimizde, elde edilen hex dosyada sadece cagrilan fonksiyon mu olur yoksa tum kutuphane mi?

Eger tum kutuphane projeye dahil oluyorsa nerede hata yapiyor olabilirim?



mesaj birleştirme:: 03 Ocak 2014, 21:15:32

Alıntı yapılan: meftun - 31 Aralık 2013, 16:06:03
hi-tech c, c18 ve xc8 derleyicileri için araştırdım desteklemiyor, ancak desteklenemeyen şey ne? Anlamadım ki.
Alanın az veya çok olması o kadar önemli değil diye düşünüyorum.
Ben bellekten alan ayıracağım, eğer bellekte yer kalmamışsa zaten malloc, 0(sıfır) dönderir. Bunu yazılımla kontrol etmekteyiz zaten.

Sonucu 0 (basarisiz) donecegi kesin olan fonksiyon neden yazilsin ki?

Adi ustunde memory allocate, ram dan yer ayirmak anlamina geliyor. Ram alani az islemcilerde ram ancak degiskenlere ve stack'a yetecegi varsayiliyorsa malloc komutu hazirlamak anlamsiz olur.

Atiyorum 256 byte dan daha az rami olan islemciler icin malloc cok da sart değil.

Eger ramda bir miktar yer kalmissa o kisma bir char array yerlestirip pointerler sayesinde o kismi genel amacli kullanabilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

JKramer

Linker ayarlarına bakabilirsiniz.

ercan_t

merhaba;

aşağıdaki kodda Done şartında döngüden nasıl çıkarım? while- break işe yaramıyor :)
goto-label ve ekstra değişken kullanmadan

while(1)
{
    switch(mesaj-Stat)
   {
      case Status:
       //..
      //..
      break;
      case Done:
     //..
    //..
       break
   }

/...
/..
}

Tagli

#733
Çıkamazsın. Ben olsam bayrak kullanırdım.

Burada yazdığına göre C++11'de başka bir yol daha varmış.
Gökçe Tağlıoğlu

leblebitozu

@ercan_t

While döngüsü bir fonksiyonun içinde ise return ile çıkabilirsin.