Forum: Compiler & IDEs Speicherzuweisung von 2 zwei 2dim Arrays vertauschen


von Alex (Gast)


Lesenswert?

Hallo,

ich habe eine Frage zu zwei 2dimensionalen Arrays (8x8), in dem 8bit 
Daten gespeichert sind. Array1 und Array2 zeigen auf einen bestimmten 
Bereich im Speicher. Diese Zuweisung soll nun vertauscht werden:

vorher:
Array1 => Speicherbereich1
Array2 => Speicherbereich2

nachher:
Array1 => Speicherbereich2
Array2 => Speicherbereich1

Meine bisherige Lösung sieht bisher folgendermaßen aus. Ich habe die 
zwei Arrays angelegt. Zusätzlich dazu zwei Zeiger, die auf das erste 
Element im Speicher der beiden Arrays zeigen:
1
volatile uint8_t currentFrame [8][8];
2
volatile uint8_t nextFrame [8][8];
3
volatile uint8_t *cfPointer = &currentFrame[0][0];
4
volatile uint8_t *nfPointer = &nextFrame[0][0];

Das vertauschen dieser Zeiger habe ich hinbekommen:
1
uint8_t *ptr = cfPointer;
2
cfPointer = nfPointer;
3
nfPointer = ptr;

Damit muss ich aber jetzt beim Zugriff auf diese Daten den Pointer 
benutzen und z.B. aus
1
PORTC = currentFrame[row][ct]
wird
1
PORTC = *(cfPointer+row*8+ct)

Es funktioniert zwar und vielleicht behalte ich es auch fast so bei (nur 
Arraydefinition+Pointer mit malloc+Pointer austauschen). Die Lösung mit 
pointer auf Speicher ist näher an der Hardware, da 2dim im Speicher 
sowieso hintereinander angeordnet wird, aber irgendwie geht auch 
Transparenz/Lesbarkeit verloren.

Nun die Frage:
Wie kann ich die Zuweisung zum Speicher bei 2dim Arrays nach dem Prinzip 
ganz oben ändern?
So etwas nach der Art
"currentFrame = &nextFrame"


Hintergrund:
Array 1 heißt currentFrame, auf das in schneller Abfolge von einer 
Interruptroutine lesend zugegriffen wird. Array 2 heißt nextFrame und 
wird von der main Routine neu aufgebaut und geschrieben. In einer 
zweiten Interruptroutine sollen die Daten von nextFrame dem Array 
currentFrame übergeben werden. Ein kopieren der Elemente wäre zwar 
möglich, kostet aber wertvolle Rechenzeit.

Info:
Entwicklungsumgebung: AVR Studio 5
Compiler: GCC
C-Kenntnisse: Gerade erst damit angefangen

von Martin (Gast)


Lesenswert?

Alex schrieb:
> Damit muss ich aber jetzt beim Zugriff auf diese Daten den Pointer
> benutzen und z.B. ausPORTC = currentFrame[row][ct]wirdPORTC = 
*(cfPointer+row*8+ct)

Nein. Mach doch einfach PORTC = cfpointer[(row * 8) + ct)]; draus.

von Klaus W. (mfgkw)


Lesenswert?

Vorschlag:
Mach aus deinen zwei zweidimensionalen Feldern ein dreidimensionales.
Die äußerste Dimension hat 2 Elemente, jeweils eines der beiden 
bisherigen Felder.
toll[0][i][j] ist also erstmal dein bisheriges currentFrame[i][j], und 
toll[1][i][j] ist dein bisheriges nextFrame[i][j].
Jetzt wählst du aber nicht mit den Konstanten 0 oder 1 das Teilfeld aus, 
sondern machst eine Variable welches. Die hat immer den Wert 0 oder 
eins.
Wer das eine (Teil-) Feld nehmen soll, greift mit toll[welches][i][j] 
darauf zu, der andere mit toll[!welches][i][j].
Zum Tauschen reicht ein schnödes welches = !welches.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.