eine Funktion soll auf verschiedene Arrays zugreifen

Gast #3714388
Lesenswert?
• ▲
▼
Hallo zusammen, bisher sah meine Funktion für ein LC - Display wie folgt 
aus:

void lcd_zeichen(uint8_t cumba, uint16_t x, uint16_t y, uint16_t 
farbe_schrift,uint16_t farbe_back)
{
  uint16_t zeichen,xsize,ysize,offset,temp,i,j;

   xsize=pgm_read_byte(&kleine_Schrift[0]); //Daten aus dem Flash lesen
  ysize=pgm_read_byte(&kleine_Schrift[1]);
  offset=pgm_read_byte(&kleine_Schrift[2]);
...}

und hat das dann auch auf dem Display ausgegeben. Nun habe ich weiter 
Fonts erstellt--> const uint8_t grosse Schrift[]PROGMEM={..};

ich bekomme es nicht auf die Reihe beim Funktionsaufruf dem zu sagen 
welche Array er nun verwenden soll. Also das in der Funktion statt dem

  xsize=pgm_read_byte(&kleine_Schrift[0]);

dann

  xsize=pgm_read_byte(&grosse_Schrift[0]);

aufgerufen wird
#3714401
Lesenswert?
• ▲
▼
Mehr erfahren schrieb:
> ich bekomme es nicht auf die Reihe beim Funktionsaufruf dem zu sagen
> welche Array er nun verwenden soll.

Was genau ist denn das Problem? Welche Fehlermeldung gibt es? Welches 
Fehlerverhalten?

Prinzipiell brauchst du einfach nur ein weiteres Argument, welches du 
aber nicht aber mittels "call-by-value" übergibst, sondern per 
"call-by-reference" (d.h. als Pointer). Siehe dazu auch: 
http://www.eskimo.com/~scs/cclass/notes/sx10f.html

Mit freundlichen Grüßen,
Karol Babioch
Gast #3714413
Lesenswert?
• ▲
▼
ich hab das so versucht:

//Prototyp:
void lcd_zeichen(uint8_t cumba, uint16_t x, uint16_t y, uint16_t
farbe_schrift,uint16_t farbe_back);

//im main aufruf:
while(1)
{
  lcd_zeichen('O',50,100,&SmallFont[0],RED,WHITE);
  lcd_zeichen('A',140,100,&BigFont[0],BLUE,WHITE);
}

//die Funktion:
void lcd_zeichen(uint8_t cumba, uint16_t x, uint16_t y,const uint8_t 
*Font, uint16_t farbe_schrift,uint16_t farbe_back)

{
  uint16_t zeichen,xsize,ysize,offset,temp,i,j;

   xsize=pgm_read_byte(&Font[0]); //Daten aus dem Flash lesen
  ysize=pgm_read_byte(&Font[1]);
  offset=pgm_read_byte(&Font[2]);
...}
#3714433
Lesenswert?
• ▲
▼
@ Mehr erfahren (Gast)

>ich bekomme es nicht auf die Reihe beim Funktionsaufruf dem zu sagen
>welche Array er nun verwenden soll. Also das in der Funktion statt dem

Wo ist das Problem?
1
#include <avr/pgmspace.h>
2

3
void lcd_zeichen (uint8_t cumba, uint16_t x, uint16_t y,
4
                  uint16_t farbe_schrift, uint16_t farbe_back,
5
                  PGM_P font)
6
{
7

8

9
  xsize=pgm_read_byte(&font[0]);
10

11
}
#3714435
Lesenswert?
• ▲
▼
@Mehr erfahren (Gast)

>muss dem doch nur irgendwie sagen, dass er die Daten jetzt aus der
>anderen Adresse, nämlich der großen Schrift holen soll :/.

Das machst du doch, indem du den Pointer auf den jeweiligen Schriftsatz 
übergibst.

lcd_zeichen('O',50,100,&SmallFont[0],RED,WHITE);
lcd_zeichen('A',140,100,&BigFont[0],BLUE,WHITE);

Übrigend reicht es so.

lcd_zeichen('O',50,100, SmallFont,RED,WHITE);
lcd_zeichen('A',140,100, BigFont,BLUE,WHITE);

Den der Name eines Arrays ohne Index ist gleichzeitig ein Pointer auf 
diesen.
Gast #3714455
Lesenswert?
• ▲
▼
aber noch so ne Frage.
Ich hab gelesen, dass wenn ich vor eine Variable ein & setze also z.b
int *a,b;

b=&a; dann speichert es in b die Adresse von a.
was aber wenn der speicher in b für die Adresse nicht reicht?
also wenn beide z.B nur uint8_t wären aber die Adresse von a viel größer 
? :/
#3714473
Lesenswert?
• ▲
▼
Mehr erfahren schrieb:
> aber noch so ne Frage.
> Ich hab gelesen, dass wenn ich vor eine Variable ein & setze also z.b
> int *a,b;
>
> b=&a; dann speichert es in b die Adresse von a.
> was aber wenn der speicher in b für die Adresse nicht reicht?
> also wenn beide z.B nur uint8_t wären aber die Adresse von a viel größer
> ? :/

Wenn Du einen 16- oder 32-Bit-Wert in einem 8-Bit-Wert abspeichern 
willst, dann gehen Daten verloren. Wo sollen sie auch hin? ;-)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.