Har försökt massa olika varianter men inte fått till det. Koden nedan är väl någstans i mitten av alla försök, det är samma som snurrar på youtube klippet.
Har en 16 posters bred array. Försöker flytta de första nio värdena ett steg till höger åt gången tills dom når den högra kanten.
När värdena är längst till höger ska dom flyttas tillbaka ett steg åt gången tills allt ser ut som från början.
När AlienPlace antar värdet 7 och Aliens antar värdet 8 kommer det tillsamman med +1 bli totalt 16 i din loop.
Vilket är utanför arrayen som troligtvis ligger mellan 0 och 15.
Utan att orka kolla alla värden, prova med att ändra villkoren AlienPlace==7 till ==6.
Det kan vara nåt annat logiskt fel i och för sig.
Jag hade använt memmove() och memcpy() istället för att skriva en egen flytt-loop.
Dels så är det mindre risk för buggar, och så brukar standardbiblioteken vara ganska hårt optimerade.
T.ex.
#include <string.h> // för memcpy & memmove
enum Direction { Left, Right };
const int x_size = 16; // Undvik magic numbers
// dir == Right:
// Kopiera cell 0-14 ett steg åt höger. Sätt cell 0 till 0 eller gamla cell 15 beroende på värdet av wrapAround.
// dir == Left:
// Kopiera cell 1-15 ett steg åt vänster. Sätt cell 15 till 0 eller gamla cell 0 beroende på värdet av wrapAround.
void MoveX(Direction dir, int row, bool wrapAround = false)
{
byte savedAlien = 0;
if (wrapAround)
savedAlien = MapOuter[row][(dir == Right ? (x_size-1) : 0)];
byte* position = &MapOuter[row][0] + (dir == Right ? 0 : 1);
memmove(position + (dir == Right ? 1 : -1), position, (x_size-1) * sizeof(byte));
MapOuter[row][(dir == Right ? 0 : (x_size-1))] = savedAlien;
}
// Kopierar rad fromRow till toRow. Fyller sen fromRow med 0.
void MoveY(int fromRow, int toRow)
{
byte* fromPos = &MapOuter[fromRow][0];
byte* toPos = &MapOuter[toRow][0];
memcpy(toPos, fromPos, x_size * sizeof(byte));
memset(fromPos, 0, x_size * sizeof(byte));
}
Mr Andersson skrev:Jag hade använt memmove() och memcpy() istället för att skriva en egen flytt-loop.
Dels så är det mindre risk för buggar, och så brukar standardbiblioteken vara ganska hårt optimerade.
T.ex.
Inte om man använder den på rätt sätt. Som programmerare bör man lära sig att kunna läsa dokumentation.
Det står ju ganska tydligt att konstiga saker kan hända om källa och destination överlappar varandra. Och är man osäker, så använd memmove istället.