-         

Ergebnis 1 bis 5 von 5

Thema: Flash-Adresse einem Prototyp übergeben

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2006
    Beiträge
    5

    Flash-Adresse einem Prototyp übergeben

    Anzeige

    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.

    Die Daten liegen im Flash als Mehrd.-Array:

    Code:
    const uint16_t Arystatusicon[][2] PROGMEM = {
    
    {0b1111111111111111,0b0011011111100000},
    {0b1111111111111111,0b0011011111100000},
    
    };
    Der Prototyp soll die mitgebene Adresse verwenden, um den Inhalt des Flasharrays auszulesen:

    Code:
    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:
    Code:
    s65Iconsrom((PGM_P*)&Arystatusicon);
    Und:
    Code:
    s65Iconsrom((PGM_P*)pgm_read_word(&Arystatusicon));
    Jedoch funktioniert es mit keinem der beiden. Er liest irgendein Müll aus.

    Vielen Dank!

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Code:
    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.
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Zitat Zitat von sternst
    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?

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von thewulf00
    Könntest Du das an einem Beispiel kurz demonstrieren?
    Variante 1 (innere Größe in der Deklaration):
    Code:
    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):
    Code:
    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".
    MfG
    Stefan

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2006
    Beiträge
    5
    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);

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •