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.

0

Jak nie działa ????? To co w Twoim kodzie, po dotarciu do instrukcji return następuje ? Debugowałeś to ?

0
typu123485 napisał(a):

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.

Po takiego grzyba że przy tak niepotrzebnie rozlazłym kodzie nie widzisz że ta skrócona wersja którą podałeś na początku nie ma nic wspólnego z twoim kodem.

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