PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Flash-Adresse einem Prototyp übergeben



Nicy
13.01.2009, 21:21
Hallo zusammen!

Habe schon etliche Stunden im Internet gesucht sowie selber versucht es zu lösen. Jedoch ohne Erfolg. ](*,)

Ich möchte die Flash-Adresse dem Zeiger eines Prototyps übergeben, dieser soll wiederrum den Inhalt der Flash-Adresse auslesen.
Es funktioniert einfach nicht. ](*,) :-k

Die Daten liegen im Flash als Mehrd.-Array:



const uint16_t Arystatusicon[][2] PROGMEM = {

{0b1111111111111111,0b0011011111100000},
{0b1111111111111111,0b0011011111100000},

};


Der Prototyp soll die mitgebene Adresse verwenden, um den Inhalt des Flasharrays auszulesen:



void s65Iconsrom(PGM_P * string) {
uint16_t bzeile; uint8_t zeile;
uint8_t i;

bzeile = pgm_read_word(&string[i][zeile]);

}


Der Aufruf des Prototyps habe mit beiden Versionen probiert:


s65Iconsrom((PGM_P*)&Arystatusicon);

Und:


s65Iconsrom((PGM_P*)pgm_read_word(&Arystatusicon));


Jedoch funktioniert es mit keinem der beiden. Er liest irgendein Müll aus.

Vielen Dank!

sternst
13.01.2009, 22:50
void s65Iconsrom(PGM_P * string) {
...
bzeile = pgm_read_word(&string[i][zeile]);


Das kann so ganz grundsätzlich nicht funktionieren, weil der Compiler keine Chance hat, die Adresse eines Elements in einem mehrdimensionalen Array zu berechnen, wenn er die Größe der inneren Dimensionen nicht kennt. Diese musst du also entweder in der Deklaration mit angeben, oder als zusätzlichen Parameter der Funktion mitgeben.

thewulf00
14.01.2009, 08:14
Das kann so ganz grundsätzlich nicht funktionieren, weil der Compiler keine Chance hat, die Adresse eines Elements in einem mehrdimensionalen Array zu berechnen, wenn er die Größe der inneren Dimensionen nicht kennt. Diese musst du also entweder in der Deklaration mit angeben, oder als zusätzlichen Parameter der Funktion mitgeben.

Könntest Du das an einem Beispiel kurz demonstrieren?

sternst
14.01.2009, 11:37
Könntest Du das an einem Beispiel kurz demonstrieren?

Variante 1 (innere Größe in der Deklaration):

void Func ( type array[][2] ) {

type i = array[x][y];
Das hat natürlich den Nachteil, dass man nur Arrays an die Funktion übergeben kann, die die gleiche innere Dimension haben (hier 2).

Variante 2 (innere Größe als Parameter):

void Func ( void* array, int dim ) {

type i = *( (type*)array + x*dim + y );
Man kann die Funktion sowohl mit einem 2x2 Array aufrufen, wie auch mit einem 7x10 Array (dim muss natürlich dann einmal 2 und einmal 10 sein).
Diese Variante ist also universeller, dafür ist der Zugriff auf die Elemente etwas "kryptischer".

Nicy
17.01.2009, 17:18
Vielen Dank! Mit deiner Hilfe und ein wenig rumprobieren, habe ich es rausgekriegt:

void Func (uint8_t hoehe, uint8_t breite, PGM_P * array){
type bzeile = pgm_read_word(&array[(i*breite) + zeile]);
}

Func(32, 32, (PGM_P*)Arymainmenudesign);