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 3 měsíci.
-
AutorPříspěvky
-
27.6.2017 v 9:50 #11935pedyngroÚčastník
Zdraví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 VodaSprá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 VodaSprá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 VodaSprá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 VodaSprá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.