mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Aus einem Ergebnis heraus auf eine Rotine verweisen ?


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin relativ neu dabei und ätte da mal eine Frage, da ich langsam doch
über die Blinkschaltung hinaus komme:

Kann man aus einem Ergebnis heraus direkt auf eine Routine verweisen ?
Ich setlle mir das z.B. so vor:


Routinen[12]="Tudas";
Ergebnis=12;

Routinen[Ergebnis]();

Oder sind Bedingungen die einzige Möglichkeit ?

Danke

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst entweder vorher eine If-Abfrage machen:
if (ergebnis==1)
{
  ..
}
if (ergebnis==2)
{
...
}
usw.

oder du machst das ganze in einer Funktion mit übergabewert und machst
das ganze dann in der Funktion.

irgendeinfunktionsnamen(Ergebnis);

Aber was willst du denn machen?

Autor: Jörn-h. G. (joern_g)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Wahrsagekugel sagt, dass du vermutlich C meintst.
Mit Zeigerarithmetik kann man solche unsauberen Dinge durchaus
hinbekommen, sollte man aber nicht.

Einfach mit if() Bedingung - das verstehst dann jeder später beim lesen
des Quellcodes auch, und du selber in einem Jahr auch noch.

if( Ergebnis == 12 )
   Tudas();

oder bei vielen Bedingungen mit switch/case:

switch(Ergebnis)
{
case 1 : tudas1();break;
case 3 : tudas3();break;
case 12 : tudas12();break;
default: tunix();
}


cu joern

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktionspointer sind in C gängige Praxis und sehr effizient und
überhaupt nicht dreckig.

Hier mal ein Beispiel:
typedef unsigned char u8;

typedef u8 (*u8_fp_v)(void);

extern u8 f0( void );
extern u8 f1( void );
extern u8 f2( void );


u8_fp_v functions[] = { f0, f1, f2 };


u8 call_nr( u8 nr )
{
  if( nr >= sizeof(functions) / sizeof(u8_fp_v))
    return 0xFF;                // out of table

  return functions[nr]();       // execute function
}


Die Funktionen f0..f2 geben hier eine Byte zurück, mit dem man den
Erfolg signalisieren kann.

Wird versehentlich ein Funktionsindex übergeben, der außerhalb der
Tabelle liegt, wird natürlich nichts ausgeführt, sondern 0xFF
zurückgegeben. Ist auch ein schönes Beispiel für den sizeof Operator.


Beim AVR-GCC gibt es noch einige Besonderheiten, wenn man die Tabelle
in den Flash-Bereich legen will.


Peter

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den if-Abfragen u.s.w. war mir schon klar, so habe ich das ja
auch bisher gemacht.

Ich dachte mir nur einfach, dass die andere Möglichkeit eventuell
effektiver wäre, was ich auch probieren werde, sobald ich den Beitrag
von Peter Dannegger 100% verstanden habe (noch nicht mit Pointern
gearbeitet)

Danke ...

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.