Flytta data i en C array (på en arduino gemma)

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
mikgus
Inlägg: 5
Blev medlem: 23 december 2014, 08:30:34

Flytta data i en C array (på en arduino gemma)

Inlägg av mikgus »

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.

Kod: Markera allt

byte TempAlien = 0;
byte AlienPlace = 0;
int AlienDir = 1;

void loop() {
  for (byte Aliens = 0; Aliens < 9; Aliens++) {
    TempAlien = MapOuter[1][AlienPlace + Aliens + 1];
    MapOuter[1][AlienPlace + Aliens + 1] = MapOuter[1][AlienPlace + Aliens];
    MapOuter[1][AlienPlace + Aliens] = TempAlien;
  }

  //AlienPlace = AlienPlace + AlienDir;
  if (AlienPlace == 7) {
    AlienDir = -1;
  }
  if (AlienPlace == 0) {
    AlienDir = 1;
  }[Code=c file=Untitled.txt]
AlienPlace = AlienPlace + AlienDir;
}[/code]

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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
bit96
Inlägg: 2496
Blev medlem: 3 september 2007, 10:04:29
Ort: Säffle

Re: Flytta data i en C array (på en arduino gemma)

Inlägg 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.
Mr Andersson
Inlägg: 1400
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Flytta data i en C array (på en arduino gemma)

Inlägg 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.

Kod: Markera allt

#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));
}
mikgus
Inlägg: 5
Blev medlem: 23 december 2014, 08:30:34

Re: Flytta data i en C array (på en arduino gemma)

Inlägg 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.
gkar
Inlägg: 1460
Blev medlem: 31 oktober 2011, 15:28:29
Ort: Linköping

Re: Flytta data i en C array (på en arduino gemma)

Inlägg 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.
Det är ju en bra ide, förutom att det är lätt att få buggar med memcpy() tyvärr också...
http://stackoverflow.com/questions/1201 ... and-memcpy
Mr Andersson
Inlägg: 1400
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Flytta data i en C array (på en arduino gemma)

Inlägg 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.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4702
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Flytta data i en C array (på en arduino gemma)

Inlägg av Swech »

Om du istället har individuella koordinater för alla aliens så kan det bli enklare att få till.

alien1 xc= 4, Yc = 0
alien2 xc= 5, Yc = 0
alien3 xc= -1, Yc = -1 betyder nedskjuten
alien4 xc= 6, Yc = 0

så ritar du ut alla aliens genom att söka igenom din alienlista.
Sedan flyttar du på dem separat


Swech
Skriv svar