Forum: PC-Programmierung Funktionen während dem Kompilieren aufrufen


von µCnoob (Gast)


Lesenswert?

Hi leute, ich hoffe die Frage ist hier richtig, weiß nicht genau wo die 
einzuordenen ist??

Ich bin gerade dabei ein universell erweiterbares LCD menü für meinen µC 
(hier ATmega128) zu gestalten.

Es steht, und funktioniert auch, das einzige das mich stört ist, dass 
die einzelnen Menüpunkte erst während der Laufzeit initialisiert werden.
1
void add_new_menu(void)
2
{
3
4
// add_menu (ID_actualMenu, ID_NextMenu, ID_Previous_Menu,
5
//           ID_uebergeordnet_Menu, ID_untergeortnet_menu, 
6
//           Hinterlegte_Menufunktion)
7
8
  add_menu_delay( 0, 1, 65, menuStartWindow);
9
  
10
  add_menu( 1, 1, 2, 3, 1, menuDummy2 );
11
12
  add_menu( 2, 0, 3, 3, 1, menuDummy3 );
13
  add_menu( 3, 3, 3, 3, 0, menuDummy4 );
14
}

Was mich hier stört, ist dass das Ganze in einer Funktion zur Laufzeit 
initialisiert wird.

Besteht die möglichkeit das ganze auch außerhalb einer Funktion zu 
machen

Etwa so:

1
#define add_all_menu  {
2
        add_menu_delay( 0, 1, 65, menuStartWindow);
3
  
4
  add_menu( 1, 1, 2, 3, 1, menuDummy2 );
5
6
  add_menu( 2, 0, 3, 3, 1, menuDummy3 );
7
  add_menu( 3, 3, 3, 3, 0, menuDummy4 );  
8
                       }


Ich weiß dass die Syntax so nicht stimmt,

aber gibt es so eine (oder ähnliche)
Möglichkeit???


Gruß und Danke...

von Uhu U. (uhu)


Lesenswert?

1. Syntaktisch korrekt sähe das so aus:
1
#define add_all_menu \
2
  add_menu_delay( 0, 1, 65, menuStartWindow); \
3
  add_menu( 1, 1, 2, 3, 1, menuDummy2 ); \
4
  add_menu( 2, 0, 3, 3, 1, menuDummy3 ); \
5
  add_menu( 3, 3, 3, 3, 0, menuDummy4 );

Die Fortsetzungszeilen müssen mit \ enden

2. Wenn du das machst, ändert sich garnichts. Dein Menü wird nach wie 
vor erst zur Laufzeit erzeugt.

Um das Menü zur Übersetzungszeit aufzubauen, müßtest du eine 
Datenstruktur initialisieren, die alle Daten enthält und zur Laufzeit 
von einer Routine angezeigt/interpretiert wird.

von µCnoob (Gast)


Lesenswert?

Danke erstmal,...

Meinst du sowas??

1
//im header .h 
2
#define MENUNUMBER      50
3
4
typedef struct                
5
{
6
  void            (*setFunction)(void);       /*!<     */    
7
//  unsigned int    actual_menuID;          /*!<     */            
8
  unsigned int    supperMenu[MENUNUMBER];      /*!<     */              
9
  unsigned int    inferMenu[MENUNUMBER];      /*!<     */  
10
  unsigned int    nexterMenu[MENUNUMBER];      /*!<     */        
11
  unsigned int    preverMenu[MENUNUMBER];      /*!<     */  
12
  unsigned int   menuDelayTime[MENUNUMBER];    /*!<     */
13
}tAddMenu;
14
extern tAddMenu newMenu_ID[];
15
16
17
//im .c
18
19
tAddMenu newMenu_ID[MENUNUMBER];
20
21
void add_menu( int menu_ID, char sup_ID, char next_ID, char inf_ID,
22
          char prev_ID, void (*menuFunction)(void) )
23
{ 
24
  newMenu_ID[menu_ID].supperMenu[menu_ID]    = sup_ID;    
25
  newMenu_ID[menu_ID].inferMenu[menu_ID]     = inf_ID;    
26
  newMenu_ID[menu_ID].nexterMenu[menu_ID]    = next_ID;          
27
  newMenu_ID[menu_ID].preverMenu[menu_ID]    = prev_ID;
28
  newMenu_ID[menu_ID].setFunction            = menuFunction;
29
}
30
31
void menuDummy2(void);
32
void menuDummy3(void);
33
void menuDummy4(void);
34
35
void add_new_menu(void)
36
{
37
  add_menu( 1, 1, 2, 3, 1, menuDummy2 );
38
  add_menu( 2, 0, 3, 3, 1, menuDummy3 );
39
  add_menu( 3, 3, 3, 3, 0, menuDummy4 );
40
}


Währe deine Methode hier auch möglich??

Gruß

von Uhu U. (uhu)


Lesenswert?

Nein, das lauft auch zur Laufzeit ab. Ich dachte sowas in diesem Stil:
1
typedef struct {
2
   char         *pText;
3
   menuEntry    *subMenu;
4
} menuEntry;
5
6
struct {
7
   menuEntry    e1;
8
   menuEntry    e2;
9
} menuLevel1 = {
10
   { "Punkt 2.1", NULL }
11
};
12
13
struct {
14
   menuEntry    e1;
15
   menuEntry    e2;
16
   menuEntry    e3;
17
} menuLevel0 = {
18
   { "Punkt 1", NULL },
19
   { "Untermenü", &menuLevel1 },
20
   { "Punkt 3", NULL }
21
};
Der Baum fängt bei menuLevel0 an, der Benutzer hangelt sich durch, bis 
er einen menuEntry mit subMenu == NULL auslöst. Dann gibt die 
Menüroutine das zugehörige pText zurück.

Das Prinzip läßt sich noch verfeinern, z.B. indem man den Text nur bis 
zu einem Sonderzeichen anzeigt und dahinter irgendwelche Parameter 
speichert, die den Routinen übergeben werden, die die Menüpunkte 
ausführen.

Z.B. so:

   "Punkt 4~4711"      // Der Text wird nur bis zu ~ angezeigt
                       // Die Menüroutine gibt 4711 zurück.

von µC - noob (Gast)


Lesenswert?

Jetzt hätt ich fast vergessen mich zu bedanken...

Zwar werde ich das so nicht übernehmen,
nicht weil es schlecht ist, besser als meine Lösung!

Aber das jetzt an meinen Code anzupassen ist mir ein zu großer Aufwand.

Aber du hast mir an einer ganz anderen Stelle meines Projekts geholfen, 
an der es nicht weiterging...merci!


Gruß und Danke


Jo

von Uhu U. (uhu)


Lesenswert?

Gern geschehen.

von Jorge (Gast)


Lesenswert?

Dein Menü wird in der Startuproutine initialisiert, sorry.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.