Void funkce

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
ArduXPP
Příspěvky: 361
Registrován: 14 pro 2017, 19:31
Reputation: 0
Kontaktovat uživatele:

Void funkce

Příspěvek od ArduXPP » 18 zář 2020, 06:20

V kodu:

Kód: Vybrat vše

 
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>             // Arduino SPI library
 
// ST7789 TFT module connections
#define TFT_CS    10  // define chip select pin
#define TFT_DC     9  // define data/command pin
#define TFT_RST    8  // define reset pin, or set to -1 and connect to Arduino RESET pin
 
// Initialize Adafruit ST7789 TFT library
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
 
float p = 3.1415926;
float ppp = 6.1415926;
 
void setup(void) {
  Serial.begin(9600);
  Serial.print(F("Hello! ST77xx TFT Test"));
 
  // if the display has CS pin try with SPI_MODE0
  tft.init(240, 240, SPI_MODE2);    // Init ST7789 display 240x240 pixel
 
  // if the screen is flipped, remove this command
  tft.setRotation(1);
 
  Serial.println(F("Initialized"));
 
  tft.fillScreen(ST77XX_BLACK);
}
 
void loop() {
//// large block of text
//  tft.fillScreen(ST77XX_BLACK);
//  tft.setTextSize(2);
//  tft.setTextColor(ST77XX_WHITE);
//  //tft.setTextColor(0xFEA6);
//  tft.setCursor(0, 0);
//  tft.print("Down ");
//    //tft.setTextColor(ST77XX_WHITE);
//  tft.setTextColor(0xFEA6);
//  tft.setCursor(0, 20);
//  tft.print("Down ");
//    tft.setTextColor(ST77XX_GREEN);
//  tft.setCursor(0, 40);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_ORANGE);
//  tft.setCursor(0, 60);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_BLUE);
//  tft.setCursor(0, 80);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_RED);
//  tft.setCursor(0, 100);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_CYAN);
//  tft.setCursor(0, 120);
//  tft.print("Down ");
//    tft.setTextColor(ST77XX_MAGENTA);
//  tft.setCursor(0, 140);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_MAGENTA);
//  tft.setCursor(0, 160);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_MAGENTA);
//  tft.setCursor(0, 180);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_WHITE);
//  tft.setCursor(0, 200);
//  tft.print("Down ");
//  tft.setTextSize(4);
//  tft.setTextColor(0xFDA0);
//  tft.setCursor(160, 150);
 tft.fillScreen(ST77XX_BLACK);
//displej(2, ST77XX_WHITE, 0, 0, "ahoj");
//displej(3, ST77XX_WHITE, 0, 30, "huhuhu");
displej(2, 0xFDA0, 0, 90, "ahoj", p);

  delay(5000);
}
void displej(int velikost, char BarvaTextu, int pozice, int radek, char textik, int textik2){
  tft.setTextSize(velikost);
  tft.setTextColor(BarvaTextu);
  tft.setCursor(pozice, radek);
  tft.print(textik);
tft.print(textik2 );
}
 
V kodu potřebuji vynechat třeba textik a v dalším třeba textik2, jak to udělat?

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Void funkce

Příspěvek od ondraN » 18 zář 2020, 06:43

Opraveno níže :oops:
Naposledy upravil(a) ondraN dne 18 zář 2020, 06:55, celkem upraveno 1 x.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Void funkce

Příspěvek od ondraN » 18 zář 2020, 06:46

Můžeš použít funkci s proměnným počtem parametrů.
https://www.builder.cz/rubriky/c/c--/uc ... u-155750cz
Zkus se třeba podívat jak je napsaná funkce printf()
Nebo si můžeš definovat dvě nebo více funkcí stejného jména a s jinými parametry. Překladač si pak vybere tu funkci, která má parametry odpovídající prametrům volání.

Třeba funkce spoj() provede grafické spojení dvou nebo třech bodů.

Kód: Vybrat vše

