Structure icinde fonksiyon Tanımı

Başlatan M_B, 14 Eylül 2016, 12:41:36

M_B


typedef struct MenuStructure
{ 
 unsigned char *text;
 unsigned char num_menupoints;
 unsigned char up;
 unsigned char down;
 unsigned char enter;
 void(*fp) (void);
} MenuEntry;

unsigned char menu_000[]= "[MAIN MENU]";   //0
unsigned char menu_001[]= "Option 1";      //1
unsigned char menu_002[]= "Option 2";      //2
unsigned char menu_003[]= "Option 3";      //3
unsigned char menu_004[]= "START";         //4
unsigned char menu_100[]= "[SUB MENU]";    //5
unsigned char menu_101[]= "SubOption 1";   //6
unsigned char menu_102[]= "return";        //7


//MenuEntry
MenuEntry Manu[]={
              {menu_000,5,0,0,0,0},
              {menu_001,5,1,2,5,0},
              {menu_002,5,1,3,2,0},
              {menu_003,5,2,4,3,0},
              {menu_004,5,3,4,4,0},
              {menu_100,3,0,0,0,0},
              {menu_101,3,6,7,6,0},
              {menu_102,3,6,7,7,0}
          };

Nette menu yapımıyla ilgili buldugum bir ornek .
burda anlayamadığım. yapi icerisinde tanımlı olan void(*fp) (void);
bu fonksiyon kullanımı nasıl oluyor.
Veya kısaca yapı icerisinde boyle bir fonksiyon tanımlamakla ne elde ediyoruz veya nasıl kullanıyoruz.
Bunu bir ornekle acıklayabilirmiyiz.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

quarko

fp aslında bir function pointer oluyor. fp ye "void xxx (void)" prototipinde bir fonksiyonun adresini verdiğinizde ve "fp()" diye çağırdığınızda ilgili fonksiyon çağrılır. Ben menülerimde ihtiyaç olursa fonksiyon işaretçisi türünden dizi tanımlayıp ilgili fonksiyonu indeksleyip çağırıyorum. Gayet kullanışlı ve kolay oluyor.
"Vicdanın ziyası ulum-u diniyedir. Aklın nuru fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder."

M_B

@gerbay Hocam acıklama icin teşekkürler.
GLCD ekran icin menu üzerine calısıyorum. Doğru yoldamıyım  ?
Menu olusturmak için daha başka ne tur yontemler vardır. Veya onerebileçeğiniz bir modul/sistem varmıdır.


Not:
GLCD KS0108 128x64
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

berkay_91

#3
#define F_CPU 1000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "ks0108.h"
#include "times_new_romen_10_B.h"
#include "arial_10.h"

void menu_isimleri_init();

volatile int satir=11,j=0;

struct menuler{
	
	char *menu_isimi;
	
} menu[5];

void menu_isimleri_init(){

	menu[0].menu_isimi="Sony";
	menu[1].menu_isimi="Samsung";
	menu[2].menu_isimi="Panasonic";
	menu[3].menu_isimi="Nokia";
	menu[4].menu_isimi="LG";
	
}


int main(void) {
	
	int y=12;
	
	_delay_ms(10);
	
	ks0108Init(0);
	
	menu_isimleri_init();
	
	ks0108SelectFont(times_new_romen_10_B, ks0108ReadFontData, BLACK); // Select a font
	
	ks0108GotoXY(38,0);
	ks0108Puts("AYARLAR");
	
	ks0108SelectFont(arial_10, ks0108ReadFontData, BLACK); // Select a font
	
	for(int i=0; i<5; i++){
		
		ks0108GotoXY(1,y);
		ks0108Puts(menu[i].menu_isimi);  
		
		y+=10;
		
	}
	
	
	while(1);
	
	return 0;		
	
}


programı Atmel için yazdım, istediğin stringi basmak için sadece menu.menu_isimi deki i değişkeniyle oynaman yeterli olacak

M_B

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet