Hur använda en parameter av varken int/float/char/void som argument?

Permalänk

Hur använda en parameter av varken int/float/char/void som argument?

Jag har en riktigt konstig fråga. Om jag vill använda en parameter i en funktion som argument, men parametern heter t.ex. "fonts_uglib_4x4" t.ex, utan "". Hur gör jag då? Hur kan jag passa denna text "u8g_font_unifont" som argument?

void drawStr(int x, int y, char text[]) { u8g.setFont(u8g_font_unifont); // set fonts u8g.drawStr( 0, 22, text); // x, y, text to display }

Ni ser hur jag har gjort här:

u8g.firstPage(); do { drawStr(0, 40, "Welcome to first screen"); } while( u8g.nextPage() );

då måste jag skriva 0, 40, u8g_font_unifont, "Welcome to first screen". Som argument. Men det fungerar inte. Hur ska jag göra?

Här är en bit av min kod:

#include <Keypad.h> #include "U8glib.h" // Pins for 128X64 LCD U8GLIB_ST7920_128X64_4X u8g(13, 11, 12); // SCK, MOSI, MISO // Digital Keypad 4x3 const byte rows = 4; //four rows const byte cols = 3; //three columns char keys[rows][cols] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; // Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins. byte rowPins[rows] = {1, 6, 5, 3}; // Connect keypad COL0, COL1 and COL2 to these Arduino pins. byte colPins[cols] = {2, 0, 4}; Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols ); void setup() { pinMode(13, OUTPUT); // Green LED digitalWrite(13, 0); // Green LED low u8g.firstPage(); do { drawStr(0, 40, "Welcome to first screen"); } while( u8g.nextPage() ); } void loop() { char key = kpd.getKey(); switch (key) { case '#': // do this - Enter a command to console LED(); // blink break; case '*': // do this - Send a new command to slave LED(); // blink break; default: break; } } void drawStr(int x, int y, char text[]) { u8g.setFont(u8g_font_unifont); // set fonts u8g.drawStr( 0, 22, text); // x, y, text to display } float input_display() { char abcd[4]; // create a array_char for input //mydisplay.clearDisplay(0); // clear display for(int i = 0; i <= 3; i++) { abcd[i]= kpd.waitForKey(); // add one char if (abcd[i] == '*' || abcd[i] == '#') // compare { // End of the loop // make abcd_int[] into one number and return it LED(); // blink //mydisplay.clearDisplay(0); // clear display return atoi(abcd); } else { //mydisplay.setDigit(0, i, abcd[i] - '0', false); // show on display digitalWrite(13, 0); // LED green OFF } } // End of the loop digitalWrite(13, 0); // LED green OFF boolean key = true; while(key == true) { if (kpd.getKey() == '#') { key = false; // breake } else { key == true; // continue untill pressed '#' } } LED(); // blink //mydisplay.clearDisplay(0); // clear display // make abcd_int[] into one number and return it return atoi(abcd); } // Blink Green LED void LED() { int A = 1; for (int i = 0; i <= 10; i++) { digitalWrite(13, A); delay(100); if (A == 1) { A = 0; } else { A = 1; } } }

Permalänk
Hedersmedlem
Skrivet av heretic16:

Jag har en riktigt konstig fråga. Om jag vill använda en parameter i en funktion som argument, men parametern heter t.ex. "fonts_uglib_4x4" t.ex, utan "". Hur gör jag då? Hur kan jag passa denna text "u8g_font_unifont" som argument?

void drawStr(int x, int y, char text[]) { u8g.setFont(u8g_font_unifont); // set fonts u8g.drawStr( 0, 22, text); // x, y, text to display }

Ni ser hur jag har gjort här:

u8g.firstPage(); do { drawStr(0, 40, "Welcome to first screen"); } while( u8g.nextPage() );

då måste jag skriva 0, 40, u8g_font_unifont, "Welcome to first screen". Som argument. Men det fungerar inte. Hur ska jag göra?

Vad exakt är det du behöver ha hjälp med? Jag kan svara på dina frågor, men jag är inte så säker på att det kommer att hjälpa med ditt underliggande problem. Är det loopen som är problemet du behöver lösa? I så fall skulle jag säga att jag gissar att man inte behöver göra u8g.setFont(u8g_font_unifont); för varje varv i loopen, utan det räcker att man gör det en gång innan loopen.

Visa signatur

Använd gilla för att markera nyttiga inlägg!

Permalänk
Skrivet av giplet:

Vad exakt är det du behöver ha hjälp med? Jag kan svara på dina frågor, men jag är inte så säker på att det kommer att hjälpa med ditt underliggande problem. Är det loopen som är problemet du behöver lösa? I så fall skulle jag säga att jag gissar att man inte behöver göra u8g.setFont(u8g_font_unifont); för varje varv i loopen, utan det räcker att man gör det en gång innan loopen.

Det är just u8g_font_unifont som jag vill ha som argument i funktionen drawStr(int x, int y, char text[]). Men hur gör jag då?
u8g_font_unifont har varken char/int/float/void eller liknande.

Permalänk
Hedersmedlem

Vad tror du `u8g_font_unifont` är för något? Ska det skickas in som den faktiska strängen, eller är det en fördefinierad konstant (som då har en typ där den definieras), eller vad?

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Det är just u8g_font_unifont som jag vill ha som argument i funktionen drawStr(int x, int y, char text[]). Men hur gör jag då?
u8g_font_unifont har varken char/int/float/void eller liknande.

Om du kollar i manualen till u8glib så står det att setFont har följande definition:
void U8GLIB::setFont(const u8g_fntpgm_uint8_t *font)

Typen du söker är alltså u8g_fntpgm_uint8_t. Du borde kunna göra om din drawStr till:
void drawStr(int x, int y, u8g_fntpgm_uint8_t *font, char text[])

Jag vidhåller dock att jag skulle tro att det räcker att anropa setFont en gång vid loopen. Använder du bara en font så bör det räcka att anropa setFont en enda gång i hela ditt program.

Visa signatur

Använd gilla för att markera nyttiga inlägg!

Permalänk
Skrivet av giplet:

Om du kollar i manualen till u8glib så står det att setFont har följande definition:
void U8GLIB::setFont(const u8g_fntpgm_uint8_t *font)

Typen du söker är alltså u8g_fntpgm_uint8_t. Du borde kunna göra om din drawStr till:
void drawStr(int x, int y, u8g_fntpgm_uint8_t *font, char text[])

Jag vidhåller dock att jag skulle tro att det räcker att anropa setFont en gång vid loopen. Använder du bara en font så bör det räcka att anropa setFont en enda gång i hela ditt program.

Det fungerar inte om jag sätter void drawStr(int x, int y, u8g_fntpgm_uint8_t *font, char text[]) och sedan u8g.setFont(u8g_fntpgm_uint8_t font); // set fonts

error: expected primary-expression before ‘font’

Skrivet av phz:

Vad tror du `u8g_font_unifont` är för något? Ska det skickas in som den faktiska strängen, eller är det en fördefinierad konstant (som då har en typ där den definieras), eller vad?

Jag vet inte vad u8g_font_unifont är för något. Jag tror det är någon typ av konstant.

Permalänk
Hedersmedlem
Skrivet av heretic16:

u8g.setFont(u8g_fntpgm_uint8_t font); // set fonts

Menar du verkligen det röda?

Permalänk
Skrivet av Elgot:

Menar du verkligen det röda?

Jag har testat många. Här några av dessa:

void drawStr(int x, int y, u8g_fntpgm_uint8_t *font, char text[]) { u8g.setFont(u8g_fntpgm_uint8_t font); // set fonts u8g.drawStr( 0, 22, text); // x, y, text to display }

Citat:

PBrew.ino: In function ‘void setup()’:
PBrew.ino:32:64: error: invalid conversion from ‘const u8g_fntpgm_uint8_t* {aka const unsigned char*}’ to ‘u8g_fntpgm_uint8_t* {aka unsigned char*}’ [-fpermissive]
PBrew.ino:8:6: error: initializing argument 3 of ‘void drawStr(int, int, u8g_fntpgm_uint8_t*, char*)’ [-fpermissive]
PBrew.ino: In function ‘void drawStr(int, int, u8g_fntpgm_uint8_t*, char*)’:
PBrew.ino:58:34: error: expected primary-expression before ‘font’

Permalänk
Hedersmedlem
Skrivet av heretic16:

Jag har testat många. Här några av dessa:

void drawStr(int x, int y, u8g_fntpgm_uint8_t *font, char text[]) { u8g.setFont(u8g_fntpgm_uint8_t font); // set fonts u8g.drawStr( 0, 22, text); // x, y, text to display }

Fast vad vill du göra med det röda; så brukar man väl inte göra? Testa

u8g.setFont(font);

Permalänk
Skrivet av Elgot:

Fast vad vill du göra med det röda; så brukar man väl inte göra? Testa

u8g.setFont(font);

Fungerar inte heller

Citat:

PBrew.ino: In function ‘void setup()’:
PBrew.ino:32:64: error: invalid conversion from ‘const u8g_fntpgm_uint8_t* {aka const unsigned char*}’ to ‘u8g_fntpgm_uint8_t* {aka unsigned char*}’ [-fpermissive]
PBrew.ino:8:6: error: initializing argument 3 of ‘void drawStr(int, int, u8g_fntpgm_uint8_t*, char*)’ [-fpermissive]

Jag löste det med att säta const framför. const u8g_fntpgm_uint8_t *font
Varför är const så viktigt? Betyder det att jag aldrig mer kan ändra det?

Tydligen kan jag ändra fonterna igenom att sätta någon annan font, trots det är const

Permalänk
Hedersmedlem
Skrivet av heretic16:

PBrew.ino: In function ‘void setup()’:
PBrew.ino:32:64: error: invalid conversion from ‘const u8g_fntpgm_uint8_t* {aka const unsigned char*}’ to ‘u8g_fntpgm_uint8_t* {aka unsigned char*}’ [-fpermissive]
PBrew.ino:8:6: error: initializing argument 3 of ‘void drawStr(int, int, u8g_fntpgm_uint8_t*, char*)’ [-fpermissive]

Fast var är det det blir fel egentligen? Om nu setFont ser ut såhär

void U8GLIB::setFont(const u8g_fntpgm_uint8_t *font)

förväntar den sig en const u8g_fntpgm_uint8_t *, men att skicka in en icke-const borde gå lika bra (då man problemfritt kan konvertera åt det hållet automatiskt). Felmeddelandet antyder dock att du försöker skicka in en const u8g_fntpgm_uint8_t * till något som förväntar sig en u8g_fntpgm_uint8_t *.

Permalänk
Skrivet av Elgot:

Fast var är det det blir fel egentligen? Om nu setFont ser ut såhär

void U8GLIB::setFont(const u8g_fntpgm_uint8_t *font)

förväntar den sig en const u8g_fntpgm_uint8_t *, men att skicka in en icke-const borde gå lika bra (då man problemfritt kan konvertera åt det hållet automatiskt). Felmeddelandet antyder dock att du försöker skicka in en const u8g_fntpgm_uint8_t * till något som förväntar sig en u8g_fntpgm_uint8_t *.

Jag löste det precis som du gjorde

Jag skickar en:
const u8g_fntpgm_uint8_t *

Det går inte om jag skickar en:
u8g_fntpgm_uint8_t *

Varför har const så stor betydelse? Det betyder ju konstant, men troligtvis kan jag ändra den.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Varför har const så stor betydelse? Det betyder ju konstant, men troligtvis kan jag ändra den.

Om en funktion tar ett const-argument vet man att det inte ändras av funktionen (så man kan till exempel använda det igen), men det är inte säkert annars. Därför klagar kompilatorn om man försöker skicka en const-variabel till en icke-const-funktion (då försöker man ju använda en funktion som kanske modifierar argumentet trots att man har sagt att det inte får ändras). Åt andra hållet går dock bra; det innebär ju bara att funktionen lovar att inte ändra på en variabel som är tillåten att ändra.

Permalänk
Skrivet av Elgot:

Om en funktion tar ett const-argument vet man att det inte ändras av funktionen (så man kan till exempel använda det igen), men det är inte säkert annars. Därför klagar kompilatorn om man försöker skicka en const-variabel till en icke-const-funktion (då försöker man ju använda en funktion som kanske modifierar argumentet trots att man har sagt att det inte får ändras). Åt andra hållet går dock bra; det innebär ju bara att funktionen lovar att inte ändra på en variabel som är tillåten att ändra.

Så const är bara till för att förhindra sig själv att göra dumheter?

Permalänk
Hedersmedlem
Skrivet av heretic16:

Så const är bara till för att förhindra sig själv att göra dumheter?

Eller andra (i lite större projekt). Det kan också tänkas att kompilatorn kan optimera bättre om den inte behöver ta hänsyn till att värdet eventuellt kan ändras.

Permalänk
Skrivet av Elgot:

Eller andra (i lite större projekt). Det kan också tänkas att kompilatorn kan optimera bättre om den inte behöver ta hänsyn till att värdet eventuellt kan ändras.

Det drar även mindre minne?