void spoj(int a, int b){
.....
}
void spoj(int a, int b, int c){
.....
}
loop{
......
spoj(a,b);
spoj(a,b,c);

}

Uživatelský avatar
kiRRow
Příspěvky: 1164
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Void funkce

Příspěvek od kiRRow » 18 zář 2020, 16:27

Jen dodám, že se tomu říká přetěžování funkcí, kdyby jsis to chtěl dohledat a počíst si.

ArduXPP
Příspěvky: 361
Registrován: 14 pro 2017, 19:31
Reputation: 0
Kontaktovat uživatele:

Re: Void funkce

Příspěvek od ArduXPP » 18 zář 2020, 23:38

Ukazuje to chybu při nahrávání, když použiji stejný název, tak u char bylo potřeba dát * , jinak to nešlo nahrát.

Kód: Vybrat vše

/*
 * Interfacing Arduino with ST7789 TFT display (240x240 pixel).
 * Graphics test example.
 * This is a free software with NO WARRANTY.
 * https://simple-circuit.com/
 */
/**************************************************************************
  This is a library for several Adafruit displays based on ST77* drivers.
 
  Works with the Adafruit 1.8" TFT Breakout w/SD card
    ----> http://www.adafruit.com/products/358
  The 1.8" TFT shield
    ----> https://www.adafruit.com/product/802
  The 1.44" TFT breakout
    ----> https://www.adafruit.com/product/2088
  as well as Adafruit raw 1.8" TFT display
    ----> http://www.adafruit.com/products/618
 
  Check out the links above for our tutorials and wiring diagrams.
  These displays use SPI to communicate, 4 or 5 pins are required to
  interface (RST is optional).
 
  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!
 
  Written by Limor Fried/Ladyada for Adafruit Industries.
  MIT license, all text above must be included in any redistribution
 **************************************************************************/
 
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>             // Arduino SPI library
 
// ST7789 TFT module connections
#define TFT_CS    10  // define chip select pin
#define TFT_DC     9  // define data/command pin
#define TFT_RST    8  // define reset pin, or set to -1 and connect to Arduino RESET pin
 
// Initialize Adafruit ST7789 TFT library
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
 
float p = 3.1415926;
float ppp = 6.1415926;
 
void setup(void) {
  Serial.begin(9600);
  Serial.print(F("Hello! ST77xx TFT Test"));
 
  // if the display has CS pin try with SPI_MODE0
  tft.init(240, 240, SPI_MODE2);    // Init ST7789 display 240x240 pixel
 
  // if the screen is flipped, remove this command
  tft.setRotation(1);
 
  Serial.println(F("Initialized"));
 
  tft.fillScreen(ST77XX_BLACK);
}
 
void loop() {
//// large block of text
//  tft.fillScreen(ST77XX_BLACK);
//  tft.setTextSize(2);
//  tft.setTextColor(ST77XX_WHITE);
//  //tft.setTextColor(0xFEA6);
//  tft.setCursor(0, 0);
//  tft.print("Down ");
//    //tft.setTextColor(ST77XX_WHITE);
//  tft.setTextColor(0xFEA6);
//  tft.setCursor(0, 20);
//  tft.print("Down ");
//    tft.setTextColor(ST77XX_GREEN);
//  tft.setCursor(0, 40);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_ORANGE);
//  tft.setCursor(0, 60);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_BLUE);
//  tft.setCursor(0, 80);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_RED);
//  tft.setCursor(0, 100);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_CYAN);
//  tft.setCursor(0, 120);
//  tft.print("Down ");
//    tft.setTextColor(ST77XX_MAGENTA);
//  tft.setCursor(0, 140);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_MAGENTA);
//  tft.setCursor(0, 160);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_MAGENTA);
//  tft.setCursor(0, 180);
//  tft.print("Down ");
//  tft.setTextColor(ST77XX_WHITE);
//  tft.setCursor(0, 200);
//  tft.print("Down ");
//  tft.setTextSize(4);
//  tft.setTextColor(0xFDA0);
//  tft.setCursor(160, 150);
 tft.fillScreen(ST77XX_BLACK);
//displej(2, ST77XX_WHITE, 0, 0, "ahoj");
//displej(3, ST77XX_WHITE, 0, 30, "huhuhu");
displej(3, ST77XX_BLUE, 0, 60, "ahoj:");
displej(2, 0xFDA0, 80, 60, p);

  delay(5000);
}
void displej(int velikost, char BarvaTextu, int pozice, int radek, char *textik){
  tft.setTextSize(velikost);
  tft.setTextColor(BarvaTextu);
  tft.setCursor(pozice, radek);
  tft.print(textik);
}
void displej(int velikost, char BarvaTextu, int pozice, int radek, int textik){
  tft.setTextSize(velikost);
  tft.setTextColor(BarvaTextu);
  tft.setCursor(pozice, radek);
  tft.print(textik);
}
 

