Posts: 8.729
Threads: 138
Joined: Apr 2013
Reputation:
3.629
(05-08-2021, 08:07 PM)enaB Wrote: Moze da se koristi return u void funkcijama
return;
Ma moze naravno i tako, poenta je bila za izlazenje iz switch/case/if/for uslova, tu ne moze return, nego moze jedino break a ako ti je to ugnjezdeno tamo u vise nivoa onda pocinje da bude naporno jer ne postoji na primer "break 3" kao u nekim jezicima da prekine 3 nivoa ili koliko vec treba pa bude problem, stavis lepo GOTO i skaci gde oces ako znas tacno gde treba.
Evo konkretan primer tamo sa druge teme, bas mi je cucnuo GOTO vise nego bilo koja druga logika
//--------------------------------------------------------
//------------------------ RELAYS ------------------------
//--------------------------------------------------------
void Handle_Relays() {
if (vol_change_flag) {
if (SW_timers[7] == 1) { //prvi prolaz postavljamo sve koje trebaju
if (bitmask1 != 0) GPIOA->BSRR = RY1_on; //PA3 -1dB
if (bitmask2 != 0) GPIOA->BSRR = RY2_on; //PA4 -2dB
if (bitmask3 != 0) GPIOA->BSRR = RY3_on; //PA5 -4dB
if (bitmask4 != 0) GPIOA->BSRR = RY4_on; //PA6 -8dB
if (bitmask5 != 0) GPIOA->BSRR = RY5_on; //PA7 -16dB
if (bitmask6 != 0) GPIOB->BSRR = RY6_on; //PB0 -32dB
if (MyData[DELAY]==0) goto odradi_ostalo; //nema delay odradi i ostalo
} else if (SW_timers[7] >= (MyData[DELAY]+1)) {//kada istekne gasimo koje trebaju
odradi_ostalo:
SW_timers[7] = 0;
vol_change_flag = 0;
if (bitmask1 == 0) GPIOA->BSRR = RY1_off; //PA3 -1dB
if (bitmask2 == 0) GPIOA->BSRR = RY2_off; //PA4 -2dB
if (bitmask3 == 0) GPIOA->BSRR = RY3_off; //PA5 -4dB
if (bitmask4 == 0) GPIOA->BSRR = RY4_off; //PA6 -8dB
if (bitmask5 == 0) GPIOA->BSRR = RY5_off; //PA7 -16dB
if (bitmask6 == 0) GPIOB->BSRR = RY6_off; //PB0 -32dB
}
}
}
// Konfiguracija (72000) za SysTick da radi kao 1kHz (1ms) timer
// Iskoriscen SysTick HW tajmer za jos X SW tajmera + Handle_relays()
void SysTick_Handler (void) {
if (SW_timers_enable[0] == 1) SW_timers[0] ++;
SW_timers[1] ++;
SW_timers[2] ++;
SW_timers[3] ++;
SW_timers[4] ++;
SW_timers[5] ++;
SW_timers[6] ++;
SW_timers[7] ++;
Handle_Relays(); //Function call every 1ms
}
Posts: 392
Threads: 51
Joined: May 2014
Reputation:
32
Ponovo se igram nesto i primer jeskoro isti kao onaj prethodni,sve isto u tom delu napisamo i izbacuje gresku.
Zasto je ovo sad(); ovde greska a u prethodnom primeru radi?
Drugi deo koda radi kad sklonim ovo vezano za sad();
const int buttonPin = 8;
const int buttonPin1 = 9;
int ledPin = 13;
int ledPin1 = 12;
boolean flag = 0;
int buttonState = HIGH;
int buttonState1 = HIGH;
int i;
void setup() {
pinMode(ledPin,OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(buttonPin1,INPUT);
//int buttonState1 = HIGH;
int buttonState = HIGH;
}
void loop(){
//buttonState1 = digitalRead(buttonPin1);
buttonState = digitalRead(buttonPin);
flag = true;
if (digitalRead(buttonPin1) == LOW) {
sad(); // --------------------------------- ovde je greska
}
if (buttonState == false) {
digitalWrite(ledPin, LOW);
delay(500);
} else {
digitalWrite(ledPin, HIGH);
delay(500);
}
void sad() {
digitalWrite(ledPin1,LOW);
delay(500);
digitalWrite(ledPin1,HIGH);
delay(500);
}
}
Posts: 1.244
Threads: 10
Joined: Apr 2015
Reputation:
509
Zagrade.
Takodje, ako ti je funkcija koju pozivas napravljena ispod mesta poziva, treba ti prototip funkcije.
Posts: 1.244
Threads: 10
Joined: Apr 2015
Reputation:
509
Jos jedna veoma bitna stvar. Kod ti je napisan katastrofalno. Bez uvrede. Nigde ne koristis tabove. Pogledaj Mikijev kod kako je lepo napisan i kako se tacno vidi blok naredbi pod zagradama. To je citljivost koda i veoma je bitna radi lakseg otklanjanja sintaksnih gresaka.
Posts: 392
Threads: 51
Joined: May 2014
Reputation:
32
Ma nevredjam se ni najmanje samo sad nevidim zasto nece a onaj prethodni je na isti nacin i on radi.
Posts: 8.729
Threads: 138
Joined: Apr 2013
Reputation:
3.629
(05-09-2021, 07:09 PM)vojinilic Wrote: Zagrade.
Takodje, ako ti je funkcija koju pozivas napravljena ispod mesta poziva, treba ti prototip funkcije.
(05-09-2021, 07:11 PM)vojinilic Wrote: Jos jedna veoma bitna stvar. Kod ti je napisan katastrofalno. Bez uvrede. Nigde ne koristis tabove. Pogledaj Mikijev kod kako je lepo napisan i kako se tacno vidi blok naredbi pod zagradama. To je citljivost koda i veoma je bitna radi lakseg otklanjanja sintaksnih gresaka.
U sustini sve gore greske bi trebao jedan "pametan IDE" da resi pre nego sto uopste dodje korisnik da ovde pejstuje primer sa greskom
Arduino IDE je bez uvrede "retardiran" po tom pitanju ...
Pametan IDE ti kaze "Sine gde ti je prototip? Hoces da napravim umesto tebe?" i pocrveni tako da ne mozes dalje da kuckas dok to ne resis, u startu je sve bolje i lakse za pisanje programa, bez obzira na iskustvo, IDE cekira ceo source-code kako stisnes jedan taster i kuva u pozadini i poredi sa goooooomilom pravila i daje razne savete pre nego sto si uoste stisnuo COMPILE (Build)!
Posts: 392
Threads: 51
Joined: May 2014
Reputation:
32
Greska sigurno ima.Jedino je nejasno zasto u prethodnom primeru radi a isto je ovako definisano
Posts: 8.729
Threads: 138
Joined: Apr 2013
Reputation:
3.629
05-09-2021, 08:10 PM
(This post was last modified: 05-10-2021, 10:59 PM by mikikg.)
@vojinilic
Moramo po neki put da se stavimo i u poziciju pocetnika, posebno kada pricamo o C (tek C++) da je to u sustini prost jezik ali ima stvarno veliki broj pravila i caka i tehnika kako jednu istu stvar mozes da napravis, ima stvarno mnogo pravila koja se primenjuju za pisanje ispravnog i optimizovanog programa, ne mozemo da ocekujemo od pocetnika sve da ih zna ali zato je bitno da i pocetnici koriste dobre i kvalitetne IDE i da "uce zajedno", da ti IDE stvarno pomogne (koliko je to moguce) u raznim situacijama i savetuje sa konkretnim akcijama i parcicima code-a koje napise umesto tebe i to sto ti je pomogao je ihaaaaa vredelo i korisno i ustedelo vreme, jer kada to nema onda imamo kao gore spomenut primer sa greskom i vrtecemo se tako dok MILANNN ne nauci ispravnu sintaksu i pravila C jezika ili dok ne promeni IDE
Posts: 1.157
Threads: 27
Joined: Oct 2014
Reputation:
313
(05-09-2021, 08:10 PM)MILANNN Wrote: Greska sigurno ima.Jedino je nejasno zasto u prethodnom primeru radi a isto je ovako definisano
Zagrade. Već si dobio odgovor. I kod ti nije formatiran tako da možeš lakše da uočiš grešku. Ti si sad() ubacio u loop()
Code: void loop(){
//buttonState1 = digitalRead(buttonPin1);
buttonState = digitalRead(buttonPin);
flag = true;
if (digitalRead(buttonPin1) == LOW) {
sad(); // --------------------------------- ovde je greska
}
if (buttonState == false) {
digitalWrite(ledPin, LOW);
delay(500);
} else {
digitalWrite(ledPin, HIGH);
delay(500);
}
}
void sad(void) {
digitalWrite(ledPin1,LOW);
delay(500);
digitalWrite(ledPin1,HIGH);
delay(500);
}
Posts: 392
Threads: 51
Joined: May 2014
Reputation:
32
Hvala Gorane.Setio sam se da treba void sad(void) { ali na zagrau nisam obratio paznju.
Posts: 6.315
Threads: 56
Joined: Mar 2013
Reputation:
3.085
Miki, Vojin i Goran su ti ukazali na greške, a ja ću malo da dopunim i objasnim ti oko prototipova.
Prototip svih funkcija koje će ti kasnije trebati, osim loop(), se pravi ovako i najbolje je to uraditi negde na vrhu, tamo gde su ti definicije varijabli, konstanti itd:
void sad(void);
Kad kompajler "vidi" na vrhu koda prototip, on "zna" da će funkcija sa tim imenom kasnije biti korišćena negde ispod i automatski prvo kompajlira te funkcije pa posle loop().
U tom slučaju će sad(); kog pozivaš u loop() biti normalno upotrebljeno.
Ako nemaš prototip za sad() onda, ukoliko kreiraš tu funkciju ispod loop() onda kompajler nema pojma o njenom postojanju.
Odnosno, ako kreiraš neku funkciju bez prototipa na vrhu, onda je možeš koristiti samo u kodu ispod nje, nikako iznad.
Ako imaš prototip, onda je možeš kreirati bilo gde, tj. probaj da stekneš naviku da čim napraviš neku funkciju da odmah iskopiraš njen prototip negde na vrhu koda i posle te ne boli glava da li si je napisao iznad ili ispod mesta njene upotrebe.
Drugo, možeš uštedeti na kodu i memorijskom prostoru ako umesto const int upotrebiš #define, npr ovako:
//const int buttonPin = 8;
//const int buttonPin1 = 9;
#define buttonPin 8
#define buttonPin1 9
Posts: 6.315
Threads: 56
Joined: Mar 2013
Reputation:
3.085
05-09-2021, 09:13 PM
(This post was last modified: 05-09-2021, 09:20 PM by Macola.)
#define je ekstremno moćna direktiva u C i može se upotrebiti za mnogo toga.
Na primer, brojevi koje vežeš za neko ime pomoću #define nisu rezervisani samo za to ime. Recimo možeš glatko napraviti ovako:
#define pera 1
#define žika 1
#define đorđe 1
Negde dole u kodu, pozvao ti peru, žiku ili đorđa, program će to videti kao 1.
Praktičnost je u tome što je lakše pamtiti imena nego brojeve.
Define direktiva može sadržati i jako složene stvari koje dobiju jedno ime.
#define zoran (pera + žika - đorđe)
Ako negde napišeš zoran, to će biti shvaćeno kao (1+1-1) tj. opet kao 1 na primer...
Ili možda ovako:
#define lcd_home() lcd_cmd(0x02); delay_lcd_us(500)
Vidiš, ovde je direktiva define kreirala funkciju koja poziva i upotrebljava neke druge dve funkcije, ili možda i ovako:
#define lcd_cursor(x) lcd_cmd(((x)&0x7F)|0x80)
Upoznaj mogućnosti define direktive jer je jako moćna i može puno olakšati pisanje.
Pozdrav
Posts: 392
Threads: 51
Joined: May 2014
Reputation:
32
Hvala drugar.Svako objasnjenje je korisno i dobrodoslo.To za kreiranje na vrhu sam znao i tako sam prvo postavio:
int buttonPin = 8;
int buttonPin1 = 9;
int ledPin = 13;
int ledPin1 = 12;
boolean flag = 0;
int buttonState = HIGH;
int buttonState1 = HIGH;
int i;
void sad(void); ----------- ovo ovde
void setup() {
//
pa ovde dole tad moze i ovako :
void sad() { bez void u zagradi
digitalWrite(ledPin1,LOW);
delay(500);
digitalWrite(ledPin1,HIGH);
delay(500);
}
ali zbog zagrade nije vredelo gde god da definisem sad();
Da iskoristim priliku pa da pitam na osnovu ovoga sto je Miki napisao
"dok MILANNN ne nauci ispravnu sintaksu i pravila C jezika ili ne dok promeni IDE"
Koji je najbolje IDE skinuti ? Meni bi stvarno koristio neki takav kao sto je Miki predlozio.
Posts: 8.729
Threads: 138
Joined: Apr 2013
Reputation:
3.629
(05-09-2021, 09:33 PM)MILANNN Wrote: Da iskoristim priliku pa da pitam na osnovu ovoga sto je Miki napisao
"dok MILANNN ne nauci ispravnu sintaksu i pravila C jezika ili ne dok promeni IDE"
Koji je najbolje IDE skinuti ? Meni bi stvarno koristio neki takav kao sto je Miki predlozio.
Procitaj za pocetak ovo
https://blog.jetbrains.com/clion/2020/08...o-prof-p1/
Posts: 665
Threads: 40
Joined: Jul 2015
Reputation:
398
(05-09-2021, 09:33 PM)MILANNN Wrote: Koji je najbolje IDE skinuti ? Meni bi stvarno koristio neki takav kao sto je Miki predlozio.
https://code.visualstudio.com/
Uz razlicite extenzije vrlo mocan editor.
Posts: 692
Threads: 8
Joined: Mar 2013
Reputation:
234
Code: const int buttonPin = 8;
const int buttonPin1 = 9;
int ledPin = 13;
int ledPin1 = 12;
/*
Dogovori se sam sa sobom kako ćeš da deklarišeš pinove
Ja to radim ovako:
#define Pin1 62
#define Pin2 63
#define Pin3 64
#define Pin4 65
#define Pin5 66
#define Pin6 67
#define Pin7 68
#define Pin8 69
#define Pin9 22
#define Pin10 24
#define Pin11 26
#define Pin12 28
#define Pin13 30
#define Pin14 32
#define Pin15 34
#define Pin16 36
*/
boolean flag = 0;
int buttonState = HIGH;
int buttonState1 = HIGH;
int i;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(buttonPin1, INPUT);
//int buttonState1 = HIGH;
// int buttonState = HIGH; // Zašto si ovo duplirao?
}
void loop() {
//buttonState1 = digitalRead(buttonPin1);
buttonState = digitalRead(buttonPin);
flag = true;
// if (digitalRead(buttonPin1) == LOW) {
if (!digitalRead(buttonPin1)) {
sad(); // --------------------------------- ovde je greska :D (Nije, samo ti je funkcija bila na pogre[nom mestu.)
}
if (buttonState == false) {
digitalWrite(ledPin, LOW);
delay(500);
} else {
digitalWrite(ledPin, HIGH);
delay(500);
}
}
void sad() {
digitalWrite(ledPin1, LOW);
delay(500);
digitalWrite(ledPin1, HIGH);
delay(500);
}
Arduino IDE-u ne fali mnogo toga, ne treba pljuckati po alatkama koje su namenjene početnicima, a i ne samo njima.
Komentari u kodu.
Make no mistake between my personality and my attitude.
My personality is who I am.
My attitude depends on who you are.
塞爾維亞文
Posts: 6.315
Threads: 56
Joined: Mar 2013
Reputation:
3.085
05-10-2021, 01:22 AM
(This post was last modified: 05-10-2021, 01:24 AM by Macola.)
ZASto,
#define je pretprocesorska direktiva i ne stavlja konstantu u ROM čipa.
Kod MCU "male zapremine" programske memorije zna da uštedi prostor, posebno ako treba dosta konstanti.
Izbor je na njemu. Citiraću sebe:
"Drugo, možeš uštedeti na kodu i memorijskom prostoru ako umesto const int upotrebiš #define, npr ovako:
//const int buttonPin = 8;
//const int buttonPin1 = 9;
#define buttonPin 8
#define buttonPin1 9 "
Posts: 8.729
Threads: 138
Joined: Apr 2013
Reputation:
3.629
05-10-2021, 11:57 AM
(This post was last modified: 05-10-2021, 12:00 PM by mikikg.)
@Macola
#define ne stedi tek tako prostor, u sustini sve sto napises i upotrebis negde u programu to MORA negde da se smesti, prvo u programsku (FLASH) memoriju jer mora odnekud da pocne a posle dodatno i u RAM memoriju ako je to promenljiva tj nije konstanta.
Generalno #define i const sluze u cilju ustede RAM memorije a FLASH ne moze da se stedi tek tako, mora negde/nesto da se zabelezi ...
To je poznata stvar, zato svi MCU uglavnom imaju daleko vise FLASH nego RAM memorije.
Posts: 8.729
Threads: 138
Joined: Apr 2013
Reputation:
3.629
@Macola
evo konkretan primer gde se vidi da je #define i const ustvari isto, isti FLASH prostor zauzima, ne utice uopste na RAM.
//Ovo je isto kao i const definicija
//#define neki_32bit_broj1 0x70000001
//#define neki_32bit_broj2 0x70000002
//#define neki_32bit_broj3 0x70000003
//#define neki_32bit_broj4 0x70000004
const int32_t neki_32bit_broj1 = 0x70000001;
const int32_t neki_32bit_broj2 = 0x70000002;
const int32_t neki_32bit_broj3 = 0x70000003;
const int32_t neki_32bit_broj4 = 0x70000004;
int main(void) {
//proba, upotrebljavamo konstante (da ne optimizuje prevodilac ako ne koristimo)
cnt = neki_32bit_broj1;
cnt = neki_32bit_broj2;
cnt = neki_32bit_broj3;
cnt = neki_32bit_broj4;
}
Posts: 8.729
Threads: 138
Joined: Apr 2013
Reputation:
3.629
Na primer cak i ovaj code zauzima isti FLASH prostor (ne dira RAM) jer je prevodilac bio pametan da skonta da iako smo definisali variablu ali je "nismo cackali/menjali" on to pretvori u konstantu i ustedi RAM!
//Ovo je isto kao i const definicija
//#define neki_32bit_broj1 0x70000001
//#define neki_32bit_broj2 0x70000002
//#define neki_32bit_broj3 0x70000003
//#define neki_32bit_broj4 0x70000004
//const int32_t neki_32bit_broj1 = 0x70000001;
//const int32_t neki_32bit_broj2 = 0x70000002;
//const int32_t neki_32bit_broj3 = 0x70000003;
//const int32_t neki_32bit_broj4 = 0x70000004;
int main(void) {
int32_t neki_32bit_broj1 = 0x70000001;
int32_t neki_32bit_broj2 = 0x70000002;
int32_t neki_32bit_broj3 = 0x70000003;
int32_t neki_32bit_broj4 = 0x70000004;
//proba, upotrebljavamo konstante (da ne optimizuje prevodilac ako ne koristimo)
cnt = neki_32bit_broj1;
cnt = neki_32bit_broj2;
cnt = neki_32bit_broj3;
cnt = neki_32bit_broj4;
}
|