- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 3 von 3

Thema: Funktion gibt Funktion zurück... nächstes Problem

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009

    Funktion gibt Funktion zurück... nächstes Problem

    Anzeige

    Powerstation Test
    Moin.

    Ein kleines Problem, bei dem ich jetzt nicht ganz weiss, wie ich's erklären soll, damits verständlich wird...

    (Info: main und MAIN sind 2 unterschiedliche Funktionen!)

    Meine main sieht so aus:
    Code:
    int main(void)
    {
      typedef void(*fptr_t)(void); 
      volatile fptr_t FPTR;
    
      FPTR = MAIN;
      while(1)
      {
        FPTR();
      }
    
      return(0);
    }
    Die void-Funktion MAIN wird aufgerufen. Wenn ich nun in der MAIN der (globalen) Zeigervariable FPTR eine andere Funktion zuweise, die MAIN dann per return beende, wird entsprechend die andere Funktion ausgeführt. Klappt soweit auch gut.

    Jetzt möcht ich das ganze aber in dem folgenden Stil machen, dass die globale Variable nur noch lokal sein muss und ich in der aktuellen Funktion einach sagen kann: return (nächste Funktion);...

    Code:
      while(1)
      {
        FPTR = FPTR();
      }
    ... dass also die gerade ausgeführte Funktion als Rückgabewert die
    Funktion der nächsten auszuführenden Funktion an den Zeiger übergibt und beim nächsten Durchlauf der Schleife ausführt.

    Versuche ich das so, meckert der Compiler an der Zeile "FPTR = FPTR();"
    "error: void value not ignored as it ought to be"

    Ok, klar, MAIN ist noch eine void.
    Dann hab ich die Deklaration für die MAIN geändert:
    fptr_t MAIN(void)

    Geht aber auch nicht. Zusätzlich zu dem Fehler bringt der compiler jetzt auch bei der Initial-Zuweisung "FPTR = MAIN;" den Fehler:
    "warrning: assignment from incompatible pointer type"

    Ich hoff, mein Problem ist einigermassen verständlich.
    Hat hier jemand ne Idee dazu?

    mfG



    (PS: Warum das ganze? Damit mehrere Funktionen, die zur Zeit "ineinander" aufgerufen werden, nacheinander ausgeführt werden, um so nicht Unmengen an Stack zu verschwenden.)
    #ifndef MfG
    #define MfG

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Versuch es mal mit einem Cast.

    Code:
      while(1)
      {
        FPTR = (fptr_t)FPTR();
      }

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Ändert nichts. Die Fehler/Warnungen bleiben.

    Nachtrag: Der Cast beim Initialwert bringt was, der Fehler mit dem ignored void bleibt aber.

    Nachtrag 2: Anscheinend hab ich den Fehler grad behoben.
    "Einfach" eine 2. Typedef dazu...
    Code:
    typedef void(*vfptr_t)(void); 
    typedef vfptr_t(*fptr_t)(void);
    Und dann doch noch den Cast bei FPTR = (fptr_t)FPTR();, dann bringt der Compiler weder Warnungen noch Fehler.
    (Ok, ich weiss, einfach rummurksen, bis der Compiler ruhig ist, ist nicht immer die beste Möglichkeit. Aber wenns so geht, lass ichs mal so)

    Werd Nachmittag mal prüfen, ob das Programm dann auch so läuft wie's soll.
    #ifndef MfG
    #define MfG

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress