Seite 1 von 2

Gibt es einen logischen Fehler in diesem Code?

Verfasst: Mo Sep 07, 2020 10:03 pm
von Orioner

Code: Alles auswählen

if (transportCapacity <= extractedOil[i]) {
	if (sellAmount <= transportCapacity) {
		extractedOil[i] -= sellAmount;
		playerMoney[playerNum] += sellAmount * oilPrice[gameRound];
		//amountAccepted = true;
	}
	else {
		extractedOil[i] -= transportCapacity;
		playerMoney[playerNum] += transportCapacity * oilPrice[gameRound];
		//amountAccepted = true;
	}
}
else {
	if (sellAmount <= extractedOil[i]) {
		extractedOil[i] -= sellAmount;
		playerMoney[playerNum] += sellAmount * oilPrice[gameRound];
		//amountAccepted = true;
	}
	else {
		extractedOil[i] -= extractedOil[i];
		playerMoney[playerNum] += extractedOil[i] * oilPrice[gameRound];
		//amountAccepted = true;
	}
}
Wenn ich diesen Code ausführe, die transportCapacity größer ist als extractedOil[\i] und sellAmount größer ist als extractedOil[\i], sollte eigentlich der else-Zweig des else-Zweiges ausgeführt werden, d.h., playerMoney[playerNum] müsste um den Wert extractedOil[\i] * oilPrice[gameRound] zunehmen. De facto ist es aber so, dass playerMoney[playerNum] sich fast nie ändert. Könnt ihr einen (logischen) Fehler in dem Code entdecken?

Re: Gibt es einen logischen Fehler in diesem Code?

Verfasst: Di Sep 08, 2020 12:01 am
von Xin
Dann ist der Ölpreis vermutlich 0.

Als erstes packst Du mal ein paar printf() in alle Möglichkeiten, um zu gucken, wo Du überhaupt drin landest.
Und dann gibst Du da mal die einzelnen Daten aus, die da verrechnet werden. Eines wird vermutlich unerwartet sein.

Re: Gibt es einen logischen Fehler in diesem Code?

Verfasst: Di Sep 08, 2020 8:11 pm
von Orioner
Der Ölpreis ist fix - immer bei 1,1, bzw. 1.1. Danke für den Tipp, das probiere ich mal aus.

Re: Gibt es einen logischen Fehler in diesem Code?

Verfasst: Mi Sep 09, 2020 10:37 pm
von Orioner
Es ist zum Verrücktwerden. Ich finde den Fehler nicht. In dem einen Moment ist oilPrice alias Raffinerieabnahmepreis = 1.1, im nächsten irgendeine wüste (negative) Zahl und das, obwohl der Wert nirgends geändert wird. Beispielausgabe (gebe ich bei "Wieviel Liter sollen weg?" 70000 an, erhalte ich folgende Ausgabe ab path 2.2):
C:\Andreas\Programme\BCC\Bin>main.exe
Raffinerieabnahmepreis: 1.1

Pumpenanzahl: 0
Versandmenge: 64000
Tankwagen: 0
LKW-Kapazität: 70000
Kapital: 124321

Wieviel Liter sollen weg? 70000
path 2.2
sellAmount 70000
oilPrice -1610612736
transportCapacity 70000
cumPumpCap64000
sellAmount * oilPrice 114688000
Kapital: 124321
Irgendwelche Ideen?

Re: Gibt es einen logischen Fehler in diesem Code?

Verfasst: Do Sep 10, 2020 5:58 am
von nufan
Orioner hat geschrieben:
Mi Sep 09, 2020 10:37 pm
In dem einen Moment ist oilPrice alias Raffinerieabnahmepreis = 1.1, im nächsten irgendeine wüste (negative) Zahl und das, obwohl der Wert nirgends geändert wird
Überprüfe deine Array-Indizes. Eventuell liest bzw. schreibst du irgendwo über die Grenzen hinaus oder Daten sind nicht korrekt initialisiert. Du hast z.B. "oilPrice[gameRound]", ist "oilPrice" für jeden "gameRound"-Index gesetzt?

Re: Gibt es einen logischen Fehler in diesem Code?

Verfasst: Do Sep 10, 2020 7:27 pm
von Orioner
Ja, ist es und dabei greife ich nur auf den Ersten Eintrag (an der Stelle 0), wo der Wert 1.1 ist, zu. Deswegen verstehe ich das Ganze nicht. Auch alle anderen Arrays werden nur an der Stelle 0 angesprochen und sind initialisiert.

Zwischen der erste Ausgabe, wo oilPrice mit 1.1 angegeben wird und der zweiten Ausgabe, wo der Wert sich so seltsam ändert, werden auch gar keine Daten geschrieben. Das ergibt absolut keinen Sinn!

Re: Gibt es einen logischen Fehler in diesem Code?

Verfasst: Do Sep 10, 2020 8:33 pm
von Orioner
Ist diese Zeil vielleicht kritisch (wegen des impliziten Casts - sellAmount int, oilPrice float):

Code: Alles auswählen

printf("sellAmount * oilPrice %d\n", sellAmount * oilPrice[gameRound]);

Re: Gibt es einen logischen Fehler in diesem Code?

Verfasst: Do Sep 10, 2020 8:34 pm
von Xin
Ohne Quellcode kann ich nix lesen... ich sehe nicht, was zwischen der ersten und zweiten Ausgabe passiert.
Aus meiner Erfahrung kann ich Dir aber sagen: Der Compiler tut in der Regel genau das, was Du ihm gesagt hast. Er tut nicht, was Du denkst, was Du ihm gesagt hast. Der Fehler liegt im Regelfall beim Programmierer...

Re: Gibt es einen logischen Fehler in diesem Code?

Verfasst: Do Sep 10, 2020 8:35 pm
von Xin
Orioner hat geschrieben:
Do Sep 10, 2020 8:33 pm
Ist diese Zeil vielleicht kritisch (wegen des impliziten Casts - sellAmount int, oilPrice float):

Code: Alles auswählen

printf("sellAmount * oilPrice %d\n", sellAmount * oilPrice[gameRound]);
Definitiv: da kommt ein float raus, was Du als Integer ausgibst. Du musst %f nehmen.

Re: Gibt es einen logischen Fehler in diesem Code?

Verfasst: Do Sep 10, 2020 8:43 pm
von Orioner
Xin hat geschrieben:
Do Sep 10, 2020 8:34 pm
Der Fehler liegt im Regelfall beim Programmierer...
Ja, das ist schon klar. Ich sehe ihn nur leider nicht (den Fehler). :(

Wenn ich aber einen int in der Ausgabe haben will und auch mit einem int weiterrechnen will?

Das müsste doch gehen:
int var = (int) (sellAmount * oilPrice[gameRound])