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 hierint 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.
-
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.