Gibt es einen logischen Fehler in diesem Code?

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Gibt es einen logischen Fehler in diesem Code?

Beitrag von Orioner » Mo Sep 07, 2020 10:03 pm

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?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Xin » Di Sep 08, 2020 12:01 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Orioner » Di Sep 08, 2020 8:11 pm

Der Ölpreis ist fix - immer bei 1,1, bzw. 1.1. Danke für den Tipp, das probiere ich mal aus.

Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Orioner » Mi Sep 09, 2020 10:37 pm

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?

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von nufan » Do Sep 10, 2020 5:58 am

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?

Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Orioner » Do Sep 10, 2020 7:27 pm

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!

Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Orioner » 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]);
Zuletzt geändert von Orioner am Do Sep 10, 2020 8:34 pm, insgesamt 1-mal geändert.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Xin » Do Sep 10, 2020 8:34 pm

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...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Xin » Do Sep 10, 2020 8:35 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Orioner » Do Sep 10, 2020 8:43 pm

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])

Antworten