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.
Youtube klipp för att visa hur det ser ut just nu.
Bifogar bild för visa vad jag menar. Dom mörkgrå posterna är dom viktiga, gula och vita är tomma.
Re: Flytta data i en C array (på en arduino gemma)
Postat: 29 juni 2015, 20:43:45
av bit96
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.
Re: Flytta data i en C array (på en arduino gemma)
Postat: 30 juni 2015, 05:21:54
av Mr Andersson
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));
}
Re: Flytta data i en C array (på en arduino gemma)
Postat: 30 juni 2015, 20:39:30
av mikgus
Tackar.
bit96 ändrar jag ==7 till ==6 så blir det kvar en alien i högerkanten, det är något mer felar.
Mr. Andersson ska kopiera in koden och se om den fungerar och sen försöka lista ut varför
Senast jag programerade något innan jag började med arduino var i qbasic/quickbasic så det är mycket att lära.
Re: Flytta data i en C array (på en arduino gemma)
Postat: 1 juli 2015, 01:26:37
av gkar
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.
Re: Flytta data i en C array (på en arduino gemma)
Postat: 1 juli 2015, 08:51:22
av Mr Andersson
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.
Re: Flytta data i en C array (på en arduino gemma)
Postat: 1 juli 2015, 12:26:45
av Swech
Om du istället har individuella koordinater för alla aliens så kan det bli enklare att få till.