fonksiyon gösterici dizileri hakkında. "artık anladım"

Başlatan omereliusuk, 19 Eylül 2012, 00:57:09

omereliusuk

void func0(int,int);
void func1(int,int);
void func2(int,int);

void main() 
{
lcd_hazirla();
imlec(1,1);      printf(lcd_putc,"deneme");delay_ms(1000);lcd_komut(1);
void (*fp[3])(int,int)={func0,func1,func2};
	while(TRUE)
	{
		//TODO: User Code

      (*fp[0])(1,1);
      (*fp[1])(2,2);
	}
}

void func0(int arg,sutun){imlec(sutun,1);printf(lcd_putc,"%d fonk-0-", arg);delay_ms(1000);lcd_komut(1);}
void func1(int arg,sutun){imlec(sutun,8);printf(lcd_putc,"%d fonk-1-", arg);delay_ms(1000);lcd_komut(1);}
void func1(int arg,sutun){imlec(3,sutun);printf(lcd_putc,"%d fonk-2-", arg);delay_ms(1000);lcd_komut(1);}

void (*fp[3])(int,int)={func0,func1,func2};
kitapta yazanı aynen aktardım ama bir türlü çalıştıramadım. kısaca anlamadım.

void func0(int,int);
void func1(int,int);

void main() 
{
lcd_hazirla();
imlec(1,1);      printf(lcd_putc,"deneme");delay_ms(1000);lcd_komut(1);
	while(TRUE)
	{
	void (*fp)(int,int);
		//TODO: User Code
      fp=func0;
      (*fp)(1,1);
      fp=func1;
      (*fp)(2,2);
	}
}

void func0(int arg,sutun){imlec(sutun,1);printf(lcd_putc,"%d fonk-0-", arg);delay_ms(1000);lcd_komut(1);}
void func1(int arg,sutun){imlec(sutun,8);printf(lcd_putc,"%d fonk-1-", arg);delay_ms(1000);lcd_komut(1);}


yalnız bu çalışıyor.

DEV C++ortamında aşağıdaki kodlar çalışıyor. ama ccs c de sorun var diyor....

#include <stdio.h>
#include <stdlib.h>


void func0(int,int);
void func1(int,int);
void func2(int,int);

int main(int argc, char *argv[])
{
//lcd_hazirla();
//imlec(1,1);      printf(lcd_putc,"deneme");delay_ms(1000);lcd_komut(1);
void (*fp[3])(int,int)={func0,func1,func2};
	while(1)
	{
		//TODO: User Code

      (*fp[0])(1,1);(*fp[1])(2,2);(*fp[2])(2,2);
	}
}


void func0(int arg,int sutun){printf("fonk0\n");sutun--;}//imlec(sutun,1);printf(lcd_putc,"%d fonk-0-", arg);delay_ms(1000);lcd_komut(1);}
void func1(int arg,int sutun){printf("         fonk1\n");sutun--;}//imlec(sutun,8);printf(lcd_putc,"%d fonk-1-", arg);delay_ms(1000);lcd_komut(1);}
void func2(int arg,int sutun){printf("                  fonk2\n");sutun--;}//imlec(3,sutun);printf(lcd_putc,"%d fonk-2-", arg);delay_ms(1000);lcd_komut(1);}

Erdem

Sanırım şöyle olacak:

#include <stdio.h>

void func0 (int arg, int sutun)
{
    printf("%d %d", arg, sutun);
}
void func1 (int arg, int sutun){}
void func2 (int arg, int sutun){}

int main()
{
    typedef void (*fp)(int, int);
    fp funcArr[3] = {NULL};

    /*
      typedef kullanmadan bu şekilde de yazabilirdik
    */
    // void (*funcArr2[3])(int, int) = {NULL};

    funcArr[0] = &func0;
    funcArr[1] = &func1;
    funcArr[2] = &func2;

    /* kullanmak için de */
    (*funcArr[0])(12, 5);
}


mesaj birleştirme:: 19 Eylül 2012, 09:44:50

Açıklama kısmına gelirsek:
int birSeylerYap(float a, float b, float c) { printf("Bir seyler yap\n"); return a + b + c;}
int baskaBirSeyYap(float a, float b, float c) { printf("Bir seyler yap\n"); return a - b + c;}

bir şeyler yapan iki tane işlevimiz olsun:
    /* bir işlev göstergesi tanımla ve NULL olarak ilklendir */
    int (*neYapayim)(float, float, float) = NULL;

