Permalänk
Medlem

Minus i if-sats

Fattar inte.

Har problem när truck.startX blir minus. Ibland hoppar den till else och ibland går det igenom.

foreach (char c2 in drive) { if (truck.startX >= 0) { if (truck.startY >= 0) { if (truck.startX <= roomXmax) { if (truck.startY <= roomYmax) { turn = false; Moving(Char.ToUpper(c2), truck, turn); } else { Console.WriteLine("Du har kört in i norra väggen!"); success = ErrorHandling(); } } else { Console.WriteLine("Du har kört in i östra väggen!!"); success = ErrorHandling(); } } else { Console.WriteLine("Du har kört in i södra väggen!!"); success = ErrorHandling(); } } else { Console.WriteLine("Du har kört in i västra väggen!"); success = ErrorHandling(); } } if (success == true) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(); Console.WriteLine("Simulationen lyckades!"); Console.WriteLine("Bilens X-värde: " + truck.startX); Console.WriteLine("Bilens Y-värde: " + truck.startY); Console.WriteLine("Bilens riktning: " + truck.direction); } }

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem

vad sätter du success till? initialiserat till true?

Permalänk
Medlem

Va?
Menar du att truck.startX har negativt värde men "if (truck.startX >= 0)" ändå evalueras som att vara sant? Låter ju väldigt orimligt. Vilket värde har truck.startX när den "ibland" evalueras som sant trotts att värdet är negativt då?

Visa signatur

Huvudriggen är en Gigabyte Aorus Xtreme | 128gb DDR5 6000 | Ryzen 7950X | 3080Ti
Utöver det är det för många datorer, boxar och servar för att lista :P

Permalänk
Medlem

Om du ställer dig på (0,0) och kör vänster så blir startX antagligen -1. Du har inget som hindrar det vad jag kan se.

Permalänk
Medlem
Skrivet av pacc:

vad sätter du success till? initialiserat till true?

Ja

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem

@Larsp777:

Menar du kanske att några gånger när "success == true" så är truck.startX = -1?

Detta är fullt möjligt då truck kan stå på position 0 (vilket du anser är korrekt) och därefter förflytta sig till horisontellt (x) åt vänster med ett steg (-1) och då är truck utanför spelplanen. Alltså startX = -1.

Du borde istället vända på steken och kontrollera om det är ett godkänt steg som truck tar istället för att göra det vid nästa förflyttning.
Detta kan du göra antingen genom att tillåta alla former av rörelser och direkt efter kontrollera om truck är utanför spelplanen.
Alternativt kan du kontrollera vilket steg som truck ska ta och validera att denna rörelse är korrekt innan den utförs.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem
Skrivet av KAD:

Om du ställer dig på (0,0) och kör vänster så blir startX antagligen -1. Du har inget som hindrar det vad jag kan se.

Denna raden borde väl hindra?

[code]
if (truck.startX >= 0)
[/code)

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem
Skrivet av Leedow:

@Larsp777:

Menar du kanske att några gånger när "success == true" så är truck.startX = -1?

Detta är fullt möjligt då truck kan stå på position 0 (vilket du anser är korrekt) och därefter förflytta sig till horisontellt (x) åt vänster med ett steg (-1) och då är truck utanför spelplanen. Alltså startX = -1.

Du borde istället vända på steken och kontrollera om det är ett godkänt steg som truck tar istället för att göra det vid nästa förflyttning.
Detta kan du göra antingen genom att tillåta alla former av rörelser och direkt efter kontrollera om truck är utanför spelplanen.
Alternativt kan du kontrollera vilket steg som truck ska ta och validera att denna rörelse är korrekt innan den utförs.

Min tanke var att om truck.startX är -1 så är jag utanför spelplanen.

Då borde den gå till else.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem

@Larsp777:

Ja, fast inte om det är det sista steget. Om sista steget är att förflytta sig till vänster och truck redan står på position 0 så kommer den stanna på -1 och success kommer vara true.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

