tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
872
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    413
    Hiho muss bis morgen in der Schule nurmerische Integration Simpson und Newtown Verfahren fertig haben( Trapez und Parabel Formeln).
    Ich habe soweit alles fertig Eingabe...
    Mein Problem ist nun das ich eine Eingabe haben möchte wo man die zu integrierende Funtion einträgt.
    Bislang habe ich die Funktion immer in meineSourcecode festgelegt.
    wenn ich z.b.
    sin(x)*sqrt(x) habe
    muss in ich erkenne aha
    und:
    Code :
    1
    2
    3
    4
    
    float f(float x)
    {
            return sqrt(x) * sin(x);
    }

    wenn ich nun etwas anderes eingebe muss sich dies Fuktion ändern.
    Ich hatte schon an eine switch case Anweisung gedacht aber da gäbe es bei verketten unendlich viele möglichkeiten.
    Hat jemand eine Idee?
    Geändert von 3Cyb3r (26.01.09 um 20:52 Uhr)
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

  2. #2
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    413
    Hi
    Ich hab eine eingabe z.b.
    sin(x) als string.
    wie mache ich aus diesem string ein Befehl der während der laufzeit aufgerufen wird?
    als wenn ich das in den code schreiben würde ständ dann da sin(x);.
    Also ich muss wissen wie ich eine Funktion die in eine srtring steht ausführe.

    Das Problem ist cc ist keine Interpreter Sprache und ich glaubnicht das Python Script
    kompatibel mitm TI ist-.-. Wie macht das denn dann ein Taschenrechner?

    Oder kennt jemand ein Tutorial Code Assembler Interpreter für so etwas welchen ich integrieren kann (wie eine Funktion)?
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

  3. #3
    Avatar von devDevil
    devDevil devDevil ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Beiträge
    662
    Hm also du musst das ganze dann schon parsen ... dann das ganze einfach in folgendes packen:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    typedef struct function {
        typedef double (*fn_type)(double);
        fn_type call;
        const char* string;
    } function_t;
     
    function_t registered[] = { {&sin, "sin"}, {&cos, "cos"} };
    double call_function(const char* string, const double value)
    {
        function_t* ptr_end = registered + sizeof(registered) / sizeof(function_t);
        for (function_t* ptr_it = registered; ptr_it != ptr_end; ++ptr_it)
            if (strcmp(string, ptr_it->string) == 0) return (*(ptr_it->call))(value);
        /* error handling */
    }
     
    int main()
    {
        printf("%d", call_function("sin", 90));
    }
    ...
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Da wirst du wohl nicht anders können als einen Interpreter dafür zu schreiben...
    ob das bis morgen geht?

    Edit: Hab irgendwie nicht mitgekriegt, dass da schon zwei Beiträge sind...
    Geändert von sheel (26.01.09 um 23:19 Uhr)
     

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hoppala, plötzlich ist alles verschoben...

    Naja, mein Senf auch noch:

    Hi.

    Du müßtest von deinem Ausdruck einen Syntaxbaum im Speicher erstellen den du dann immer wieder auswerten kannst.

    Siehe http://www.tutorials.de/forum/1138857-post5.html

    Da hat RedWing allerdings nur ein einfacher Parser für math. Ausdrücke ohne Variablen und Funktionsaufrufe programmiert. Es dann nochmal schwieriger wenn du solche Elemente erlaubst.

    Du könntest allerdings eine Zuordnung von Strings zu unären Funktion (bzw. Funktionszeigern) definieren und dann die entsprechende Funkton aufrufen.

    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    typedef  double (*unary_func) (double); 
     
    unary_func func = NULL;
     
    if (func_name == "sin") {
      func = &sin;
    } else if (func_name == "cos") {
      func = &cos;
    } else if 
    ...
     
    // irgendwann später:
    (*func)(argument);
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    413
    Ich bin verwirrt Devdevil könntest du vielleicht einmal ein luffähiges Beispiel posten?
    Was genau soll fn_type oder eher wie sollte sie aussehen?
    Geändert von 3Cyb3r (29.01.09 um 13:15 Uhr)
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von 3Cyb3r Beitrag anzeigen
    Ich bin verwirrt Devdevil könntest du vielleicht einmal ein luffähiges Beispiel posten?
    Was genau soll fn_type oder eher wie sollte sie aussehen?
    fn_type ist ein Funktionszeiger-Alias. Du mußt lediglich die typedef Anweisung aus dem struct herausnehmen und die entsprechenden Headerdateien einbinden, dann läuft das Bsp. von DevDevil bereits. \edit: Allerdings muss der Formatstring natürlich %f, %e oder %g sein.

    Gruß
    Geändert von deepthroat (29.01.09 um 13:39 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    413
    Hi welche inlcude brauch ich dafür?
    Für fn_type?
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

  9. #9
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von 3Cyb3r Beitrag anzeigen
    Hi welche inlcude brauch ich dafür?
    Für fn_type?
    Für fn_type brauchst du überhaupt nichts. Dies ist doch nur ein typedef den DevDevil in Zeile 2 eingeführt hat.

    Ansonsten:
    • printf = stdio.h
    • strcmp = string.h
    • sin, cos = math.h

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  10. #10
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    413
    Ok hab das mal beim msvs 6.0 getestet funtkioniert einwandfrei .
    Allerdings meckert der TI C Kompiler gnadelos rum.
    TIGCC IDE ist das.

    Code :
    1
    2
    3
    
    typedef double (*fn_type)(double);
     
    ->>Expected specifier-qualifier-list before 'typedef'.

    Code :
    1
    2
    3
    4
    
    function_t registered[] = { {&sin, "sin"}, {&cos, "cos"} };
     
    ->>'sin' undeclared here (not in a function).
    ->>'cos' undeclared here (not in a function).

    C99 mode is das
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von 3Cyb3r Beitrag anzeigen
    Allerdings meckert der TI C Kompiler gnadelos rum.
    TIGCC IDE ist das.

    Code :
    1
    2
    3
    
    typedef double (*fn_type)(double);
     
    ->>Expected specifier-qualifier-list before 'typedef'.
    Hast du den typedef aus dem struct rausgenommen?
    Zitat Zitat von 3Cyb3r Beitrag anzeigen
    Code :
    1
    2
    3
    4
    
    function_t registered[] = { {&sin, "sin"}, {&cos, "cos"} };
     
    ->>'sin' undeclared here (not in a function).
    ->>'cos' undeclared here (not in a function).
    Dies liegt daran, das auf dem TI keine richtige C Bibliothek verfügbar ist und die ganze math. Funktionen Präprozessormakros sind.

    Du könntest richtige Funktionen definieren:
    Code c:
    1
    2
    3
    
    double _sin(double d) {
      return sin(d);
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  12. #12
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    413
    Ja habe ich, wenn ich das typedef wecknehme bekomme ichnoch mehr Fehler

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    function_t registered[] = { {&_sin, "sin"}, {&_cos, "cos"} };
    Expected '=', ',', ';', 'asm' or '__attribute__' before 'registered'.
     
    function_t* ptr_end = registered + sizeof(registered) / sizeof(function_t);
    'ptr_end' undeclared (first use in this function).
    'registered' undeclared (first use in this function).
     
     
    function_t* ptr_it;
    'ptr_it' undeclared (first use in this function).

    Kann ich nicht irgendwie das Makefile des Kompilers benutzen und mit dem msvs 6.0 oder 9.0 das ganze Kompilieren?
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

  13. #13
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Nochmal zum Mitschreiben: du mußt das typedef aus dem struct rausnehmen, z.B. direkt vor das struct schreiben...
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  14. #14
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    413
    Ja schon klar hatte ein anderen Fehler funktioniert jetzt alles einwadfrei.
    Danke für die Hilfe hat mich echt weitergebract mach das jetzt noch mit dem verketten
    mit rechenzeichnen und mehr Funktionen und dann werde ich den Code mal posten für die, die es Interessiert.
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

  15. #15
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    413
    So neue Frage.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
     
    //global
    char  cfunction[256];
    // nun wird eingelesen
     
    // später in einer funktion
    char* tmp;
            char opk[] = "*/+-";
            int pos[100];
            pos[0]=-1;
            int i=1,j=0;
            
            tmp = strpbrk(cfunction, opk);  
            while (tmp != NULL)
        {
                pos[i]=tmp-cfunction;
                tmp = strpbrk (tmp+1,opk);
                i++;
        }
    pos[i]=tmp-cfunction;
    Diese Zeile ist bestimm falsch um die Stelle eine Zeichens zu speichern
    geht dies einfach mit
    pos[i]=tmp-(char*)cfunction;?
    Also mit 0 eingerehcnet.
    Geändert von 3Cyb3r (29.01.09 um 19:58 Uhr) Grund: was frag ich eigentlich oder die ist falsche
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

Ähnliche Themen

  1. Numerische Konstanten
    Von Topsen im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 17.07.08, 09:56
  2. Antworten: 11
    Letzter Beitrag: 03.06.07, 15:14
  3. Numerische Namensabfrage in SQL?
    Von Pestilence im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 31.10.06, 11:05
  4. numerische Eingabe für Sonderzeichen
    Von ziriander im Forum Office-Anwendungen
    Antworten: 4
    Letzter Beitrag: 07.05.04, 10:17
  5. Numerische Ausdruecke Abfragen //
    Von tilman im Forum PHP
    Antworten: 6
    Letzter Beitrag: 21.10.01, 20:58