Skocz do zawartości

Rzutowanie - jak to zrobić "fachowo" :)


Pomocna odpowiedź

Temat związany z biblioteką menu ale założyłem osobny bo wiem że "gryzie" początkujących kolegów. Do rzeczy, mam funkcję która na podstawie podanych wartości węzła i id ma zwrócić wskaźnik do zmiennej która ma akurat być wyświetlona: proszę nie zwracać uwagi na stałe przypisania do iteratorów 'i' i 'j' to w tej chwili niema znaczenia.

xx_t * get_props(nodeType_t n,idType_t id)
{
	for(uint8_t i = 0; i < 2 ; i++ ){
		if(props[i].nod == n){ // spr czy wezel na liscie

			for(uint8_t j = 0; j<2;j++){
				if(props[i].val[j].id == id)return(xx_t*)&props[i].val[j]; // spr id i zwrot wskaznikka

			}
		}
	}
	return NULL; // jesli niema 
}

tutaj struktury na których operuje ww funkcja:

typedef enum{char_t,uint8t,uint16t,uint32t,int8t,int16t,int32t,rtc_timetypedef,rtc_datetypedef}retTypeEnum;

typedef struct{
	idType_t id;
	void * propVal;
	retTypeEnum retType;
}xx_t;

typedef struct{
	nodeType_t 	 nod;
	xx_t	*	 val;

}menu_properites_t;

uzupełnione:

xx_t nodeTime[] =
{
		{.id = ZEGAR,.propVal = (RTC_TimeTypeDef*)&time,.retType = rtc_timetypedef},
		{.id = DATA,.propVal =  (RTC_DateTypeDef*)&date,.retType = rtc_datetypedef}
};

xx_t nodeLcd[] =
{
		{.id = LCD_JASNOSC,.propVal = (uint8_t*)&j,.retType = uint8t},
		{.id = LCD_KONTRAST,.propVal = (uint8_t*)&b,.retType = uint8t}
};



menu_properites_t props[] = {

		{.nod = 2,.val = nodeTime},
		{.nod = 3,.val = nodeLcd}
};

I teraz to, o co chcę zapytać: 

Jak widać powołałem do życia typ enum który określa na jaki typ ma być rzutowana zwracana zmienna, w programie wygląda to tak:

if(NULL != get_props(node, id)){

	p->flocate(0,5);
	xx_t * mp = get_props(node, id);

if(mp->retType == uint8t)
{
uint8_t * xa =(uint8_t*)mp->propVal;
p->fint(*xa); // wyswitl
}

if(mp->retType == rtc_timetypedef)
{
	
}

Kod działa tak że kiedy po odpytaniu za pomocą get_props wynik jest różny od null, mogę wyświetlić zawartość zmiennej spod zwracanego wskaźnika. Warunkiem poprawnego wyświetlenia tej zmiennej jest poprawne rzutowanie na nią. Jak widać w zwracanej wartości jest informacja o tym w jaki sposób program ma ją traktować(enum). No i pytanko do fachowców, jak postrzegacie taki zapis? Czy można to jakoś inaczej, lepiej zapisać? A może przykład jest przekombinowany? Proszę pamiętać że pytanie dotyczy języka C, na C++ kompletnie się nie znam. Liczę że pytanie jest zrozumiałe 🙂

Edytowano przez _LM_
Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.