Funktion und Prozedur



  • Hallo,
    ich habe hier eine simple Frage, doch hätte ich mit der von der Lösung falsch angesehenden Antwort geantwortet:

    "Die Definition einer Funktion muss mindestens eine Return-Anweisung umfassen."

    Ich habe diese Antwort als richtig angesehen, da es sich hier um keine Prozedur handelt.

    Zwar kommt keine Fehlermeldung, aber eine Warnung!

    Wer hat nun recht? Die Lösung sagt nämlich falsch!

    Vielen Dank
    lg, freakC++



  • Mit Ausnahme der main-Funktion. Bei der darfst du das return auch weglassen.
    Von was für einer Programmiersprache redest du hier eigentlich? Prozeduren gibt es in C++ nicht, eher schon in Pascal.



  • Ich rede von C++? Hä, natürlich gibt es Prozeduren oder wie nennst du das hier:

    void bla (void);

    Nutzt man in C++ einen anderen Ausdruck? Ein früheres C++ Lehrbuch hat streng auf diese Unterscheidung geachtet!

    Vielen Dank für deine Hilfe
    lg, freakC++



  • Ob Funktion, oder Prozedur ist Definitionssache, und in C++ gibt es keine Prozeduren, sondern lediglich Funktionen. 😉
    Funktionen mit und solche ohne Rückgabewert, aber es sind Funktionen.



  • Funktion und Prozedur sind Begriffe, deren Bedeutung nur durch den Kontext zu erschliessen ist. Eine Funktion ist z.B. in C++ was anderes als in der Mathematik. In C++ bezeichnen Funktion und Prozedur das gleiche.

    void-Funktionen koennen auch eine return besitzen, muessen aber nicht. Der return-Anweisung folgt dann aber kein Wert.

    void my-func()
    {
      ...
      if ( ...) return;
      else ...
    }
    


  • Ich sag mal aus dem Bauch raus: Warum einen Rückgabewert Codieren wenn dieser dann doch nicht gebraucht wird.

    Das sagt der gcc dazu, wenn return einen wert enthält: |main.cpp|6|Fehler: Return-Anweisung mit Wert in »void« zurückgebender Funktion|

    Bei der Angabe return ohne Wert wird anstandslos kompiliert, und das Dissasebmly zeigt das das return Weg-Optimiert wurde, so als wäre return nicht angegeben.

    Ich gehe davon aus das das return in einer void Funktion (oder auch Prozedur) angegeben werden kann, aber nicht muss, der C++ Standard kein MISRA oder so...



  • Eine "Prozedur" kann auch return -Anweisungen haben...

    void noop()
    {
        return; // Oops. What now?!
    }
    

    Wichtig ist, dass ein Wert zurückgegeben wird, was bei einer Prozedur nicht der Fall ist 😉

    MfG



  • Achso...das wusste ich nicht. Ich fand die Unterscheidung eigentlich ganz hilfreich! Naja...

    Auch wenn es nicht in das Forum gehört, aber kann mir jemand sagen, ob es denn ich Delphi diese Unterscheidung gibt oder ob man da auch nur von Funktionen redet?

    Vielen Dank
    lg, freakC++



  • Wenn der Returntyp void ist, darfst halt keinen Wert mit angeben falls du doch ein return machen willst. Verboten ist das return aber nicht.



  • Aber das mit void und return ist doch schlechter Stil!

    Wer schreibt denn bitte

    void noop()
    {
        return; // Oops. What now?!
    }
    

    oder macht man das seit neustem?

    vielen Dank für eure Hilfe
    lg, freakC++



  • Das macht durchaus Sinn, wenn du die Funktion vorher abbrechen möchtest.

    void foo ()
    {
     if ( ... )
       return; // ok abbrechen
    
     // wenn nicht, dann weiter
    }
    


  • Ich habe meinen Beitrag etwas ausgebaut, siehe oben. Die anderen waren einfach zu schnell. Und es macht manchmal Sinn, wenn die Funktion vorzeitig verlassen werden soll. Ich wuerde es nicht als schlechten Stil per se abtun.



  • @knivil
    Wenn hinter dem if() ein return steht kannst du das else auch weglassen. 🙂 (siehe drakon)



  • C++freak schrieb:

    Auch wenn es nicht in das Forum gehört, aber kann mir jemand sagen, ob es denn ich Delphi diese Unterscheidung gibt oder ob man da auch nur von Funktionen redet?

    In Delphi herrscht strikte Trennung zwischen Funktionen und Prozeduren:

    Prozedur:

    procedure Machwas(var AValue: Integer);
    begin
      { hier kommt code hin }
    end;
    

    Funktion:

    function MachwasAnderes(var AValue:Integer): Boolean;
    begin
      { hier kommt code hin }
      Result := true; // return in c/c++, führt aber nicht zum Abbruch der Funktion!
      { hier könnte noch code kommen }
    end;
    


  • Es diente nur dafuer, dass die Berechnung weitergeht, also noch etwas danach kommt. Drakon hat dafuer ein Kommentar geschrieben. 🙂



  • freakC++ schrieb:

    Nutzt man in C++ einen anderen Ausdruck? Ein früheres C++ Lehrbuch hat streng auf diese Unterscheidung geachtet!

    Ja, ein typisches Müllbuch. Da hat jemand vor einem halben Jahrhundert programmieren gelernt und seit einem vietel Jahrhundert nichts dazugelernt und schreibt jetzt ein pascaloides C++-Lehrbuch. Es wird while(true) statt for(;;) nehmen und daran erkennt man die Pascaller meistens am schnellsten. Es wird break scheuen und stattdessen künstliche Hilfsvariablen nehmen, um den Ablauf einer Schleife abzubrechen. Es wird zu große Funktionen bauen, gerne größer als eine Buchseite, weil das Single-Entry-Single-Exit-Dogma zu Blähcode mit Verstopfungen führt. Es wird einen ofstream erst leer anlegen, dann open aufrufen und am ende close, um all zu modernen Mist von C++ zu meiden. Es würde einer genaueren Analyse bedürfen, um zu entscheiden, ob so ein Buch nur nichts bringt, oder ob es einen in Wirklichkeit zu weit ins vergangene Jahrhundert zurückwirft.



  • freakC++ schrieb:

    Aber das mit void und return ist doch schlechter Stil!

    Sagt wer? Ein bestimmtes Lehrbuch?



  • volkard schrieb:

    Es wird break scheuen und stattdessen künstliche Hilfsvariablen nehmen, um den Ablauf einer Schleife abzubrechen.

    Ist schon seit Delphi 6 oder so nicht mehr möglich!



  • Das habe eigentlich ich gesagt...weil ich so überrascht war 😃

    Das Buch war mein erstes Lehrbuch und ist nun schon wieder ein bisschen her, doch hat der Autor auf die Unterscheidung sehr geachtet:

    C++ für Kids

    Vielen Dank
    lg, freakC++



  • DeepCopy schrieb:

    volkard schrieb:

    Es wird break scheuen und stattdessen künstliche Hilfsvariablen nehmen, um den Ablauf einer Schleife abzubrechen.

    Ist schon seit Delphi 6 oder so nicht mehr möglich!

    Ich rede von pascaloiden Krankheiten, die ihren Höhepunkt lange vor Delphi hatten. Zum Teil sogar vor Turbo Pascal.


Log in to reply