www.mikrocontroller.net

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


Autor: µCnoob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
void add_new_menu(void)
{

// add_menu (ID_actualMenu, ID_NextMenu, ID_Previous_Menu,
//           ID_uebergeordnet_Menu, ID_untergeortnet_menu, 
//           Hinterlegte_Menufunktion)

  add_menu_delay( 0, 1, 65, menuStartWindow);
  
  add_menu( 1, 1, 2, 3, 1, menuDummy2 );

  add_menu( 2, 0, 3, 3, 1, menuDummy3 );
  add_menu( 3, 3, 3, 3, 0, menuDummy4 );
}


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:

#define add_all_menu  {
        add_menu_delay( 0, 1, 65, menuStartWindow);
  
  add_menu( 1, 1, 2, 3, 1, menuDummy2 );

  add_menu( 2, 0, 3, 3, 1, menuDummy3 );
  add_menu( 3, 3, 3, 3, 0, menuDummy4 );  
                       }


Ich weiß dass die Syntax so nicht stimmt,

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


Gruß und Danke...

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Syntaktisch korrekt sähe das so aus:
#define add_all_menu \
  add_menu_delay( 0, 1, 65, menuStartWindow); \
  add_menu( 1, 1, 2, 3, 1, menuDummy2 ); \
  add_menu( 2, 0, 3, 3, 1, menuDummy3 ); \
  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.

Autor: µCnoob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal,...

Meinst du sowas??

//im header .h 
#define MENUNUMBER      50

typedef struct                
{
  void            (*setFunction)(void);       /*!<     */    
//  unsigned int    actual_menuID;          /*!<     */            
  unsigned int    supperMenu[MENUNUMBER];      /*!<     */              
  unsigned int    inferMenu[MENUNUMBER];      /*!<     */  
  unsigned int    nexterMenu[MENUNUMBER];      /*!<     */        
  unsigned int    preverMenu[MENUNUMBER];      /*!<     */  
  unsigned int   menuDelayTime[MENUNUMBER];    /*!<     */
}tAddMenu;
extern tAddMenu newMenu_ID[];


//im .c

tAddMenu newMenu_ID[MENUNUMBER];

void add_menu( int menu_ID, char sup_ID, char next_ID, char inf_ID,
          char prev_ID, void (*menuFunction)(void) )
{ 
  newMenu_ID[menu_ID].supperMenu[menu_ID]    = sup_ID;    
  newMenu_ID[menu_ID].inferMenu[menu_ID]     = inf_ID;    
  newMenu_ID[menu_ID].nexterMenu[menu_ID]    = next_ID;          
  newMenu_ID[menu_ID].preverMenu[menu_ID]    = prev_ID;
  newMenu_ID[menu_ID].setFunction            = menuFunction;
}

void menuDummy2(void);
void menuDummy3(void);
void menuDummy4(void);

void add_new_menu(void)
{
  add_menu( 1, 1, 2, 3, 1, menuDummy2 );
  add_menu( 2, 0, 3, 3, 1, menuDummy3 );
  add_menu( 3, 3, 3, 3, 0, menuDummy4 );
}


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

Gruß

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das lauft auch zur Laufzeit ab. Ich dachte sowas in diesem Stil:
typedef struct {
   char         *pText;
   menuEntry    *subMenu;
} menuEntry;

struct {
   menuEntry    e1;
   menuEntry    e2;
} menuLevel1 = {
   { "Punkt 2.1", NULL }
};

struct {
   menuEntry    e1;
   menuEntry    e2;
   menuEntry    e3;
} menuLevel0 = {
   { "Punkt 1", NULL },
   { "Untermenü", &menuLevel1 },
   { "Punkt 3", NULL }
};
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.

Autor: µC - noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gern geschehen.

Autor: Jorge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Menü wird in der Startuproutine initialisiert, sorry.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.