Void Erklären für meinen Ausbildungsleiter



  • Amazonasmann schrieb:

    Der Datentyp void läßt sich vielleicht am besten mit "leerer Datentyp" beschreiben.

    Ich würde das als halben Fehler ansehen. Für mich ist void kein Datentyp, auch kein leerer Datentyp.

    Amazonasmann schrieb:

    void gehört zu ANSI-C und ist in früheren C-Versionen nicht vorhanden.

    Das wäre mir neu, und kann ich mir nicht vorstellen, müsste aber selbst nachprüfen um hier sicher zu sein.

    Amazonasmann schrieb:

    Wann wird void verwendet?
    1. Als Ergebnistyp von funktionen

    Hier gilt meine gleiche Aussage von oben. Für mich genauer: "Bei Funktionen, um anzuzeigen das diese nichts zurückgeben". Nachtrag: Unterhalb hast du dies auch so stehen, mich stört hier aber "Ergebnistyp", da void eigentlich nichts ist...

    Amazonasmann schrieb:

    2. für leere Paramterlisten von Funktionen

    Ist das in C eigentlich noch verpflichtend? In C++ wäre es möglich, aber üblicher diese tatsächlich leer zu lassen.

    Amazonasmann schrieb:

    3. zur Kennzeichnung von Zeigern denen kein Datentyp zugeordnet ist

    Vielleicht besser: Zur Kennzeichnung von Zeigern unbekannten Typs.
    Den das was du einem void-Zeiger zuweist, besitzt schon einen Typ, void-Zeiger verfügen aber nicht über die Information was für einen Typ.

    Bezüglich Polymorphie hast du meiner Meinung nach zu wenig Eigeninitiative eingesetzt, und mir wäre dies auch zu unspezifisch und allgemein.
    Ich gebe dir als weiteren Typ für die Suche "Vererbung", "virtual" (Letzteres nur unter C++).

    cu André



  • asc schrieb:

    Ist das in C eigentlich noch verpflichtend? In C++ wäre es möglich, aber üblicher diese tatsächlich leer zu lassen.

    In C sind leere Parameterlisten imho äquivalent zu Ellipsen. Void in Parameterlisten ist also notwendig.



  • Amazonasmann schrieb:

    Polymorphie steht in direktem Zusammenhang mit der Vererbung

    Nö 🙂 Es gibt statische und dynamische Polymorphie, du meinst hier dynamische Polymorphie. Statische Polymorphie sieht so aus, deine Aussage "ermöglicht es, verwandte Objekte gemeinsam zu verarbeiten, ohne vorher die Klassenzugehörigkeit ermitteln zu müssen." passt dazu aber auch:

    template<typename T> void foo( const T& t )
    {
        int i = t.getVal(); // Hier muss der Typ T ein bestimmtes Interface aufweisen
        ...
    }
    

    edit: Überladung gilt glaubich auch als statische Polymorphie.



  • @Badestrand: Nur hier würde ich aufpassen. Es mag alles richtig sein, was du sagst. Allerdings vermute ich, dass, wenn Amazonasmann das in seinen Text mitreinbringt, sein Lehrer sagt, das wäre Schwachsinn. Ausser er hat einen tatsächlich guten Lehrer, der richtiges C++ kann. Ich bezweifle das aber, da Amazonasmann sich mit void-Zeigern herumschlagen muss. Etwas, dass ein C++ Programmierer wohl eher selten tut.



  • @Don06 ich muss mich nicht mit Void-Zeigern beschäftigen, sondern lediglich erklären was void ist 🙂
    Mein Ausbildungsleiter in der Firma ist auch ein Prüfer für Abschlussprüfungen in meiner Umgebung. Er Programmiert denke ich schon über 20Jahre mit C..



  • Amazonasmann schrieb:

    Er Programmiert denke ich schon über 20Jahre mit C..

    Dann wird er möglicherweise nicht allzu viel über (dynamische) Polymorphie wissen 😉

    asc schrieb:

    Für mich ist void kein Datentyp, auch kein leerer Datentyp.

    Darüber kann man sich jetzt streiten. Was würdest du auf die Frage antworten, welchen Rückgabetyp eine void -Funktion hat? Wahrscheinlich "keinen". Und was für einen hat dann ein Konstruktor oder Destruktor? 😉

    Ich finde es, vielleicht gerade für Anfänger, besser, wenn da besser abgegrenzt wird. "Leerer Datentyp" ist zwar auch nicht ganz das Wahre, aber einfach rein gar nichts ist void ja doch nicht. Oder was sind dann die Rückgabetypen von Ctors/Dtors, wenn void bereits nichts ist? 🙂



  • asc schrieb:

    Ich würde das als halben Fehler ansehen. Für mich ist void kein Datentyp, auch kein leerer Datentyp.

    Du betonst wahrscheinlich Datentyp, denn ein Typ ist void auf jeden Fall. Da im C++-Standard nirgends von Datentypen die Rede ist, sondern nur von object types, function types und incomplete types (void ist ein solcher), kann man darüber auch nicht so richtig streiten.

    Das wäre mir neu, und kann ich mir nicht vorstellen, müsste aber selbst nachprüfen um hier sicher zu sein.

    Im K&R I (deutsche Übersetzung von 1983) wird void zumindest nirgends verwendet, es taucht nur im Anhang auf (wobei der laut Vorwort auch Elemente enthält, die in der ursprünglichen Ausgabe von 1978 nicht enthalten sind.)

    Amazonasmann schrieb:

    2. für leere Paramterlisten von Funktionen

    Ist das in C eigentlich noch verpflichtend? In C++ wäre es möglich, aber üblicher diese tatsächlich leer zu lassen.

    Das ist dieses blöde Kompatibilitätsproblem. In K&R hat man halt Funktionen grundsätzlich ohne Parameter deklariert. Will man also in ANSI-C eine Prototypdeklaration anlegen, die eine leere Parameterliste hat, muss man zur Unterscheidung ein void hinschreiben. Tiefere Logik steckt da nicht dahinter, deshalb würde ich auch empfehlen, das in C++ nicht zu machen, auch wenn es geht.

    Vielleicht besser: Zur Kennzeichnung von Zeigern unbekannten Typs.

    Vorschlag: "unbestimmten" Typs.



  • Nexus schrieb:

    asc schrieb:

    Für mich ist void kein Datentyp, auch kein leerer Datentyp.

    Darüber kann man sich jetzt streiten.

    Ja kann man, ich habe nicht ohne Grund "halber" Fehler geschrieben. Als Dozent würde ich hier vermutlich keinen Punkt abziehen und dennoch eine kleine Anmerkung schreiben (mit dem Hinweis das dies eine "Grauzone" ist).

    Nexus schrieb:

    Was würdest du auf die Frage antworten, welchen Rückgabetyp eine void -Funktion hat? Wahrscheinlich "keinen". Und was für einen hat dann ein Konstruktor oder Destruktor? 😉

    In beiden fällen keinen, wobei bei Funktionen/Methoden mit ausnahme des Konstruktors und Destruktors void angegeben werden muss 😉

    Ja, wie gesagt kann man darüber streiten, der Grund für meine Haltung ist aber gerade ein Anfänger gewesen (der seine Probleme mit void hatte).

    Nexus schrieb:

    Ich finde es, vielleicht gerade für Anfänger, besser, wenn da besser abgegrenzt wird. "Leerer Datentyp" ist zwar auch nicht ganz das Wahre, aber einfach rein gar nichts ist void ja doch nicht. Oder was sind dann die Rückgabetypen von Ctors/Dtors, wenn void bereits nichts ist? 🙂

    Das sehe ich eher als Sonderstellung an. Ebenso wie die Sonderregel das int main implizit ein return 0 macht.

    cu André



  • Bashar schrieb:

    Du betonst wahrscheinlich Datentyp, denn ein Typ ist void auf jeden Fall. Da im C++-Standard nirgends von Datentypen die Rede ist, sondern nur von object types, function types und incomplete types (void ist ein solcher), kann man darüber auch nicht so richtig streiten.

    Okay, mit den 3 Unterscheidungen ist es tatsächlich abgrenzbar sein, wobei ich mir Vorstellen kann das "incomplete Type" als Begriff auch einige Fragen aufwirft.

    Bashar schrieb:

    Vorschlag: "unbestimmten" Typs.

    Das ist ein guter Vorschlag 😉

    cu André



  • Badestrand schrieb:

    Amazonasmann schrieb:

    Polymorphie steht in direktem Zusammenhang mit der Vererbung

    Nö 🙂 Es gibt statische und dynamische Polymorphie, du meinst hier dynamische Polymorphie. Statische Polymorphie sieht so aus, deine Aussage "ermöglicht es, verwandte Objekte gemeinsam zu verarbeiten, ohne vorher die Klassenzugehörigkeit ermitteln zu müssen." passt dazu aber auch:

    template<typename T> void foo( const T& t )
    {
        int i = t.getVal(); // Hier muss der Typ T ein bestimmtes Interface aufweisen
        ...
    }
    

    edit: Überladung gilt glaubich auch als statische Polymorphie.

    Wenn dieses statische Zeugs Polymorphie ist, dann ist jede Mehrdeutigkeit Polymorphie. Dann ist die Bezeichnung irgendwie sinnlos.



  • 700 Mrd. $ Packet schrieb:

    Badestrand schrieb:

    Amazonasmann schrieb:

    Polymorphie steht in direktem Zusammenhang mit der Vererbung

    Nö 🙂 Es gibt statische und dynamische Polymorphie, du meinst hier dynamische Polymorphie. Statische Polymorphie sieht so aus, deine Aussage "ermöglicht es, verwandte Objekte gemeinsam zu verarbeiten, ohne vorher die Klassenzugehörigkeit ermitteln zu müssen." passt dazu aber auch:

    template<typename T> void foo( const T& t )
    {
        int i = t.getVal(); // Hier muss der Typ T ein bestimmtes Interface aufweisen
        ...
    }
    

    edit: Überladung gilt glaubich auch als statische Polymorphie.

    Wenn dieses statische Zeugs Polymorphie ist, dann ist jede Mehrdeutigkeit Polymorphie. Dann ist die Bezeichnung irgendwie sinnlos.

    Uiii, das erinnert mich an einen ellenlangen Thread wos genau darum ging:
    Polimorphie - dynamisch, statisch, Überladung, Templates ???
    Simon



  • [quote="asc"]

    Amazonasmann schrieb:

    Ich würde das als halben Fehler ansehen. Für mich ist void kein Datentyp, auch kein leerer Datentyp.

    Das liegt aber auch daran, dass du eine absolut beschissene und zudem auch noch vollkommen falsche Vorstellung davon hast, was ein Datentyp ist.


  • Mod

    Bashar schrieb:

    Vielleicht besser: Zur Kennzeichnung von Zeigern unbekannten Typs.

    Vorschlag: "unbestimmten" Typs.

    Besser: "unvollständig".
    Unbestimmt wäre indeterminate, was sich für gewöhnlich auf Objektzustände bezieht.



  • Void is a type specifying a typeless type.



  • camper schrieb:

    Besser: "unvollständig".
    Unbestimmt wäre indeterminate, was sich für gewöhnlich auf Objektzustände bezieht.

    incomplete gibts aber schon



  • C99 schrieb:

    The void type comprises an empty set of values; it is an incomplete type that cannot be completed.



  • 700 Mrd. $ Packet schrieb:

    Wenn dieses statische Zeugs Polymorphie ist, dann ist jede Mehrdeutigkeit Polymorphie. Dann ist die Bezeichnung irgendwie sinnlos.

    Was kennst du denn noch an Mehrdeutigkeiten? Ich verstehe Polymorphie jedenfalls so, dass je nach Typ mit dem gleichen Code Unterschiedliches passiert. Und genau das ist ja sowohl bei klassischer/dynamischer Polymorphie als auch bei template- und Überladungs-Polymorphie der Fall.
    edit: Natürlich nicht Überladung mit verschiedener Parameter-Anzahl, sondern unterschiedlichen Typen in der Signatur.



  • ertappt! das gibts ja wohl nicht! du sollst die aufgabe selber erledigen und nicht irgendwem übertragen! sofort gefeuert.



  • Badestrand schrieb:

    Was kennst du denn noch an Mehrdeutigkeiten? Ich verstehe Polymorphie jedenfalls so, dass je nach Typ mit dem gleichen Code Unterschiedliches passiert. Und genau das ist ja sowohl bei klassischer/dynamischer Polymorphie als auch bei template- und Überladungs-Polymorphie der Fall.
    edit: Natürlich nicht Überladung mit verschiedener Parameter-Anzahl, sondern unterschiedlichen Typen in der Signatur.

    Polymorphie überladener Operatoren
    "text"+"text2"
    1+4
    Was + bedeutet ist nicht eingeutig ohne den typ. + ist Vielgestaltigkeit
    4.0
    bar.foo()
    Ebenfalls Polymorphie? Was . bedeutet ist auch nicht eindeutig. . ist doch auch Vielgestaltigkeit, oder?



  • Der Begriff "Polymorphie" ist einfach nicht eindeutig. Deshalb muss man sich vor endgültigen Aussagen hüten. Es kommt immer darauf an, wie Lehrer, Autoren, usw. den Begriff einführen und verwenden. Häufig spricht man bei Überladung überhaupt nicht von Polymorphie und der Satz von Amazonasmann, dass Polymorphie in direktem Zusammenhang mit Vererbung steht kann durchaus völlig richtig sein.


Anmelden zum Antworten