Probleme mit Funktion



  • Warum funktioniert folgendes Programm nicht?

    #include<iostream>
    using namespace std;
    
    int ergebnisMatrikelnummer[0];
    int ergebnisPunktzahl[0];
    
    int main()
    {
        return 0;
    }
    
    #include<iostream>
    using namespace std;
    #include "Auswertung.h" 
    
        int ergebnisPunktzahl[0];
        int Anzahl=0;
        double klausurdurschnitt=0.0;
        void  klausurdurchschnitt()
        {
              klausurdurschnitt=ergebnisPunktzahl[0]/Anzahl;
              cout<<"Klausurdurchscnitt "<<klausurdurschnitt<<endl;
        }
        /*void  durchfallquote()
        void  bestenote()
        void  durchgefallen()
        void  auflisten()*/
    
    #ifndef _IOSTREAM
    #define _IOSTREAM
    #include <iostream>
    using namespace std;
    #endif
    
    #ifndef _Auswertung_H_INCLUDED_ 
    #define _Auswertung_H_INCLUDED_  
    
        void  klausurdurchschnitt();
        void  durchfallquote();
        void  bestenote();
        void  durchgefallen();
        void  auflisten();
    
    #endif
    
    #include<iostream>
    using namespace std;
    
    #include "Benutzeroberflaeche.h" 
    
    void menu()
    {
         cout<<" +: Klausurergebnis hinzufügen"<<endl;
         cout<<" -: Klausurergebnis entfernen"<<endl;
         cout<<" m: Klausrdurschnitt ausgeben"<<endl;
         cout<<" q: Durchfallquote ausgeben"<<endl;
         cout<<" t: Auflisten der besten Noten"<<endl;
         cout<<" f: Durchgefallene Studenten"<<endl;
         cout<<" l: Klausurergebnisse auflisten"<<endl;
         cout<<" e: Programm beenden"<<endl;
    
         char c='0';
    
         switch(c)
         {
                  case '+':
                       hinzufügen();
                  case '-':
                       loeschen();
                  case 'm':
                       klausurdurchschnitt();
                  case 'q':
                       durchfallquote();
                  case 't':
                       bestenote();
                  case 'f':
                       durchgefallen();
                  case 'l':
                       auflisten();
                  case 'e':
                       beenden();
         }
    }
    
    #ifndef _IOSTREAM
    #define _IOSTREAM
    #include <iostream>
    using namespace std;
    #endif
    
    #ifndef _Benutzeroberflaeche_H_INCLUDED_ 
    #define _Benutzeroberflaeche_H_INCLUDED_  
    
    	void  menu();
    
    #endif
    
    #include<iostream>
    using namspace std;
    
    #include "Ergebnisverwaltung.h"
    
    int Anzahl=0;
    
    void hinzufügen()
    {
    
         cout<<"Bitte geben Sie die Anzahl der mitgeschriebenen Klausuren ein"<<endl;
         cin>>Anzahl
         for(int i=0; i<Anzahl;i++)
         {
                 cout<<"Ergebnis sowie Matrikelnummer ein geben"<<endl;
                 cin>>ergebnisMatrikelnummer[0];
                 cin>>ergebnisPunktzahl[0];
         }
    }
    
    #ifndef _IOSTREAM
    #define _IOSTREAM
    #include <iostream>
    using namespace std;
    #endif
    
    #ifndef _Ergebnisverwaltung_H_INCLUDED_ 
    #define _Ergebnisverwaltung_H_INCLUDED_  
    
    	void hinzufügen();
    
    #endif
    


  • Hallo,

    Du solltest nochmal was über Arrays lesen.
    Das hier

    int ergebnisMatrikelnummer[0]
    

    erzeugt ein Array der Größe 0. Jeder Zugriff auf solch ein Array erzeugt undefiniertes Verhalten.



  • ergebnisMatrikelnummer[0]
    

    greift auf das 1. Element zu. Das Array hat aber nur 0.



  • Braunstein schrieb:

    Das hier

    int ergebnisMatrikelnummer[0]
    

    erzeugt ein Array der Größe 0. Jeder Zugriff auf solch ein Array erzeugt undefiniertes Verhalten.

    Wie funktioniert das in der Praxis überhaupt? Muss nicht jedes Datum eine Größe != 0 haben damit man die Adresse nehmen kann? Warum ist so etwas überhaupt erlaubt und wozu braucht man das und müsste da nicht zumindest der Compiler warnen?



  • Reeko25 schrieb:

    Warum funktioniert folgendes Programm nicht?

    #include<iostream>
    using namespace std;
    
    int ergebnisMatrikelnummer[0];
    int ergebnisPunktzahl[0];
    
    int main()
    {
        return 0;
    }
    

    "funktioniert nicht" ist eine ungenügende Fehlerbeschreibung 🙄 . Aber ein Blick in main zeigt, erst mal, was das Programm überhaupt machen soll. Nämlich gar nichts. Und das funktioniert nicht 😕 .



  • TNA schrieb:

    Wie funktioniert das in der Praxis überhaupt? Muss nicht jedes Datum eine Größe != 0 haben damit man die Adresse nehmen kann? Warum ist so etwas überhaupt erlaubt und wozu braucht man das und müsste da nicht zumindest der Compiler warnen?

    In C++ ist es illegal, ein Array der Länge 0 zu deklarieren. Ob und wie das akzeptiert wird hängt dann vom Compiler ab.

    (mittels new[] darf man trotzdem ein Array der Länge 0 erstellen)

    Edit: Quellen:

    ISO/IEC 14882:2003 8.3.4/1:
    If the constant-expression (5.19) is present, it shall be an integral constant expression and its value shall be greater than zero.

    ISO/IEC 14882:2003 5.3.4/6:
    The expression in a direct-new-declarator shall have integral or enumeration type (3.9.1) with a non-negative value.


  • Mod

    TNA schrieb:

    Wie funktioniert das in der Praxis überhaupt? Muss nicht jedes Datum eine Größe != 0 haben damit man die Adresse nehmen kann? Warum ist so etwas überhaupt erlaubt und wozu braucht man das und müsste da nicht zumindest der Compiler warnen?

    Relikt aus alten Zeiten, um dynamische Arrays zu erzeugen. Kann unter Umständen auch heute noch nützlich sein, da es die Daten schön beisammen hält:

    struct foo
    {
      int blah, bluh, blupp;
      int bar[0];  // Größe soll dynamisch sein
    }; 
    
    // sizeof(struct foo) sollte sizof(int[3]) entsprechen
    
    struct foo *f = malloc(sizeof(*f) + 4 * sizeof(int));  // Voila, auf dem Heap liegt nun ein struct foo, welches ein Array der Größe 4 enthält.
    // Bemerkung: Das Array ist wirklich in dem Objekt enthalten. Da sind keine Zeiger auf dynamischen Speicher im Objekt. Alles ist beisammen.
    

    P.S.: Die Unterstützung der Schreibweise mit der 0 ist anscheinend eine GCC-Erweiterung, in "richtigem" C muss man [] schreiben.



  • @SeppJ: Jetzt wo du es sagst: So etwas habe ich mit schaudern schon mal in altem Code gesehen und ich verstehe jetzt auch, wie das funktioniert. Da muss man aber schon aus der C-Ecke kommen und das nachzuvollziehen.


Anmelden zum Antworten