void Funktion in einer void Funktion???



  • Hi.

    Programmiere noch nicht sehr lange mit c++ und hab jetzt folgendes Problem.

    Habe ein Programm geschrieben (int main) in dem ich ein Teil des Programmes durch eine void Funktion ersetzt habe (da ich diesen Teil öffters verwenden möchte).Von dieser void Funktion (bei mir heißt die "void read")aus möchte ich wiederum in eine andere void Funktion wechsel (bei mir "void write").

    Darf ich das überhaupt? Wenn ja, wie? Oder geht es auch irgendwie anders?
    Bekomme da nämlich ne Fehlermeldung.Und zwar in der 2. void Funktion (write) in der ich wieder die 1.Funktion (read) aufrufen will.

    Wäre nett, wenn mir jemand helfen könnte.

    Im Voraus schon mal Danke.



  • Die Funktionen rufen sich also gegenseitig auf? Stelle sicher, dass es Abbruchbedingungen gibt, sonst zwingst du deinen Stack in die Knie.



  • Danke erst mal. Aber bekomm das nicht so hin.

    Die Aufrufe der void funktionen mach ich über ne case Anweisung und da hab ich doch ein "breake" am ende. Reich das nicht? z.b.

    void read (char rzeichen )
    {
     do
     {
     cout << "READ-MENÜ:" << endl;
     cout << endl;
     cout << "c : (close) Datei schließen" << endl;
     cout << "r : (read) Datei lesen" << endl;
     cout << "l : (lock) Datei zum Schreiben sperren" << endl;
     cout << "Ihre Eingabe: " << endl;
    
     cin >> rzeichen;
     switch (rzeichen)
        { 
         case 'c' : {}break;
         case 'r' : {cout << "Datei wird gelesen" << endl;}break;
         case 'l' : {
                       char wzeichen;
                       write (wzeichen);
                    }break;
         default : {cout << "Unzulässige Eingabe" << endl;}break;
        }
     }
    while (rzeichen != 'c');
    }
    

    Das selbe hab ich in der void write geschrieben.

    void write (char wzeichen)
    {
     do
     {
      cout << "WRITE-MENÜ:";
      cout << endl;
      cout << "c : (close) Datei schließen" << endl;
      cout << "r : (read) Datei lesen" << endl;
      cout << "w : (write) Datei schreiben" << endl;
      cout << "u : (unlock) Datei freigeben" << endl;
      cout << "Ihre Eingabe: " << endl;
    
      cin >> wzeichen;
      switch (wzeichen)
        {
         case 'c' : {}break;
         case 'r' : {cout << "Datei wird gelesen" << endl;}break;
         case 'w' : {cout << "Datei wird geschrieben" << endl;}break;
         case 'u' : {
                     char rzeichen;
                     read (rzeichen); }break;
         default : {cout << "Unzulässige Eingabe" << endl;}break;
        }
     }
    while (wzeichen != 'c');
    }
    

    Das Programm besteht halt aus verschiedenen Menüs in denen ich hin und her wechseln kann.
    Aber es funktioniert nicht wirklich.

    /edit: sfds



  • Mit break brichst du nur aus dem switch aus, aber bleibst in der do-while Schleife. Du bräuchtest z.B. goto. Da die Funktion aber gleich danach beendet wird, könntest du auch return nehmen.

    void read (char rzeichen )
    {
        do
        {
           cout << "READ-MENÜ:" << endl;
           cout << endl;
           cout << "c : (close) Datei schließen" << endl;
           cout << "r : (read) Datei lesen" << endl;
           cout << "l : (lock) Datei zum Schreiben sperren" << endl;
           cout << "Ihre Eingabe: " << endl;
    
           cin >> rzeichen;
           switch (rzeichen)
           {
               case 'c' : return; // goto end;
               case 'r' : cout << "Datei wird gelesen" << endl;
                          break;
               case 'l' : char wzeichen;
                          write (wzeichen);
                          break;
               default :  cout << "Unzulässige Eingabe" << endl;
                          break;
          }
       } while (rzeichen != 'c');
    end:
     return;
    }
    

    mfg



  • terraner schrieb:

    Mit break brichst du nur aus dem switch aus, aber bleibst in der do-while Schleife. Du bräuchtest z.B. goto

    Ach Quark, goto ist doof, break kann auch Argumente erhalten, um aus geschachtelten Schleifen raus zu springen.



  • Ja Danke, dass mit dem return geht auch.

    Hab aber leider immer noch das gleiche Problem wie am Anfang.

    Er will nicht von der 2. void Funktion in die 1. void Funktion wechseln.

    Da zeigt mir der compiler eine Fehlermeldung.

    void write (char wzeichen)
    {
    do
    {
    cout << "WRITE-MENÜ:";
    cout << endl;
    cout << "c : (close) Datei schließen" << endl;
    cout << "r : (read) Datei lesen" << endl;
    cout << "w : (write) Datei schreiben" << endl;
    cout << "u : (unlock) Datei freigeben" << endl;
    cout << "Ihre Eingabe: " << endl;

    cin >> wzeichen;
    switch (wzeichen)
    {
    case 'c' : return;
    case 'r' : {cout << "Datei wird gelesen" << endl;}break;
    case 'w' : {cout << "Datei wird geschrieben" << endl;}break;
    case 'u' : { // das hier schluckt der compiler
    char rzeichen; //nicht; irgendwas mit no matching
    read (rzeichen); }break; //funktion for call to
    //`read(char&)´
    default : {cout << "Unzulässige Eingabe" << endl;}break;
    }
    }
    while (wzeichen != 'c');
    }

    hier is noch mein Hauptprogramm (int main), dort müsste aber (glaube ich) alles korrekt sein.

    int main ( )
    {
    char eingabe;
    do
    {

    cout << "STARTMENÜ:" << endl;
    cout << endl;
    cout << "o : (open) Datei öffnen" << endl;
    cout << "e : (end) Programmende" << endl;
    cout << "Ihre eingabe: " << endl;

    cin >> eingabe;

    switch (eingabe)

    {
    case 'o' : {cout << "Datei öffnen" << endl;

    char rzeichen ;
    read (rzeichen);

    }break;
    case 'e' : {cout << "Und Tschüss" << endl;}break;

    default : {cout << "Unzulässige Eingabe" << endl;}break;
    }
    }
    while (eingabe!='e');
    return 0;
    }

    Das Programm soll also so ablaufen, das ich im Startmenü über 'o' in die void read Funktion wechsele. Von dort über 'l' in die void write Funktion.
    Bis dort hin läuft alles.
    Dann will ich aber von der void write Funktion wieder durch 'u' zurück in die read Funktion. Und das klappt nicht.



  • char rzeichen ;
    read (rzeichen);
    

    das musst du nicht machen
    einfach

    read( );
    

    und

    void read( ){ char rzeichen ... }
    
    case 'c' : {}break;
    

    nach einem case brauchst du keine geschweiften klammern machen

    vielleicht solltest du dir nochmal die grundlagen angucken 🙂



  • Strogij schrieb:

    terraner schrieb:

    Mit break brichst du nur aus dem switch aus, aber bleibst in der do-while Schleife. Du bräuchtest z.B. goto

    Ach Quark, goto ist doof, break kann auch Argumente erhalten, um aus geschachtelten Schleifen raus zu springen.

    Wirklich? 😕 Die Möglichkeit kenne ich gar nicht. 😮

    mfg



  • Danke.

    Das mit der geschweiften Klammer in der case Anweisung muss man nicht machen.Weiß ich, aber der Prof. verlangt das von uns.

    Der Code:
    void read( ){ char rzeichen ... }

    wo soll ich denn den hinschreiben? Hab doch schon eine void read Funktion.
    (siehe weiter oben)

    das mit nur "read ()" hab ich ausprobiert.
    Kommt jetzt ne andere Fehlermeldung: undefined reverence to `read ()`
    (benutzt cygwin)



  • borg schrieb:

    case 'c' : {}break;
    

    nach einem case brauchst du keine geschweiften klammern machen

    er brauch das spätestens, wenn er in einem case block eine variable deklariert, deshalb ist es gut, wenn ers jetzt schon macht, dann kann ers nämlich nie falsch machen(ausserdem finde ich persönlich die geschweiften Klammern verdammt übersichtlich)



  • terraner schrieb:

    Strogij schrieb:

    terraner schrieb:

    Mit break brichst du nur aus dem switch aus, aber bleibst in der do-while Schleife. Du bräuchtest z.B. goto

    Ach Quark, goto ist doof, break kann auch Argumente erhalten, um aus geschachtelten Schleifen raus zu springen.

    Wirklich? 😕 Die Möglichkeit kenne ich gar nicht. 😮

    mfg

    meiner meinung nach gibts das in c++ nicht. in java z.b. geht das soviel ich weiss, aber ich will mich jetzt nicht zu weit aus dem fenster lehnen.



  • Hallo,

    terraner schrieb:

    Wirklich? Die Möglichkeit kenne ich gar nicht.

    die gibt es auch nicht, muß er mit irgendetwas verwechselt haben.

    MfG



  • japro schrieb:

    meiner meinung nach gibts das in c++ nicht. in java z.b. geht das soviel ich weiss, aber ich will mich jetzt nicht zu weit aus dem fenster lehnen.

    IMHO, da aber auch nur wenn man vor die äußere Schleife ein Label setzt, ist also eigentlich auch nichts anderes als ein goto.



  • Hallo,
    ich habe hier leider ein bischen den überblick verloren, aber ich denke, die eigentliche Frage war:

    Wie kann ich aus einer Funktion a die Funktion b auf rufen und geleichzeitig aus der Funktion b die Funktion a aufruftn.

    Da hilft es die Funktion b vor der Funktion a zu deklarieren, aber erst nach a zu implementieren, also

    void write (char wzeichen)  //mit semikolon
    
    void read (char rzeichen ) 
    {
      // whatever
    }
    
    void write (char wzeichen)
    {
      // hier erst die implementierung von write
    }
    

    LG, J.



  • Verdammt, wo ist mein Semilolon geblieben?!?
    So ist's richtiger...

    void write (char wzeichen);  //mit semikolon
    
    void read (char rzeichen ) 
    {
      // whatever
    }
    
    void write (char wzeichen)
    {
      // hier erst die implementierung von write
    }
    

    LG, J.[/quote]



  • terraner schrieb:

    Strogij schrieb:

    terraner schrieb:

    Mit break brichst du nur aus dem switch aus, aber bleibst in der do-while Schleife. Du bräuchtest z.B. goto

    Ach Quark, goto ist doof, break kann auch Argumente erhalten, um aus geschachtelten Schleifen raus zu springen.

    Wirklich? 😕 Die Möglichkeit kenne ich gar nicht. 😮

    mfg

    Entschuldigung, habe mich geirrt, in PHP gibt es diese Möglichkeit. 🙄



  • Danke joeX (C++ Gott).

    Super erklärt.
    Hat direkt funktioniert.Läuft einwandfrei.

    Respekt.



  • Das nächste Problem ist aufgetreten.

    Programm wechselt einwandfrei zwischen den beiden Funktionen (read und write)

    Wenn ich mich jetzt im write menü (write Funktion) befinde und ich die case Anweisung 'c' durchführe springt er ins vorherige read menu (read Funktion).

    Jetzt soll die write Funktion arber so arbeiten, dass sie bei der case Anweisung 'c' in mein Startmenü (int main) wechselt.

    Kann mir da ein netter C++ Freak weiterhelfen

    Hier nochmal das ganze programm.

    # include <iostream>
    using namespace std;

    void write (char wzeichen);

    void read (char rzeichen )
    {
    do
    {
    cout << "READ-MENÜ:" << endl;
    cout << endl;
    cout << "c : (close) Datei schließen" << endl;
    cout << "r : (read) Datei lesen" << endl;
    cout << "l : (lock) Datei zum Schreiben sperren" << endl;
    cout << "Ihre Eingabe: " << endl;

    cin >> rzeichen;

    switch (rzeichen)
    {
    case 'c' : return;
    case 'r' : {cout << "Datei wird gelesen" << endl;}break;
    case 'l' : {
    char wzeichen;
    write (wzeichen); //Aufruf write Funktion
    }break;
    default : {cout << "Unzulässige Eingabe" << endl;}break;
    }
    }
    while (rzeichen != 'c');
    }

    void write (char wzeichen)
    {
    do
    {
    cout << "WRITE-MENÜ:";
    cout << endl;
    cout << "c : (close) Datei schließen" << endl;
    cout << "r : (read) Datei lesen" << endl;
    cout << "w : (write) Datei schreiben" << endl;
    cout << "u : (unlock) Datei freigeben" << endl;
    cout << "Ihre Eingabe: " << endl;

    cin >> wzeichen;

    switch (wzeichen)
    {
    case 'c' : return;
    case 'r' : {cout << "Datei wird gelesen" << endl;}break;
    case 'w' : {cout << "Datei wird geschrieben" << endl;}break;
    case 'u' : {
    char rzeichen;
    read (rzeichen); //Aufruf read Funktion
    }break;
    default : {cout << "Unzulässige Eingabe" << endl;}break;
    }
    }
    while (wzeichen != 'c');
    }

    int main ( )
    {
    char eingabe;
    do
    {
    cout << "STARTMENÜ:" << endl;
    cout << endl;
    cout << "o : (open) Datei öffnen" << endl;
    cout << "e : (end) Programmende" << endl;
    cout << "Ihre eingabe: " << endl;

    cin >> eingabe;

    switch (eingabe)
    {
    case 'o' : {cout << "Datei öffnen" << endl;
    char rzeichen ;
    read (rzeichen); // Aufruf read Funktion
    }break;
    case 'e' : {cout << "Und Tschüss" << endl;}break;

    default : {cout << "Unzulässige Eingabe" << endl;}break;
    }
    }
    while (eingabe!='e');
    return 0;
    }



  • dein code ist ohne code-tags absolut unleserlich! 😮 da tun einem die Augen weh.
    Die Antwort ligt doch schon in deiner Frage: überlege mal was du mit
    case 'c' : return
    in deiner write-Funktion bewirkst??
    in deiner main wird rzeichen gar kein Wert
    warum hat deine read-Funktion überhaupt einen Übergabeparameter??



  • Dich hat eigentlich schon jemand darauf hingewiesen, aber da hast du nicht verstanden, was er will.

    Deshalb versuche ich's jetzt nochmal: Ich werde dir ersst weiterhelfen, wenn du mir folgendes erklärst: Warum hat deine read-Funktion ein Argument (rzeichen)? Was auch immer ich übergebe ist der Funktion egal, da es direkt durch die Eingabe über cin überschrieben wird.



  • Na toll, jetzt hat freshman auch nochmal drauf hingewiesen 😋


Anmelden zum Antworten