@Larsp777:

Ja, fast inte om det är det sista steget. Om sista steget är att förflytta sig till vänster och truck redan står på position 0 så kommer den stanna på -1 och success kommer vara true.

Ok, så success kanske är problemet?

Får fundera på det och även på det du sa om att kolla först.

Ska testa senare och har kanske fler frågor.

Tack!

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
99:e percentilen

Jag tror att du kan strukturera din kod bättre; göra den enklare att förstå och överblicka. Då blir det lättare att upptäcka och lösa buggar. Bara den kod du postat har ganska många nivåer av if … else-satser, med mycket state (success etc) som lever och modifieras genom hela alltet, och att döma av indenteringen ligger den redan djupt in i omgivande kod.

(Skulle dessutom säga att problemet förstärks av att du sätter inledande måsvingar på en egen rad, vilket totalt ger 10 extra rader bara i den kod du postat. Detta är dock en fråga om personlig preferens.)

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem
Skrivet av Alling:

Jag tror att du kan strukturera din kod bättre; göra den enklare att förstå och överblicka. Då blir det lättare att upptäcka och lösa buggar. Bara den kod du postat har ganska många nivåer av if … else-satser, med mycket state (success etc) som lever och modifieras genom hela alltet, och att döma av indenteringen ligger den redan djupt in i omgivande kod.

(Skulle dessutom säga att problemet förstärks av att du sätter inledande måsvingar på en egen rad, vilket totalt ger 10 extra rader bara i den kod du postat. Detta är dock en fråga om personlig preferens.)

Ja, har nog en förmåga att göra det för komplicerat.

Angående måsvingarna tror jag att mitt sätt är så man ska göra i C# och ditt sätt i t.ex. java.

Sedan måste man väl inte följa det alltid.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem
Skrivet av Leedow:

@Larsp777:

Ja, fast inte om det är det sista steget. Om sista steget är att förflytta sig till vänster och truck redan står på position 0 så kommer den stanna på -1 och success kommer vara true.

Kan du förklara lite närmare. Tror du har rätt.

Tycker dock att när jag kommer till raden:

if (truck.startX >= 0)

Så borde den gå till else där. Fast du menar att det inte testas förrän nästa varv?

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem
Skrivet av Larsp777:

Fast du menar att det inte testas förrän nästa varv?

Som du har det nu så kollar du för varje körinstruktion så att bilen inte kört av banan, och annars flyttar du bilen enligt instruktionen. Sen tar du nästa instruktion, kollar att bilen är kvar på banan, utför instruktionen, etc. Du kommer alltså aldrig kontrollera följderna av den sista instruktionen, eftersom loopen avslutas innan du hinner göra det. Du kan lätt se detta om du använder debuggern för att stega igenom programmet och se vad som händer.

Istället för att kontrollera bilens position innan nästa instruktion utförs så bör du som sagt göra kontrollen direkt efter att du flyttat bilen, eller ta reda på om instruktionen är giltig innan du flyttar bilen.

Permalänk
Medlem
Skrivet av perost:

Som du har det nu så kollar du för varje körinstruktion så att bilen inte kört av banan, och annars flyttar du bilen enligt instruktionen. Sen tar du nästa instruktion, kollar att bilen är kvar på banan, utför instruktionen, etc. Du kommer alltså aldrig kontrollera följderna av den sista instruktionen, eftersom loopen avslutas innan du hinner göra det. Du kan lätt se detta om du använder debuggern för att stega igenom programmet och se vad som händer.

Istället för att kontrollera bilens position innan nästa instruktion utförs så bör du som sagt göra kontrollen direkt efter att du flyttat bilen, eller ta reda på om instruktionen är giltig innan du flyttar bilen.

Flyttade anropet som flyttar bilen till innan if-satserna. Nu verkar det fungera. Tack!

Tack till alla som hjälpt till. Hoppas allt fungerar nu.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10