View Full Version : [C] problemi
lefermops
17-06-2009, 12:23
sto passando dall'assembler al C. forse sono ancora troppo rivolta al basso livello ....
:mc: non riesco a controllare se un parametro è o meno nel range... ho fatto e rifatto quella routine in mille modi, ma non riesco a capire....:muro:
richiamo una procedura di controllo, faccio il controllo, poi al ritorno il test una scelta. sono stata attenta e mi pare che sia semplice....dovrebbe andare liscio, invece non funziona ç_ç
long controllo(long param1, long param2)
{ //passabanda!!!! --> 1<param1<25
timer = 200; // carico timer = 2 secondi
// se param1 > 25 -> overbanda + se param <1 -> underbanda
if ((param1 >25) && (param1<1))
{
scrivo_errore(); //scrivo "errore" a video
param2 = 21; //segnalo errore
}
else buzzer = 1; // sono in "banda" faccio un bip!
return(param2); //trasmetto param2 al main
}
[...main...]
case 5: //controllo
controllo(param);
if (tasto==x) stato =1; //torno indietro
if (param2!=21) stato++; //vado oltre
else break;
grazie a chi mi darà una dritta!!^^:help:
Volutomitra
17-06-2009, 12:32
if ((param1 >25) && (param1<1))
Come fa param1 a essere contemporaneamente maggiore di 25 e minore di 1?
Forse è meglio un OR...
lefermops
17-06-2009, 12:34
si, è un OR.... ho sbagliato a scrivere...
param1 lo setto nel main....
qwerty86
17-06-2009, 12:45
ci sono un paio di problemi :
-la funzione controllo prende due parametri , ma tu nel main ne passi solo uno
- cosa intendi con non funziona? non compila? o non esegue quello che vuoi ?
lefermops
17-06-2009, 12:52
a controllo passo i due parametri che nell'ordine in cui li ho dichiarati nella procedura.
il problema è che non riesco ad ottenere quello che voglio...
se metto un valore alla mia variabile fuori dalla "banda di valenza" bippa lo stesso, e funziona come se fosse il valore "buono".
long controllo(long param1, long param2)
{ //passabanda!!!! --> 1<param1<25
timer = 200; // carico timer = 2 secondi
// se param1 > 25 -> overbanda + se param <1 -> underbanda
if ((param1 >25) || (param1<1))
{
scrivo_errore(); //scrivo "errore" a video
param2 = 21; //segnalo errore
}
else if ((param1<25)&&(param1>1)) buzzer = 1; // sono in "banda" faccio un bip!
return(param2); //trasmetto param2 al main
}
[...main...]
case 5: //controllo
controllo(param1, param2);
if (tasto==x) stato =1; //torno indietro
if (param2!=21) stato++; //vado oltre
else break;
fai restituire alla funzione un valore ma non lo assegni a niente, così lo perdi. non dovresti fare
param2 = controllo(param1, param2);
?
EDIT anche l'else if è sbagliato: devi mettere un or. inoltre se fai uso di >=, <= ti basta un else senza if.
tomminno
17-06-2009, 13:11
long controllo(long param1, long param2)
{ //passabanda!!!! --> 1<param1<25
timer = 200; // carico timer = 2 secondi
// se param1 > 25 -> overbanda + se param <1 -> underbanda
if ((param1 >25) || (param1<1))
{
scrivo_errore(); //scrivo "errore" a video
param2 = 21; //segnalo errore
}
else if ((param1<25)&&(param1>1)) buzzer = 1; // sono in "banda" faccio un bip!
return(param2); //trasmetto param2 al main
}
[...main...]
case 5: //controllo
controllo(param1, param2);
if (tasto==x) stato =1; //torno indietro
if (param2!=21) stato++; //vado oltre
else break;
La definizione di controllo è sbagliata param2 non verrà mai ritornato al main, hai 2 possibilità:
void controllo(long param1, long * param2)
...
//nel main
controllo(param1, ¶m2);
long controllo(long param1)
...
//nel main
param2 = controllo(param1);
io preferisco la seconda
lefermops
17-06-2009, 13:17
Grazie!!!!!!:D
adesso funziona!!!
ho assegnato il parametro al richiamo della procedura
param2 = controllo(param1, param2);
e tolto l'if all'else usando >=e<=.
grazie mille per l'aiuto!!!:p
figurati :)
comunque come ti ha fatto vedere tomminno è ancora meglio, non hai bisogno di param2 nella funzione a questo punto.
lefermops
17-06-2009, 14:45
provo il nuovo assetto con un solo parametro....
non pensavo che fosse così difficile il passaggio da basso ad alto livello!!!
lefermops
17-06-2009, 15:24
anche con un solo parametro funziona ;)
grazie milleeeeeeeee!!:D
ma ho già un secondo problema.... (ettepareva!!)
sto cercando di tarare un sensore (normalissimo ponte resistivo).
ho fatto succedere le videate...
1° ----- (sto aspettando la risposta)
2° quando il converter risponde, visualizzo tranquilla la lettura e salvo il primo valore.
fin qui tutto bene......
ma se cerco di fare la videata col secondo punto di taratura, le prime due videate non funzionano più......
case 8: //aspetto che converter sia stabile
if(!conv) //se converter non attivo
{
trattini(); // visualizzo '----'
}
if (tasto==x) stato =1; //torno indietro
if (param2!=21) stato++; //vado oltre
else break;
case 9: //prendo primo punto calibrazione
vis_conv(); //visualizzo lettura converter su video
primo_valore = lettura_conv; //salvo lettura primo punto
if (tasto==x) stato =1; //torno indietro
//timer = 500; // ricarico timer a 5 SECONDI
stato++; // VADO OLTRE
BUZZER=1; // bippa
break;
case 10: //prendo secondo punto calibrazione
timer=5000; //carico 5 minuti
temp=100;
while (timer) scaldo(); //porto a temperatura nota
vis_conv(); //visualizzo lettura converter su video
secondo_valore = lettura_conv; //salvo lettura secondo punto
if (tasto==x) stato =1; //torno indietro
timer = 500; // ricarico timer a 5 SECONDI
stato++; // VADO OLTRE
BUZZER=1; // bippa
break;
il bello è che non riesco ad usare i breakpoint!!! sto imparando sia il C che ad usare il compilatore ma..... mi sa che entrambi mi detestano!!!! ç_ç
lefermops
18-06-2009, 11:33
risolto.....^^
ho rifatto tutto da capo!!:D
malocchio
18-06-2009, 11:47
Ma per curiosità per che cosa stai programmando?
lefermops
18-06-2009, 11:55
sto ri-scrivendo il firmware per una cpu che gestisce un sensore, una stampantina, una tastiera e un display....
il programma in origine è un fw di 32k in assembler intel.... solo che il processore che usavamo è stato obsoletato..... quindi ci è toccato sceglierne un altro.
il mio capo ha scelto il 430 della texas.... che dopo due mesi di remate, comincia anche a piacermi (adesso che funziona!!^^)
poi abbiamo pensato che, visto che avrei comunque dovuto imparare ad usare il nuovo assembler e il nuovo compilatore, era meglio passare al C, per avere una maggiore portabilità.... e non dover rifare sempre i sw ogni 10/15 anni quando il micro viene obsoletato!!!! (ma per me è il primo osbolamento..)
ma finalmente sono contenta!!!! il mio bambino inizia a funzionareeeeeee!!!! :D
che figata. spero di trovare un lavoro come il tuo un giorno :)
lefermops
20-06-2009, 15:45
...... anch'io!!!:D magari anche con uno stipendio!!!;)
qui i soldi non girano.... e spesso siamo costretti a lavorare gratis.... ma nonostante tutto è bello, e prima o poi la crisi finirà,.... ma con 'sti cinesi che vendono a 1 euro ciò che qui in Italia costa 100, la vedo dura!!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.