Menu switch + if

0

Witam kolegów,
Piszę program, który będzie zawierał w swojej strukturze pewnego rodzaju menu. Struktura części kodu odpowiedzialna za to przedstawia się mniej więcej w następujący sposób:

 
void d (void)
{
     if(a == 0)
     {
          switch (b)
          { 
            case 0 :
            instrukcje
            break;
    
            case 1 :
            instrukcje
            c = 1;
            break;
          }
            if(c== 1)
            {
               return 0;
            }
     }
}

Sam szkielet mam nadzieje jest jasny, a idea działania samego menu jest następująca: wywołaj podprogram d, sprawdź warunek a. Jeśli a == 0, wejdź do dalszej częsci podprogramu. Jeśli wybrano przypadek gdy case b == 1, przerwij działanie podprogramu d i wróć do main.
No niestety - jak można sie domyślić - program nie chce wyjść z f-cji switch (nie potrafi powrócić do main). Próbowałem zrobić to za pomocą warunku if (c==0), ale niestety... Jakieś sugestie ?
Pozdrawiam.

0

Zmieniłem void na int. Dalej nic.... chce po prostu wiedzieć w jaki sposób mogę wrócić do pętli głównej bez użycia w przedstawionym podprogramie komendy main();

0

Jakieś pomysły ?

0

switch to nie funkcja.

return w d wraca do miejsca wywołania d w menu i będzie kontynuować od tego momentu, więc jeśli chcesz zacząć menu od nowa to polecam użycie pętli.

0

Podaj kod, lub spytaj na forum wróżbitów.

0

Sam podprogram wygląda tak:

void PROBE(void)
{
	short int p_choice_1 = 0;
	short int p_choice_2 = 0;
	flags.de_p_2 = RESET;
	flags.de_p_1 = SET;

	do
	{
		if(flags.de_m_2 == RESET)
		{
			switch(p_choice_1)
			{
			 	 case 0 :
			 		 while(flags.de_p_2 == RESET)
			 		 {
							LCD_Clear();
							LCD_GoTo(0,4);
							LCD_SendText("Aaaa1");
							flags.de_p_2 = SET;
			 		 }
			 		 break;
			 		 
			 	 case 1 :
			 		 while(flags.de_p_2 == RESET)
			 		 {
							LCD_Clear();
							LCD_GoTo(0,4);
							LCD_SendText("Aaaa2");
							flags.de_p_2 = SET;
			 		 }
			 		 break;
			 		 
			 	 case 2 :
			 		 while(flags.de_p_2 == RESET)
			 		 {
							LCD_Clear();
							LCD_GoTo(0,4);
							LCD_SendText("Powrot");
							flags.de_p_2 = SET;
			 		 }
			 		 if(GPIO_ReadInputDataBit(GPIOC, PANEL_OK) == 0)
			 		 {
			 			 for(del=0; del<10000ul; del++);
			 			 flags.de_p_1 = SET;
			 			 return 0;
			 		 }
			 		 
			 		 if(GPIO_ReadInputDataBit(GPIOC, PANEL_NEXT) == 0)
			 		 {
			 			 for(del=0; del<10000ul; del++);
			 			 p_choice_1 = 0;
			 		 }
			 		 break;
			}
		}

		if(flags.de_m_2 == SET)
		{
			switch(p_choice_2)
			{
				case 0 :
			 		 while(flags.de_p_2 == RESET)
			 		 {
							LCD_Clear();
							LCD_GoTo(0,4);
							LCD_SendText("Bbbbb1");
							flags.de_p_2 = SET;
			 		 }
			 		 break;
			 		 
				case 1 :
			 		 while(flags.de_p_2 == RESET)
			 		 {
							LCD_Clear();
							LCD_GoTo(0,4);
							LCD_SendText("Bbbbb2");
							flags.de_p_2 = SET;
			 		 }
			 		 break;
			 		 
				case 2 :
			 		 while(flags.de_p_2 == RESET)
			 		 {
							LCD_Clear();
							LCD_GoTo(0,4);
							LCD_SendText("Powrot");
							flags.de_p_2 = SET;
			 		 }
			 		 break;
			}
		}
	}
	while (flags.de_p_1 == RESET);
}
 

Wiem, opóźnień nie robi sie na pętlach for, ale to jest program próbny w którym próbuje uruchomić jedynie menu.

0

i jak tym razem ?

0

Odnośnie tego kodu:

                      while(flags.de_p_2 == RESET)
                      {
                            LCD_Clear();
                            LCD_GoTo(0,4);
                            LCD_SendText("Powrot");
                            flags.de_p_2 = SET;
                      }
  1. zrób z części wewnętrznej funkcje aby zapisać to samo jako: while(flags.de_p_2==RESET) flags.de_p_2=ShowMenuItem("Powrot");
  2. po zrobieniu powyższego zauważysz że cały dolny if da się zastąpić na jeden wiersz: if((flags.de_m_2==SET)&&(flags.de_p_2==RESET)) flags.de_p_2=ShowMenuItem(MenuTextTab[p_choice_2]);
  3. Po dokonanych przeróbkach pokaż kod
0
void d (void)
{
     if(a == 0)
     {
          switch (b)
          { 
            case 0 :
            instrukcje
            break;
 
            case 1 :
            instrukcje
            return; // <-- o to Ci chodzi?
          }
     }
}
0

krwq nie działa - gdyby to było takie proste, to sam bym to już dawno rozgryzł. Nie wiem Dragon po kiego grzyba każesz mi optymalizować kod, jak clue problemu tyczy się wychodzenia z pętli... optymalizacją wyświetlania na LCD bd zajmował się potem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1