Unklare Fehlermeldung
-
Hallo,
das Programm sollte mit Funktionen arbeiten nach einfacher linearer Struktur. Es wird compiliert, aber beim Ablauf erhalte ich diese Fehlermeldung und kann nichts mit anfangen.Die Fehlermeldung lautet: Floating point: Stack underflow
Kann mir jemand helfen? Danke.
#include<iostream.h>
char erste_ausgabe();
float berechnung();
char zweite_ausgabe();char name[50];
float kilometer, liter, verbrauch;char erste_ausgabe()
{
cout<<"Hallo"<<endl;
cout<<"Bitte Namen eingeben: ";
cin>>name;
cout<<"Kilometerzahl:";
cin>>kilometer;
cout<<"Literzahl:";
cin>>liter;
}float berechnung()
{
verbrauch=(liter/kilometer)*100;
}char zweite_ausgabe ()
{
cout <<name<<"verbraucht"<<verbrauch<<"pro 100 Km";
}void main(void)
{
erste_ausgabe();
berechnung ();
zweite_ausgabe ();
}
-
Hallo,
1. Verwende bitte cpp-Tag
2. iostream.h ist veraltet bitte#include <iostream> using namespace std;verwenden
3.main hat als Rückgabetyp nicht void, hatte es niemals und wird es niemals haben
main() hat als Rückgabetyp int
4. Deine Funktionen haben zwar einen Rückgabetyp, aber keine return-Anweisung
5. Bei mir kompiliert dieser Code unter MinGW Developer Studio, er gibt bloß die Warnungen aus, die auf 4. zurückzuführen sind aus:#include<iostream> using namespace std; char erste_ausgabe(); float berechnung(); char zweite_ausgabe(); char name[50]; float kilometer, liter, verbrauch; char erste_ausgabe() { cout<<"Hallo"<<endl; cout<<"Bitte Namen eingeben: "; cin>>name; cout<<"Kilometerzahl:"; cin>>kilometer; cout<<"Literzahl:"; cin>>liter; } float berechnung() { verbrauch=(liter/kilometer)*100; } char zweite_ausgabe () { cout <<name<<"verbraucht"<<verbrauch<<"pro 100 Km"; } int main() { erste_ausgabe(); berechnung (); zweite_ausgabe (); }Was für einen Compiler benutzt du?
MfG Jaschi
-
Hallo,
ich muss den Borland5 - Compiler nutzen.
Den Tag using namespace std; kennt der Copiler nicht. Da bekomme ich eine Fehlermeldung und weiss da nicht weiter.
Compilieren kann ich das Programm auch. Die Fehlermeldung erscheint beim Programmablauf und zwar bei der 3. Funktion zweite_ausgabe.
Gruss tini
-
Was kommt denn für eine Fehlermeldung ich kann sonst leider bloß meine Kristallkugel fragen, aber die funktioniert noch nicht so wie ich das gerne hätte. Muss da wohl noch ein bisschen am Sourcecode feilen.
MfG
-
Deine Funktionen sind falsch. Wenn sie nichts zurückgeben _müssen_ sie den Typ void haben.
Gruß
-
Hallo Probiers ma so:
ich habe zwar nicht soviel Ahnung aber ich benutzte auch den Borland Compiler und bei mir funst es so#include<iostream>
using namespace std;char erste_ausgabe();
float berechnung();
char zweite_ausgabe();char name[50];
float kilometer, liter, verbrauch;char erste_ausgabe()
{
cout<<"Hallo"<<endl;
cout<<"Bitte Namen eingeben: ";
cin>>name;
cout<<"Kilometerzahl:";
cin>>kilometer;
cout<<"Literzahl:";
cin>>liter;
}float berechnung()
{
verbrauch=(liter/kilometer)*100;
}char zweite_ausgabe ()
{
cout <<name<<"verbraucht"<<verbrauch<<"pro 100 Km";
}int main()
{
erste_ausgabe();
berechnung ();
zweite_ausgabe ();
char letter;cin>>letter;
}
-
Hallo Jaschi,
die Fehlermeldung habe ich oben geschrieben, lautet: Floating point: Stack underflow. Und tritt nicht beim Compilieren, sondern während des Programms auf. Interessieren würde mich, was das bedeutet. Ich kann die Rolle des Stacks beim Ablauf des Programms nicht einordnen. Vielleicht kann das jemand kurz erklären.
Gruss Tini
-
Hallo Kowa,
danke dir für deinen Vorschlag. Ich habe nur schon wieder Probleme mit dem "using namespace std;" Es erscheint die Fehlermeldung "namespace name expected". Wozu brauche ich diese Zeile?
Wenn ich das auskommentiere und compiliere, geht es. Doch dann kommt wieder diese Stack-Fehlermeldung.Erfolg hatte ich, indem ich die Funktionstypen herausgenommen habe. So läuft mein Programm:
#include<iostream.h>
erste_ausgabe(),berechnung(),zweite_ausgabe();char name[50];float kilometer, liter, verbrauch;
erste_ausgabe()
{
cout<<"Bitte Namen eingeben: ";cin>>name;
cout<<"Kilometerzahl:";cin>>kilometer;
cout<<"Literzahl:";cin>>liter;
}berechnung()
{
verbrauch=(liter/kilometer)*100;
}zweite_ausgabe ()
{
cout <<name<<"verbraucht"<<verbrauch<<"pro 100 Km";
}void main(void)
{
erste_ausgabe();
berechnung ();
zweite_ausgabe ();
}Gruss tini
-
tini schrieb:
Ich habe nur schon wieder Probleme mit dem "using namespace std;" Es erscheint die Fehlermeldung "namespace name expected". Wozu brauche ich diese Zeile?
Dieser Rat gehörte damit zusammen, iostream.h durch iostream (ohne .h) zu ersetzen. Dabei geht es lediglich darum, den "brandneuen" Standard (erst etwas über 7 Jahre alt) zu befolgen, bei dessen Erscheinen das geändert wurde. Das hat mit deinem Floating-Point-Problem aber überhaupt nichts zu tun.
Erfolg hatte ich, indem ich die Funktionstypen herausgenommen habe. So läuft mein Programm:
Wow. Also wenn das jetzt C wäre, dann würde das bedeuten, dass alle Rückgabetypen implizit auf int geändert worden wären. In C++ ist das eigentlich nicht erlaubt (in C neuerdings auch nicht mehr). Es wäre glaub ich nicht das schlechteste, wenn du dir zumindest für den Anfang einen Compiler suchst, der Standard-C++ etwas besser unterstützt. Eventuell kann man dem Borland da auch mit irgendeiner Option nachhelfen, ich glaube -A (für ANSI), aber guck das mal selber noch nach.
Wie auch immer, so haben alle Funktionen den Rückgabetyp int. Was aber auch relativ egal ist, da du sowieso weder irgendwo einen Wert zurückgibst (return-Anweisung), noch einen zurückgegebenen Wert weiterverwendest. Warum deklarierst du die ganzen Funktionen nicht als void?Die ursprüngliche Fehlermeldung dürfte übrigens direkt damit zusammenhängen. Die Fließkommaeinheit intelkompatibler Prozessoren arbeitet intern mit einem Stack. Das return legt den Rückgabewert darauf ab, und die aufrufende Funktion nimmt den Wert wieder vom Stack runter. Wurde das return weggelassen, greift sie demzufolge ins Leere. Beim Rückgabetyp int ist das anders, int-Werte werden normalerweise im Akkumulatorregister übergeben (EAX), ein fehlendes return wirkt sich einfach nur durch ein normalerweise falsches Ergebnis aus. Aber wie gesagt, das ist prozessorspezifisch und eigentlich auch nicht wichtig zum Verständnis, du solltest nur eins wissen: Eine Funktion, deren Rückgabetyp nicht void ist, darf generell nur durch return verlassen werden, sonst ist das Verhalten undefiniert.