true wird als false erkannt
-
Hi, in diesem Programm gibt es 50 Lagerplätze. True = besetzt, false = frei.
#include <iostream> using namespace std; //Funktion um einen Freien Lagerplatz zu suchen int Suche(bool Plaetze[50]){ for(int i=0; i<50; i++) { if(Plaetze[i]==false){ cout<<"Lagerplatz "<<Plaetze[i]<<" ist frei."<<endl; return i;} } } int main() { bool Lagerplatz[50]; for(;;){ //Endlosschleife int Platz; Platz = Suche(Lagerplatz); Lagerplatz[Platz]=true; //Hiernach ist Lagerplatz[0] = true cin.get(); } return 0; }
Eigentlich erwarte ich als Ausgabe:
Platz 0 ist frei.
Platz 1 ist frei.
Platz 2 ist frei.
...Ich bekomme aber:
Platz 0 ist frei.
Platz 0 ist frei.
Platz 0 ist frei.
...
-
Du gibst
Plaetze[i]
aus. 0 ist false.Dein Array ist nicht initialisiert!
Suche liefert immer noch nicht in allen Fällen einen Wert.
-
@theAnfänger77 Ich habe dir doch gerade vorhin schon gesagt, dass du mit Warnungen kompilieren sollst und dass deine Funktion fehlerhaft ist. Du solltest sowas wie
warning: control reaches end of non-void function [-Wreturn-type]
bekommen.Außerdem ist dein Lagerplatz nicht initialisiert. Du hast 50 zufällige Werte in Lagerplatz.
Der andere Fehler ist der hier:
cout<<"Lagerplatz "<<Plaetze[i]<<" ist frei."<<endl;
Plaetze[i] ist ein bool, also 0, weil du ja nach false suchst. Du willst ausgeben:
cout<<"Lagerplatz "<< i <<" ist frei."<<endl;
-
Warum machst du es dir so schwer und verwendest keinen std::vector? Evtl solltest du dein Lernmaterial hinterfragen ob es noch zeitgemäß ist.
-
Vielen Dank nochmal!
-
Kleiner Tipp am Rande:
bool Lagerplatz[50]{}; // Alle auf false initialisiert
In C oder älteren Standards:
bool Lagerplatz[50] = {0};
Die Größe des Arrays solltest Du in
Suche
nicht hardcoden, aber das wurde ja schon gesagt.
-
übrigens die verwendung von präprozessorkonstanten, also sowas wie
#define NUMPLAETZE 50 int Suche(bool Plaetze[NUMPLAETZE]) { for(i = 0; i < NUMPLAETZE; i++) ..... } int main() { bool Lagerplatz[NUMPLAETZE]; ..... }
solltest du dir unbedingt angewöhnen. wenn du plötzlich 55 plätze brauchst, musst du bei der verwendung von präprozessorkonstanten nur eine stelle ändern, aber sonst suchst du dich irgendwann tot.
-
@Wade1234
übrigens die verwendung von präprozessorkonstanten [...] solltest du dir unbedingt angewöhnen.
Lach ich dacht grad ich lese nicht richtig :o
Bitte gewöhn dir das nicht an. Wenn schon sowas wie:
constexpr int NUMPLAETZE{50};
-
wtf sowas gibt es?
-
-
-
@HarteWare sagte in true wird als false erkannt:
@Wade1234
übrigens die verwendung von präprozessorkonstanten [...] solltest du dir unbedingt angewöhnen.
Lach ich dacht grad ich lese nicht richtig :o
Bitte gewöhn dir das nicht an. Wenn schon sowas wie:
constexpr int NUMPLAETZE{50};
genau. Wenn überhaupt, dann so. Präprocessor-Konstanten gewöhnt man sich am besten gar nicht an. Und schon gar keine, die mit Programmablauf zu tun haben. Präprocessorkonstanten sind eher was für das Makefile ( -D ).
Abgesehen davon arbeitet man in der Realität selten mit festen Längen von Containern. Die Länge ist meist unbekannt also dynamisch oder sie ergibt sich aus Startparametern der Anwendung oder Konfigurationsdateien.