proměnný název proměnné
Úvodní stránka › Fórum › Software › Jazyky › Jazyk Wiring › proměnný název proměnné
- Toto téma obsahuje celkem 10 odpovědí. Do diskuze (3 diskutující) se naposledy zapojil uživatel
Zbyšek Voda a poslední změna proběhla před 7 roky a 2 měsíci.
-
AutorPříspěvky
-
27.6.2017 v 9:50 #11935
pedyngro
ÚčastníkZdravím,
jsem začátečník a potřeboval bych pomoci s problémem, na který jsem narazil při pokusu napsat vlastní kód pro POV hůlku (něco jako tohle: http://www.instructables.com/id/Persistence-of-Vision-Wand/). Nejdřív jsem sestrojil funkční zařízení se třemi diodami, celý program se ale skládal většinou pouze z příkazů digitalWrite HIHG a LOW a delay. Protože bych chtěl přidat větší počet diod, rozhodl jsem se pro inteligentnější řešení, u kterého jsem ale narazil na neznalost programovacích jazyků.
Program by měl fungovat následovně: for cyklus projíždí pole s nápisem, který chci zobrazit, if cykly, které v tomto for cyklu jsou, detekují jednotlivá písmena. Když zjistí, že aktuální písmeno je např. „o“, sputí funkci o:void o(){
boolean dio1[] = {1,1,1};
boolean dio2[] = {1,0,1};
boolean dio3[] = {1,1,1};
zobraz();Ta nastaví hodnoty určující, která dioda má kdy svítit, a spustí funkci zobraz:
void zobraz(){
for (int i = 0; i < 3; i++){ //pustí 1. sloupec, pak 2., pak 3.
for (int j = 1; j <= 3; j++){ //pustí hodnotu aktuálního sloupce nejdřív v 1. řádku, pak v 2. a 3.
if (dio’j'[i] == 1){ //pokud je hodnota 1, rozsvítí diodu
digitalWrite(led’j‘,HIGH);
}
} //chvíli nechá rozsvíceno
delay(znak);
for (int k = 0; k < 3; k++){ //všechno zhasne
digitalWrite(led’k‘,LOW);
}
delay(mezeraZnak); //chvíli nechá zhasnuto
}
delay(mezeraPismeno); //nechá zhasnuto (mezera mezi písmeny)
}Problém je v tom, že neumím správně zapsat, jak se má měnit název proměnných led a dio v jednotlivých cyklech. Nevíte někdo, jak se to píše? Třeba v pythonu to zapsat jde. Nebo nedá se to celé vyřešit jinak (proto píšu, jak funguje celý projekt)?
Díky za jakoukoli odpověď.
27.6.2017 v 9:55 #11937pedyngro
Účastníkchtěl jsem přiložit soubor s programem, ale nějak se to tu nezobrazuje…
27.6.2017 v 10:09 #11940Zbyšek Voda
SprávceDobrý den, v C název proměnné nezměníte.
Můžete ale udělat dvojrozměrné pole.Místo
boolean dio1[] = {1,1,1}; boolean dio2[] = {1,0,1}; boolean dio3[] = {1,1,1};
zapište
boolean dio[3][3] = {{1,1,1}, {1,0,1}, {1,1,1}}
a potom už můžete indexovat tak, jak jste to zamýšlel:
třeba:dio[j][i]
27.6.2017 v 13:10 #11943pedyngro
ÚčastníkDíky, mělo by to fungovat, ale když nastavím např. ve funkci „a“ hodnoty pole „diody“, někde se to cestou ztratí:
void a(){
boolean diody[3][3] = {{1,1,1},{1,0,1},{1,1,1}};
Serial.println(diody[0][0]);
zobraz();void zobraz(){
Serial.println(diody[0][0]);
for (byte i = 0; i < 3; i++){
atd…Když to nechám vyprintovat z té funkce, kde hodnoty nastavuji, je všechno v pořádku, ale v další funkci, která s hodnotami dále pracuje, už je všechno „0“.
Nevíte, čím by to mohlo být?
27.6.2017 v 13:40 #11944Vojtěch Vosáhlo
ÚčastníkPole musíte mít nadefinované mimo smyčku, třeba na začátku programu. Takhle s ním může pracovat jen smyčka ve které bylo pole „stvořené“.
27.6.2017 v 13:52 #11945pedyngro
ÚčastníkPole mám definované na začátku programu (mimo setup a loop), zjistil jsem, že při printování z funkce „zobraz“ jsou tam hodnoty, které jsou zadané na začátku při vytvoření pole, ty další změny už to nebere v potaz…
27.6.2017 v 14:18 #11946Zbyšek Voda
SprávcePošlete celý kód, takhle se nikam neposuneme.
27.6.2017 v 16:56 #11947pedyngro
ÚčastníkPokusil jsem se ten soubor nahrát tlačítkem „procházet…“, ale nezobrazilo se to tu, takže jsem to vložil do odpovědi ctrl+c ctrl+v… Jinak moc díky za pomoc!
[code]
byte led1 = 8; //nastavení pinů pro jednotlivé diody
byte led2 = 10;
byte led3 = 12;boolean diody[3][3] = {{},{},{}};
int znak = 20; //doba svícení
int mezeraZnak = 10; //mezera mezi dvěma bliknutími v jednom písmenu
int mezeraPismeno = 30; //mezera mezi písmenychar napis[] = „calex“;
int delkaNapisu = sizeof(napis)/sizeof(napis[0]);void a(){
boolean diody[3][3] = {{1,1,1},{1,0,1},{1,1,1}};
zobraz();
}void c(){
boolean diody[3][3] = {{1,1,1},{1,0,0},{1,1,1}};
zobraz();
}void e(){
boolean diody[3][3] = {{1,1,1},{1,1,0},{1,1,1}};
zobraz();
}void l(){
boolean diody[3][3] = {{1,0,0},{1,0,0},{1,1,1}};
zobraz();
}void o(){
boolean diody[3][3] = {{1,1,1},{1,0,1},{1,1,1}};
zobraz();
}void x(){
boolean diody[3][3] = {{1,0,1},{0,1,0},{1,0,1}};
zobraz();
}void zobraz(){
for (byte i = 0; i < 3; i++){ //postupně projíždí sloupce
for (byte j = 0; j < 3; j++){ //projíždí hodnoty řádku v každém sloupci
if (diody[i][j] == 1){ //pokud je hodnota 1, rozsvítí příslušnou diodu
if (j == 0){
digitalWrite(led1,HIGH);
}
if (j == 1){
digitalWrite(led2,HIGH);
}
if (j == 2){
digitalWrite(led3,HIGH);
}
}
}
delay(znak); //nechá chvíli rozsvíceno
digitalWrite(led1,LOW); //všechno zhasne
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
delay(mezeraZnak); //nechá zhasnuto
}
delay(mezeraPismeno); //nechá zhasnuto – mezera mezi písmeny
}void setup() {
Serial.begin(9600);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
}void loop() {
for (int i = 0; i < delkaNapisu; i++){ //projíždí po jednom pole „nápis“
if(napis[i] == ‚a‘){ //pokud je aktuální hodnota v poli „a“, pustí funkci „a“
a();
}
if(napis[i] == ‚c‘){
c();
}
if(napis[i] == ‚e‘){
e();
}
if(napis[i] == ‚l‘){
l();
}
if(napis[i] == ‚o‘){
x();
}
if(napis[i] == ‚x‘){
x();
}
}
}
[/code]27.6.2017 v 19:55 #11958Zbyšek Voda
SprávceJe tam více problémů.
Jeden problém je v tzv. scope – česky tuším rozsah platnosti proměnných.
Na začátku si vytvoříte pole diody, které je globální – můžete k němu přistupovat ve všech funkcích. Potom si třeba ve funkci a vytvoříte pole diody, které je pro tuto funkci lokální. A tím zastíníte globální pole diody. Dále dojde k zavolání funkce zobraz(), ale ta nevidí to lokální pole z funkce a, ale globální pole diody definované na začátku.Kdyby se nejednalo o pole, stačilo by odebrat klíčové slovo boolean ve funkcích a pak už by se měnila hodnota globální proměnné. U pole to ale tak jednoduché není, protože nejde napsat ve funkci
diody[3][3] = {{1,1,1},{1,0,1},{1,1,1}};
.Napadají mě dvě cesty, jak to řešit.
První možnost:
Vytvoříte si několik globálních polí, která budou obsahovat požadované sekvence
Třeba:boolean v1[3][3] = {{1,1,1},{1,0,1},{1,1,1}};
a potom v jednotlivých funkcích překopírujete obsah požadovaného pole do pole diody.
memcpy(diody, v1, 9 * sizeof(boolean));
O memcopy viz zde: http://www.cplusplus.com/reference/cstring/memcpy/Druhá možnost:
Funkci zobraz() přidáte parametr typu pole, přes který vždy předáte pole do funkce zobraz. To pak můžete nechat kód tak, jak máte (lokální pole v tomto případě nevadí), jen přidáte zavolání funkce s parametrem pole: zobraz(diody).
Globální pole diody pak můžete zahodit. Tato cesta je asi schůdnější28.6.2017 v 7:53 #11963pedyngro
ÚčastníkMoc díky, konečně to funguje, jak má! Už jsem se sám pokoušel nějakým způsobem předat hodnoty pole přes parametr funkce zobraz, ale nevěděl jsem jak. Asi sebudu muset líp naučit C a nespoléhat na to, že co jde v pythonu, jde všude…
Ještě jednou moc děkuji za čas, který jste si na mě udělal, místo abyste mě odkázal na učebnici C.
28.6.2017 v 10:31 #11966Zbyšek Voda
SprávceNení zač, ať se daří. Jsem rád, že program funguje 🙂
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.