Moderátori: psichac, Moderátori
Pacient napísal:ako obísť použitie relačných operátorov
unsigned char a, b, c, d, e, f;
unsigned char *pUp, *pDown;
a=b=c=d=e=f=0;
pUp=&a;
pDown=&f;
while (1){
if (tick) {
(*pUp)++;
(*pDown)--;
if (!(*pUp)){ // posupni ukazatele ak sme pretiekli na 0
if (pUp == &a) { pUp=&b; pDown=&a;}
else if (pUp == &b) { pUp=&c; pDown=&b;}
else if (pUp == &c) { pUp=&d; pDown=&c;}
else if (pUp == &d) { pUp=&e; pDown=&d;}
else if (pUp == &e) { pUp=&f; pDown=&e;}
else { pUp=&a; pDown=&f;}
}
tick=0;
}
}
for (channel=0;channel<=(firstChannel+lastChannel);channel++) { // periodically surf channels
value=0;
if (channel==firstChannel) { // exception for first channel
value=chval[channel];
sendData(channel,value,fade);
} else { // all other channels
value=chval[channel+work]; // value for previos channel
if ((fade>0 && value>=lightOn) || (fade<0 && value<=lightOff)) { // previous value is in interval to change
value=chval[channel];
sendData(channel,value,fade); //send value for channel
}
}
unsigned char chanels[6];
unsigned char *pUp, *pDown;
chanels[0]=chanels[1]=chanels[2]=chanels[3]=chanels[4]=chanels[5]=0; // alebo cyklom
pUp=chanels;
pDown=&chanels[5];
while (1){
if (tick) {
(*pUp)++;
(*pDown)--;
if (!(*pUp)){ // posupni ukazatele ak sme pretiekli na 0
if (pUp == &chanels[5]) { pUp=chanels; pDown=&chanels[5];}
else { pDown=pUp; pUp++; }
}
tick=0;
}
}
peterple
ja som si len myslel že bez použitia relačných operátorov to bude jednoduchšie
const int lastChannel=5; // 6 kanalov 0..5
void SetValue(setChannel, int step) {
int endValue = step==1?255:0; //nastav hodnotu, kedy skoncit
int i = step==1?0:255; //nastav hodnotu od ktorej zacat - opak endValue
while (i != endValue) { // opakuj, kym nedosiahnes koniec
SetChannel = i; //nastav hodnotu na kanale
i + = step; //zvysit, znizit hodnotu
//pripadny delay
}
}
void main() {
channel = 0;
while (true) {
SetValue(channel,1);
//aj tu moze byt delay - je max. rozsvietene
SetValue(channel,-1);
channel++; //prejdi na dalsi kanal
if (channel>lastChannel) { //ak je viac ako max, chod na kanal 0
channel = 0;
}
}
peterple napísal:Nuž tu sa musím opýtať takú klasickú otázku majora Terazkyho. A čo si vy Kefalín predstavujete pod pojmom relačný operátor?
Ja tu totiž od začiatku tuším že ide o terminologický omyl. S if to totiž nemá veľa spoločného. (navyše if nie je funkcia)
http://ctp.mkprog.eu/sk/c/relacne_operatory/
A čo také ukazatele? Tie som použiť mohol? Ja som to napísal najjednoduchšie ako som len vedel. Len neviem neviem či sa to dá pochopiť bez hlbších znalostí C a binárnej sústavy. Ale zasa platí kto sa veľa pýta ten sa veľa dozvie.
SetChannel (setChannel, i) //nastav hodnotu na kanale
peterple napísal:Url link funguje. V tom prvom nábehu ti tam nechýba modrá nadol? Ak áno, tak som ti to urobil už dvakrát, raz s premennými, raz s poľom a vždy bez relačných operátorov ako si zrejme omylom požadoval. Je to z hlavy, nie je to odladené, ale zatiaľ to principiálne nikto nenapadol. Tak si to odsimuluj ak máš záujem. Viac nemám k tomu čo dodať. Upraviť aby to prvý raz tú modrú nadol neťahalo je brnkačka na jeden if a jednu premenú.
peterple napísal:kedže sme v C a testuje sa proti nule tak ich nepotrebujem. operátor ! mi v tomto prípade bohate stačí. Akurát tomu asi málokto porozumie Možno nejaký javascriptaci, tam je to bežná konštrukcia. V JAVA to zrušili a tam treba použiť operátor !=.
Ale či to zapíše v C človek tak alebo tak tak to vo výsledku kompilátor preloží úplne rovnako.
Ja som sa len hodne divil že niekto píše požiadavku asi takým to štýlom:
Chcel by som odviesť autom. Ale nesiete použiť volant. Ale aj to sa dá. Stále rovno najprv dopredu a potom dozadu. V tom programe sa robí oboje naraz.
Užívatelia prezerajúci si toto fórum: Žiadny registrovaný používateľ a 0 hostí.