Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: z - 19 Mayıs 2011, 02:48:33

Başlık: Tablodan fonksiyon cagirma
Gönderen: z - 19 Mayıs 2011, 02:48:33
unsigned int Cmd;

        if (Cmd==0x0001) Fonk1();
else if (Cmd==0x0002) Fonk2();
else if (Cmd==0x0003) Fonk2();
..........
..........
else if (Cmd==0xFFFF) FonkFFFF();

Gibi bir kodlama son derece yavas calisir. Bunu Switch Case yapmanin da hiz acisindan getirisi olmaz.

Bunun yerine

const unsigned int CallTable[65535]=[&Fnk1(),&Fnk2(),&Fnk3(),&Fnk4(), ...........&Fnk65535()]

               Call[Cmd]

tarzinda bir komut lazim.

Istedigim tarz komut varsa ornek bir kullanimi yazabilirmisiniz?






Başlık: Ynt: Tablodan fonksiyon cagirma
Gönderen: Klein - 19 Mayıs 2011, 03:00:02
Fonksiyonların hepsinin  parametre tipleri , parametre sayıları ve geri dönüş tipleri aynı ise fonksiyon pointerleri kullanılabilir.  ama farklı tip fonksiyonlar için bildiğim bir yol yok.
Başlık: Ynt: Tablodan fonksiyon cagirma
Gönderen: z - 19 Mayıs 2011, 03:18:09
Tesekkurler,  tam aradigim gibi.

void (*pf[])(void) = {fna, fnb, fnc, ..., fnz};

void test(const INT jump_index)
{
    /* Call the function specified by jump_index */
    pf[jump_index]();
}


Yada

void test(uint8_t const jump_index)
{
    static void (*pf[])(void) = {fna, fnb, fnc, ..., fnz};

    if (jump_index < sizeof(pf) / sizeof(*pf))
    {
        /* Call the function specified by jump_index */
        pf[jump_index]();
    }
}


☻B☻
Başlık: Ynt: Tablodan fonksiyon cagirma
Gönderen: Klein - 19 Mayıs 2011, 04:12:36
Tam olarak bahsettiğim bu değil. Ama fonksiyon pointerinin kullanımına güzel bir örnek olmuş.
Başlık: Ynt: Tablodan fonksiyon cagirma
Gönderen: CLR - 19 Mayıs 2011, 08:49:19
Alıntı yapılan: Klein - 19 Mayıs 2011, 03:00:02
Fonksiyonların hepsinin  parametre tipleri , parametre sayıları ve geri dönüş tipleri aynı ise fonksiyon pointerleri kullanılabilir.  ama farklı tip fonksiyonlar için bildiğim bir yol yok.

Evet, C'de böyle bişey yok, parametresi değişen ve/veya geridönüşü değişen tüm fonksiyonlar için ayrı ayrı fonksiyon pointer tanımlamalısın. 
Başlık: Ynt: Tablodan fonksiyon cagirma
Gönderen: Klein - 19 Mayıs 2011, 13:07:10
Tabiki iş görür. Sadece ilk soruda beklenen pratik kullanımı sağlamaz o kadar.

Hazır bir başlık açılmışken yeni başlık açmadan bir soru sorayım bu arada.

bir diziye işaret eden pointerin işaret ettiği dizinin boyunu nasıl öğrenirim? 
Başlık: Ynt: Tablodan fonksiyon cagirma
Gönderen: Klein - 19 Mayıs 2011, 13:44:49
Bir süredir çözüm arıyorum. Ama saydırmaktan başka çözüm bulamadım.  Aray boyu uzun olunca saymak ciddi zaman alıyor. Yukarıdaki  şekilde işimi görmüyor. Orada array belli , pointer boyu belli. Toplam uzunluğu pointer boyuna bölünce sonuç ortada. Bende durum biraz daha farklı.  sizeof operatörünü farlı şekillerde denedim , her seferinde muhakkak pointer uzunuğunu veriyor. 

Benim kullanımım şu şekilde;
örneğin:

char x[1024];
char y[512];
char z[255];

void operasyon ( char *buf){
.
.
.
.
}

operasyon(x);
veya
operasyon(y);
veya
operasyon(z);


Başlık: Ynt: Tablodan fonksiyon cagirma
Gönderen: Klein - 19 Mayıs 2011, 19:05:36
Yok sonu belli değil.  elimdeki bilgi sadece adres. Zaten  sorunum da tablonun  sonunu bilmemek.  pointere bakarak tablo sonunu verecek bir yol bulsam , gerisi kolay.  Tabloyu dinamik oluşturup sonuna NULL koyarım. Ama NULL olduğu adresi saymadan bilebilecek bir yöntem bulamadım.