Tablodan fonksiyon cagirma

Başlatan bunalmis, 19 Mayıs 2011, 02:48:33

z

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?






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

Klein

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.

z

#2
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☻
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Tam olarak bahsettiğim bu değil. Ama fonksiyon pointerinin kullanımına güzel bir örnek olmuş.

CLR

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. 
Knowledge and Experience are Power

Klein

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? 

Klein

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);


Klein

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.