Forum: Mikrocontroller und Digitale Elektronik eine Funktion soll auf verschiedene Arrays zugreifen


von Mehr erfahren (Gast)


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

von Karol B. (johnpatcher)


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

von Mehr erfahren (Gast)


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]);
...}

von Mehr erfahren (Gast)


Lesenswert?

Prototyp:
void lcd_zeichen(uint8_t cumba, uint16_t x, uint16_t y,const uint8_t
*Font, uint16_t farbe_schrift,uint16_t farbe_back);

von Mehr erfahren (Gast)


Lesenswert?

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

von Falk B. (falk)


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
}

von Falk B. (falk)


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.

von Mehr erfahren (Gast)


Lesenswert?

jetzt läuft das - mit dem PGM_P. hab grad geschaut, das wird durch
const char * ersetzt.

von Mehr erfahren (Gast)


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 
? :/

von Mark B. (markbrandis)


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? ;-)

von Mehr erfahren (Gast)


Lesenswert?

Danke :) tut mir leid für die dummen Fragen :D

von Konrad S. (maybee)


Lesenswert?

Mehr erfahren schrieb:
> int *a,b;
> b=&a;

Und selbst im kleinsten Stückchen Code ist noch Platz für einen Fehler. 
;-)

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.