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
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
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]); ...}
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);
muss dem doch nur irgendwie sagen, dass er die Daten jetzt aus der anderen Adresse, nämlich der großen Schrift holen soll :/.
@ 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 | }
|
@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.
jetzt läuft das - mit dem PGM_P. hab grad geschaut, das wird durch const char * ersetzt.
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 ? :/
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? ;-)
Danke :) tut mir leid für die dummen Fragen :D
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.