Borland 5.0; C++; Wann wird der Funktionstyp void verwendet und warum?



  • Hallo,

    ich habe schon mehrere Bücher, Foren und Tutorials durchsucht und überall die gleiche Standardantwort gefunden:

    "Wenn eine Funktion keinen Wert zurückgeben soll, wird der Funktionstyp void verwendet."

    Habe auch schon gelesen, dass diese Art von Programmierung nicht mehr Standard ist.

    Background:

    Benötige C++ für die Informatik-Vorlesung im Maschinenbaustudium. Möchte vorerst nicht tiefer in die Materie einsteigen, auch wenn das später wahrscheinlich mal nötig sein wird. Habe also nur sehr geringe Grundkenntnisse was C++ betrifft.

    Anbei zwei Beispiele um meine Frage zu verdeutlichen:

    #include <iostream.h>	
    #include <conio.h>		
    #include <math.h>			
    
    /* Funktionsprototypen: typ funktionsname(parametertyp) vor void main */
    
    /* Call by Reference mit Referenz benötigt & vor dem Parameternamen   */
    /* und Angabe des Datentyps vor jedem Parameter                       */
    
    void quad(double hans, double &x1, double &x2);
    
    void main (){
    
    	double wert, zahl1, zahl2;
    
       cout << "Bitte Wert eingeben: ";
       cin >> wert;
    
       quad(wert, zahl1, zahl2);   // Funktionsaufruf
       cout << "Das Quadrat von " << wert << " = " << zahl1 << endl;
    	cout << "Die Wurzel aus " << wert << " = " << zahl2 << endl;
    
    getch();
    }
    
    // Funktionsdefinition: datentyp funktionsname (parameterliste){anweisungsblock}
    // Parameterdefinition: (datentyp name)
    
    void quad(double hans, double &x1, double &x2){
     x1 = hans*hans;     // Uebergabenreihenfolge der Parameter vom Hauptprogramm
     x2 = sqrt(hans);    // ins Unterprogramm und umgekehrt, hängt von Reihenfolge
     return;             // im Funktionsaufruf ab
    }
    

    Hier werden doch die Parameter x1 und x2 ans Hauptprogramm zurückgegeben?

    und

    #include <iostream.h>	
    #include <conio.h>	
    #include <strings.h>    
    
    void einlies(int zeilnr, char hans[41]);
    
    void main (){
    
    	char text[8][41];
    	int i, anz, zeile, stelle[8], ergeb;
    
     	for(zeile=0; zeile<8; zeile++){
        for(i=0; i<41; i++){
         text[zeile][i]= ' ';
        }
        einlies(zeile+1, text[zeile]);
    	}
    
       anz=0;
    
       for(zeile=0; zeile<8; zeile++){
        ergeb = strchar(text[zeile], 'e');
         if(ergeb != -1){
          stelle[zeile] = ergeb +1;
         }
         else stelle[zeile] = 0;
    
          for(i=0; i<40; i++){
           if(text[zeile][i]=='e'){
            anz = anz +1;
           }
    		}
    	}
    
       cout << "Programm zaehlt e´s und gibt das erste Auftreten an." << endl;
    
       for(zeile=0; zeile<8; zeile++){
        cout << text[zeile] << " e tritt an " << stelle[zeile] << " auf" << endl;
    	}
       cout << "Insgesamt " << anz << " 'e' im Text" << endl;
    
    getch();
    }
    
    void einlies(int zeilnr, char hans[41]){
     cout << "Bitte " << zeilnr << ".Zeile eingeben (max. 40 Zeichen):" << endl;
     cin.getline(hans, 41);
     return;
    }
    

    Bei Funktionstypen int und double leuchtet mir das ein, aber wie schon gesagt, verstehe ich nicht wann ich void benötige und wann nicht.

    Danke schon mal für eine Antwort!



  • anfänger_c++ schrieb:

    ich habe schon mehrere Bücher, Foren und Tutorials durchsucht und überall die gleiche Standardantwort gefunden:

    "Wenn eine Funktion keinen Wert zurückgeben soll, wird der Funktionstyp void verwendet."

    Was genau verstehst du denn an dieser "Standardantwort" nicht?

    Sie ist nämlich absolut korrekt und zutreffend.

    Mit Funktionen, die einen Rückgabewert haben, kann man Sachen anstellen wie:
    Variable = Funktion();
    Hier wird der Rückgabewert der Funktion einer Variable zugewiesen.
    Mit einer Funktion ohne Rückgabewert, kann man so etwas nicht machen.



  • Habe auch schon gelesen, dass diese Art von Programmierung nicht mehr Standard ist.

    Inwiefern? Ich glaube du verwechselst etwas! Nicht aus dem C Standarduebernommen wurde leglich die mainmethode mit dem Rueckgabetyp void. Funktionen, die keine Werte zurueck geben, also Rueckgabetyp void haben gibt es natuerlich immer noch.



  • Für deine Fragen ist aber ein tieferes Einsteigen in C++ nötig. Wie sollen wir dir die Antworten geben? Übrigens sieht dein Code oder das Tutorial dazu echt mies aus: <iostream.h> gibt es seit 1998 offiziell NICHT mehr! Auch gibt es void main() seit 1998 nicht mehr. All das wird auf einem heutigen ISO-C++ Compiler nicht durch kompilieren! (und Borland 5 ist Steinzeit!)
    Warum müssen Profs und Studenten immer auf Steinzeit-Dokumentation lehren oder lernen? Ich werde es nie begreifen.

    Zu deinen Fragen:

    1. void als Rückgabetyp heißt "nichts" zurück geben. void kann man in jedem Wörterbuch nachschlagen. Entsprechend gibt deine quad()-Funktion nichts zurück.
    2. Folglich werden auch x1 und x2 nicht zurück gegeben.
    3. x1 und x2 werden an quad() als Referenzen übergeben.
    4. Die Werte von x1 und x2 werden von quad() geändert!
    5. Nach Verlassen von quad() haben zahl1 und zahl2 neue Werte (siehe 3.).



  • Artchi schrieb:

    Warum müssen Profs und Studenten immer auf Steinzeit-Dokumentation lehren oder lernen? Ich werde es nie begreifen.

    Lehrmaterialien und ganze Rechenzentren upzudaten ist eben mit einem gewissen Zeit- und Kostenaufwand verbunden. Und der Nutzen steht halt in keinem Verhältnis dazu.

    Die in diesem Forum häufig kritisierten Dinge, wie alte Header, alte Bücher, void main() usw. ... sind für das Begreifen der Konzepte einer Programmiersprache völlig irrelevant.

    Weiß nicht warum immer wieder darauf rumgehackt wird.



  • Kritiker schrieb:

    Die in diesem Forum häufig kritisierten Dinge, wie alte Header, alte Bücher, void main() usw. ... sind für das Begreifen der Konzepte einer Programmiersprache völlig irrelevant.

    Dann braucht man auch kein C++ dafür hernehmen, oder? Gibt auch einfachere Sprachen wie BASIC oder Pascal, die auch diesen Zweck erfüllen.

    Kritiker schrieb:

    Weiß nicht warum immer wieder darauf rumgehackt wird.

    Weil wenn derjenige in die reale Welt (Arbeitswelt) losgelassen wird, er sich ganz schön wundern wird, warum aktuelle Tools seinen Code nicht schlucken werden. Und WIR hier im Forum dürfen das wieder ausbaden. Oder wer wird dann meistens gefragt werden? Und solange wir hier das kostenlos und freiwillig machen, dürfen wir das auch immer wieder anmerken.



  • Kritiker schrieb:

    Lehrmaterialien und ganze Rechenzentren upzudaten ist eben mit einem gewissen Zeit- und Kostenaufwand verbunden. Und der Nutzen steht halt in keinem Verhältnis dazu.

    Ja, aber es ist ja nicht so, dass das gerade mal seit letztem Jahr so ist. Das ist bereits eine sehr lange Zeit so und du kannst mir nicht sagen, dass die Dokus in der Zeit nicht mindestens einmal überarbeitet worden sind.. Vor allem, da gewisse Dinge nie etwas mit C++ zu tun hatten und somit einfach der Name der Vorlesung von C auf C++ geändert wurde und das ist auch nicht sauber.

    Und vor allem ist es kein Kunststück in der Vorlesung (falls das Material wirklich alt ist) eine Randbemerkung zu machen, dass es veraltet ist. Das ist mit keinem Aufwand verbunden. Und eben mal ein paar Soruce Codes und PP's zu verändern sollte auch im Bereich des Möglichen liegen.



  • @drakon
    Mann muss immer bedenken was in der Lehre bezweckt wird. Und da trägt der aktuelle ISO-Standard nun mal nicht viel zum Wissensgewinn bei. Es mag Professoren geben, die eine ganz exotische oder rein akademische Sprache auswählen wie z.B. Sather (hab ich selbst erlebt), Eiffel, Modula usw. ... was es da auch immer gibt ...
    Der Punkt ist doch, dass weder die Programmiersprache und schon gar nicht eine bestimmte Variante oder ein bestimmter Standard der Programmiersprache im Vordergrund stehen. Darum geht es nicht. Darum geht es vielleicht, wenn du bereits C++-Profi bist und einen 8-Stunden-Kurs für 3000 Euro belegst, aber sicher nicht in der Schule oder im Studium. Dort muss der Schüler/Student eben das nehmen was der Lehrer auf den Übungsblättern sehen will. Aktueller ISO-Standard ist in diesen Fällen einfach noch keine Qualität und kein Zugewinn. Aus meiner Erfahrung kann ich sagen, dass die meisten Lehrer, Laborassistenten, Profs usw. auch ein zwei Worte darüber verloren haben, warum wir jetzt z.B. mit Visual Studio 5 und Oracle 8i arbeiten, wo es doch breits aktuellere Sachen gibt. Gleichzeitig wurden aber auch Lösungen auf Laptops akzeptiert die mit neuerer Software (natürlich geklaut) liefen. 😃

    @Artchi
    Zur Frage nach den Programmiersprachen siehe Antwort an drakon.

    Und beim Thema "reale Welt" kann ich nich verbergen, dass es mich leicht amüsiert deinen Beitrag zu lesen. Du glaubst doch nicht wirklich, dass eine Person, die fürs Programmieren bezahlt wird noch NIE etwas von obiger Problematik gehört hat und sich groß durch iostream.h ... void main() ... usw. Probleme aufhalten lassen wird, welche das Forum hier dann "ausbaden" muss.

    Die Vorstellung ist wirklich lustig. 99% der Fragen hier werden von Anfängern oder Leuten die noch gar nicht angefangen haben gestellt. Und die Tippgeber programmieren teils selbst noch nicht sehr lange in c++. Ich glaube daher um die "Arbeitswelt" brauchst du dir keine Sorgen zu machen bezüglich dieses Themas. 😉 Wer da nicht durchblickt wird auch kein Geld für seine c++-Werke bekommen.



  • Meine Beispiele sind aus meinem aktuellen Info-Skript WS08/09 und wahrscheinlich seit ca. 10-15 Jahren nicht stark verändert worden. Ist leider die Regel, dass Skripte 10 bis 15 Jahre alt sind, teilweise noch älter! (Kleine Anmerkung: Ich zahle alle 3 Monate ca. 600 Euro Studiengebühren!)

    Aber zurück zu void:

    Artchi schrieb:

    ...
    1. void als Rückgabetyp heißt "nichts" zurück geben. void kann man in jedem Wörterbuch nachschlagen. Entsprechend gibt deine quad()-Funktion nichts zurück.
    2. Folglich werden auch x1 und x2 nicht zurück gegeben.
    3. x1 und x2 werden an quad() als Referenzen übergeben.
    4. Die Werte von x1 und x2 werden von quad() geändert!
    5. Nach Verlassen von quad() haben zahl1 und zahl2 neue Werte (siehe 3.).

    Sind die void-Funktionen aus meinen Beispielen dann nicht eigentlich überflüssig? Ich könnte die quad-Fkt. doch auch als double quad ausführen und im zweiten Beispiel das Einlesen auch direkt in das Hauptprogramm schreiben?!



  • @ Kritiker
    Ich finde einfach, dass, wenn man etwas macht es richtig macht. Und vor allem im Info Bereich gibts ja sehr schnell neue Sachen und es werden Sachen unterrichtet, die es vor 3-4 Jahren noch nichteinmal gab. Und da sollte die Qualität der Schule dann scho sein, dass der Stoff einigermassen aktuell gehalten wird, weil das sonst (zumindest für mich) ein sehr schlechtes Bild auf die Schule wirft. (vor allem, wenn es so triviales Zeugs ist).
    Es geht ja nicht darum, dass man auf dem aktuellsten Stand sein muss, aber so alle 1-2 Jahre sollte das Zeugs schon überarbeitet werden.
    Ich habe da lieber eine exotische Sprache richtig ( im Sinne von korrekt), als eine "hochaktuelle" aber dann veraltet.
    Aber zumindest die C++ Skripte müssen in den nächsten paar Jahren umgeschrieben werden. 🙂



  • anfänger_c++ schrieb:

    Sind die void-Funktionen aus meinen Beispielen dann nicht eigentlich überflüssig? Ich könnte die quad-Fkt. doch auch als double quad ausführen und im zweiten Beispiel das Einlesen auch direkt in das Hauptprogramm schreiben?!

    Die Funktionen sind in der Tat merkwürdig. 😉

    Normalerweise sollte eine Funktion eine Aufgabe haben. Du machst jetzt aber zwei Sachen (Quadrat und Wurzel) gleichzeitig.

    Mach es doch so:

    double Quadrat(double Zahl)
    {
        return Zahl*Zahl;
    }
    
    double Wurzel(double Zahl)
    {
        return sqrt(Zahl);
    }
    

    Oder du schreibst dir gar nicht extra Funktionen dafür, sondern schreibst dir den Code gerade in die Datei. Besonders bei sqrt() rufst du ja wiederum nur eine Funktion auf.


Anmelden zum Antworten