Burada parametre olarak float, float, float alan ve bir int döndüren bir işlevi gösteren bir işlev göstergesi tanımlıyoruz.
    /* göstergeye göstermesini istediğimiz işlevin adresini atıyoruz */
    neYapayim = birSeylerYap;        // kısa yöntem
    neYapayim = &baskaBirSeyYap;    // adres alma operatörü kullanan doğru yöntem

Sonra işlev göstergemizin bu işlevi göstermesini sağlıyoruz.
#include <stdio.h>

int topla(int a, int b);
int cikar(int a, int b);
int carp(int a, int b);
int bol(int a, int b);

int (*dortIslem[4]) (int a, int b);

int main()
{
  int sonuc;
  int ilk, ikinci, islemNumarasi;

  dortIslem[0] = topla; 
  dortIslem[1] = cikar; 
  dortIslem[2] = carp; 
  dortIslem[3] = bol; 

  printf("Iki sayi giriniz: ");
  scanf("%d %d", &ilk, &ikinci);
  
  printf("0: Topla, 1: Cikar, 2: Carp, 3: Bol\n");
  do {
    printf("Yapmak istediginiz islemi giriniz: ");
    scanf("%d", &islemNumarasi);
  } while (islemNumarasi < 0 || islemNumarasi > 3);

  sonuc = (*dortIslem[islemNumarasi]) (ilk, ikinci);
  printf("%d", sonuc);

  return 0;
}

int topla(int a, int b)
{
  return a + b;
}

int cikar(int a, int b)
{
  return a - b;
}

int carp(int a, int b)
{
  return a * b;
}

int bol(int a, int b)
{
  if (b) 
      return a / b;
  else 
      return 0;
}

Üstteki kullanımda da da 4 tane göstergeden oluşan bir dizimiz var. Bu göstergenin her biri parametre olarak int, int alan ve bir int döndüren bir işlevi gösterebiliyor. Yani işlev göstergesi dizisi olmuş oluyor.

omereliusuk

#include <16F877A.h>
#device adc=16

#FUSES NOWDT                 	//No Watch Dog Timer
#FUSES xt                    	//
#FUSES NOBROWNOUT            	//No brownout reset
#FUSES NOLVP                 	//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=4000000)
#include <lcdd.c>
//#include <stdio.h>
void func0(int,int);
void func1(int,int);
void func2(int,int);
void func3(int,int);
void main()
{
lcd_hazirla();
imlec(1,1);      printf(lcd_putc,"deneme");delay_ms(1000);lcd_komut(1);

typedef void (*fp)(int, int);
fp funcArr[4] = {func0,func1,func2,func3};
	
	while(true)
	{
		//TODO: User Code
int i=0;
for(i=0;i<4;i++)
   {
      (*funcArr[i])(i,(i+1));
     }
}
}

void func0(int arg,s){imlec(s,1);printf(lcd_putc,"%d fonk-0-", arg);}
void func1(int arg,s){imlec(s,1);printf(lcd_putc,"%d fonk-1-", arg);}
void func2(int arg,s){imlec(s,1);printf(lcd_putc,"%d fonk-2-", arg);}
void func3(int arg,s){imlec(s,1);printf(lcd_putc,"%d fonk-3-", arg);delay_ms(1000);lcd_komut(1);}


şimdi çalıştı. Allah yardım edenlerden razı olsun. amaç öğrenmek en azından artık if(){} gibi değerler ile uğraşmayacağım. :))

omereliusuk

bu kodlar ccs v3.41 de çalışır da v5.007 de neden çalışmaz bilgisi olan var mı?

omereliusuk

#4
Void Loop0();Void Loop1();Void Loop2();Void Loop3();Void Loop4();Void Loop5();Void Loop6();
 typedef void (*fp)();  fp funcArr[7] = {Loop0,Loop1,Loop2,Loop3,Loop4,Loop5,Loop6};
for (int tekrar=16;tekrar;tekrar--) (*funcArr[i])();

v5.25 te çalışıyor. yedekte dursun.  :)

Murat Mert

S.A.
Sn. Ömer

switch (i) {

    case 0:
           komut.....
           i++;
           break;

    case 1:
           komut.....
           i++;
           break;

    case 2:
           komut.....
           i++;
           break;


    case 3:
           komut.....
           i=0;
           break;
}


yada

switch (i) {

    case 0:
           komut.....
           break;

    case 1:
           komut.....
           break;

    case 2:
           komut.....
           break;


    case 3:
           komut.....
           break;
}
i++;
if(i>3) i=0;


arasında ne fark var. Hız, ram, vb..

mert07