Kód: Vybrat vše

/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino: In function 'void loop()':
/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino:106:39: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
 displej(3, ST77XX_BLUE, 0, 60, "ahoj:");
                                       ^
/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino:107:29: warning: overflow in implicit constant conversion [-Woverflow]
 displej(2, 0xFDA0, 80, 60, p);
                             ^
Projekt zabírá 10842 bytů (33%)  úložného místa pro program. Maximum je 32256 bytů.
Globální proměnné zabírají 314 bytů (15%)  dynamické paměti, 1734 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.
A bez použití * to dá chybu a nenahraje.

Kód: Vybrat vše

Arduino: 1.8.13 (Linux), Vývojová deska: "Arduino Uno"











/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino: In function 'void loop()':
sketch_sep18a:106:39: error: no matching function for call to 'displej(int, int, int, int, const char [6])'
 displej(3, ST77XX_BLUE, 0, 60, "ahoj:");
                                       ^
/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino:111:6: note: candidate: void displej(int, char, int, int, char) <near match>
 void displej(int velikost, char BarvaTextu, int pozice, int radek, char textik){
      ^~~~~~~
/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino:111:6: note:   conversion of argument 5 would be ill-formed:
/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino:106:39: warning: invalid conversion from 'const char*' to 'char' [-fpermissive]
 displej(3, ST77XX_BLUE, 0, 60, "ahoj:");
                                       ^
/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino:117:6: note: candidate: void displej(int, char, int, int, int) <near match>
 void displej(int velikost, char BarvaTextu, int pozice, int radek, int textik){
      ^~~~~~~
/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino:117:6: note:   conversion of argument 5 would be ill-formed:
/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino:106:39: warning: invalid conversion from 'const char*' to 'int' [-fpermissive]
 displej(3, ST77XX_BLUE, 0, 60, "ahoj:");
                                       ^
sketch_sep18a:107:29: error: call of overloaded 'displej(int, unsigned int, int, int, float&)' is ambiguous
 displej(2, 0xFDA0, 80, 60, p);
                             ^
/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino:111:6: note: candidate: void displej(int, char, int, int, char)
 void displej(int velikost, char BarvaTextu, int pozice, int radek, char textik){
      ^~~~~~~
/home/pi/Documents/Arduino/kody k testu/test/sketch_sep18a/sketch_sep18a.ino:117:6: note: candidate: void displej(int, char, int, int, int)
 void displej(int velikost, char BarvaTextu, int pozice, int radek, int textik){
      ^~~~~~~
exit status 1
no matching function for call to 'displej(int, int, int, int, const char [6])'


ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Void funkce

Příspěvek od ondraN » 19 zář 2020, 07:51

Problém je v tom, že jsi měl jak stejný název, tak i parametry funkce. Kompilátor pak neví, jakou funkci použít. Prodmínka je, aby funkce stejného názvu měly různý počet parametrů a nebo aby parametry byly různého typu. To jsi vlastně splnil tím, že jsi jeden změnil z char na pointer na char.
Nějak mi ale uniká, proč chceš ty funkce mít úplně stejné. Myslel jsem, že chceš mít stejný název funkce a různý počet parametrů :?:
Možná nějak názorněji ukaž, jak to chceš používat a co si od toho slibuješ, pak je možné hledat, třeba i vhodnější, řešení.

ArduXPP
Příspěvky: 361
Registrován: 14 pro 2017, 19:31
Reputation: 0
Kontaktovat uživatele:

Re: Void funkce

Příspěvek od ArduXPP » 19 zář 2020, 08:07

Rozdíl tam je, char textik a int textik, jde o displej, tak potřebuji i možnost čísla, což u char nešlo. Jenže ta chyba se ukazuje i když použiju jen jeden, jde o jinou chybu než rozdíl. Já jsem testoval jen ten jeden void s char, a ten druhý jsem dal pryč. To co tam nemělo být, jsem dal pryč. Jakmile jsem dal pryč * , dělalo to problém. Ani nevím proč to jde s tou * . U * to jen řekne chybu, ale nahraje to.

AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Void funkce

Příspěvek od AstroMiK » 19 zář 2020, 09:22

Displej nemám, tak to nemohu vyzkoušet, ale nepomohlo by převést to číslo na String?

Kód: Vybrat vše

void displej(int velikost, char BarvaTextu, int pozice, int radek, int cislicko){
  tft.setTextSize(velikost);
  tft.setTextColor(BarvaTextu);
  tft.setCursor(pozice, radek);
  String textik = String(cislicko);   // tady to prevest z cisla na retezec
  tft.print(textik);                  // a tady pak ten retezec normalne zobrazit
}
 

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Void funkce

Příspěvek od ondraN » 19 zář 2020, 14:47

Tvůj kód

Kód: Vybrat vše

float p = 3.1415926;
.........
displej(3, ST77XX_BLUE, 0, 60, "ahoj:");
displej(2, 0xFDA0, 80, 60, p);

  delay(5000);
}
void displej(int velikost, char BarvaTextu, int pozice, int radek, char *textik){
  tft.setTextSize(velikost);
  tft.setTextColor(BarvaTextu);
  tft.setCursor(pozice, radek);
  tft.print(textik);
}
void displej(int velikost, char BarvaTextu, int pozice, int radek, int textik){
  tft.setTextSize(velikost);
  tft.setTextColor(BarvaTextu);
  tft.setCursor(pozice, radek);
  tft.print(textik);
}
V prvním případě jsi funkci zavolal s posledním parametrem typu znakového pole. Proto musí být v definici ta *, protože to znamená, že funkce očekává ukazatel na char. V C++ je název pole předáván vždy jako ukazatel. Pokud jsi tam měl char textik, tak se očekávala JEDNOZNAKOVÁ proměnná, tedy třeba 'A' U druhého volání más v posledním parametru int ale p je typu float. Pokud si dáš v první definici

Kód: Vybrat vše

void displej(int velikost, char BarvaTextu, int pozice, int radek, char *textik){ //bude fungovat i char textik[]
  tft.setTextSize(velikost);
  tft.setTextColor(BarvaTextu);
  tft.setCursor(pozice, radek);
  tft.print(textik);
a ve druhé definici

Kód: Vybrat vše

void displej(int velikost, char BarvaTextu, int pozice, int radek,  float numero){
  tft.setTextSize(velikost);
  tft.setTextColor(BarvaTextu);
  tft.setCursor(pozice, radek);
  tft.print(numero);
tak by to mělo fungovat bez problémů.

ArduXPP
Příspěvky: 361
Registrován: 14 pro 2017, 19:31
Reputation: 0
Kontaktovat uživatele:

Re: Void funkce

Příspěvek od ArduXPP » 19 zář 2020, 22:19

To jsem testoval, měl jsem tam i int. To, že tam bylo float nevadí. Šlo o to, že i když jsem používal * , tak to ukazuje chybu, ale jak jsem psal, tak se to nahrálo a fungovalo.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů