mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik rechenoperation an funktionen übergeben in c/c++


Autor: whitenoise (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

wie kann ich die rechenoperation selbst an eine funktion übergen?
bsp.:

void FülleFeld (feld,rechenoperation);     //rechenoperation: y=x^2
                                           //oder             y=1
                                           //oder             y=x


gruß,
w

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dem du aus den Rechenoperationen eine Funktion machst und die 
Addresse der Funktion uebergibst.

Gruss Helmi

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>In dem du aus den Rechenoperationen eine Funktion machst und die
>Addresse der Funktion uebergibst.

Man könnte es auch einfach mit einer switch-case-Abfrage machen, wenn 
man sich auf ein Rechen-Operationen-System festlegt.

Autor: whitenoise (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke :-)

das würde aber voraus setzen das ich für jede mathematische op eine 
funktion erstellen muss, oder?

ich würde die operation gern als define schreiben und über geben:

#define exponentiell     y=x^2
#define linear           y=1

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Makros kannst Du benutzen aber übergeben wird sich dann 
wahrscheinlich Dein Compiler, wenn die so übergeben willst...

Autor: TheMiB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erstell doch nen enum für deine funktionen

typedef enum OPERATIONEN {
  QUADRATISCH,
  LINEAR};

und übergib dann beim funktionsaufruf diese:

void FuelleFeld (datatyp_feld* feld, OPERATIONEN funktion) {
  switch (funktion) {
    case EXPONENTIELL:
      feld->y = (feld->x) ^ 2;
    break;

    case LINEAR:
      feld->y = (feld->x);
    break;

    default:
    break;
  }
}

oder du definierst deine Funktion halt immer als

y = (a * x) ^ b + c

und übergibts a,b und c einzeln.

mfg
TheMiB

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute mal ganz stark, dass das eingentliche Problem ist, dass du 
etwas einfaches auf eine sehr komplizierte Art und weise lösen möchtest. 
Denn deine Frage ist eine äußert ungewöhnliche Problemstellung.

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du trotzdem die Funktion übergeben möchtest, dann such mal nach 
function pointer ....

Grüße,
Michael

Autor: Klugscheisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Kollegen haben ja schon ein paar Lösungsmöglichkeiten angegeben. 
Aber Du solltest vielleicht über die Nachfrage von Klaus doch ein paar 
Augenblicke nachdenken.

Grundsätzlich ist es garnicht so ungewöhnlich, das man Operationen 
dynamisch gestalten muss. D.h. das die eigentliche Operation erst zur 
Ausführungszeit festgelegt wird.

Welche Lösung Du verwendest hängt im wesentlichen davon ab, "wie" 
dynamisch das sein soll, oder genauer, welche Varietät von Operationen 
da auftauchen kann und auf welche Weise sie ausgewählt werden.

1. Jeweils nur eine Operation von etwa 2-3 bis zu 10 oder auch mehr. Die 
Anzahl ist aber grundsätzlich beschränkt. Die jeweilige Operation ist 
festgelegt. Es geht nur um eine Auswahl von zur Kompilierzeit schon 
festgelegten Operationen.
Dann machen die Lösungen von Helmi und stk500-besitzer Sinn.

2. Die Operationen lassen sich nicht vorher festlegen. Der Benutzer legt 
diese fest und beschreibt sie.
Dann kannst Du eine Script-Sprache einbinden (etwa FORTH, etc.) in 
welcher der Benutzer dann eigene "Programme" formuliert.

Deine Idee mit den defines geht jedenfalls nicht. Bedenke das #define 
nur Textersatz zur Kompilierzeit ermöglicht. Keine Dynamische Auswahl 
zur Laufzeit.

Ehrlich gesagt, denke ich das Lösung 2 vielleicht noch ein wenig 
jenseits Deiner Fähigkeiten liegt (z.B. wegen dem define als 
Lösungsanzatz). Aber ich kann mich ja auch irren. Wenn Du selbst 
ähnliche Zweifel hast, empfehle ich Dir erstmal Lösung 1 zu probieren 
und auszureizen.

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.