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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren