Newsgroup: it.hobby.elettronica.digitale
Titolo: linguaggio C

Salve!
Sto cercando di impararare qualche cosina sul linguaggio C per programmare i 
PIC nei vari esempi che incontro noto questa differenza: main() ed altre 
volte main(void) quale e' la differenza? 

Enzo wrote:

Se ben ricordo la risposta la trovi nel thread "Differenze in linguaggio 
C" da te aperto a metà dicembre.
Ciao!
Marco / iw2nzm


Lol
ciao Marco :)
coals 

 ha scritto nel messaggio 
news:ZtJgj.218947$U01.1...@twister1.libero.it...

so che in quella occasione si e' parlato anche di questo, ma io volevo 
capire nel dettaglio cosa voglia dire ritorno a void anziche' int , nei 
jmanuali che ho sottomano purtroppo si danno per scontato cose che per un 
neofita non lo sono, qundi o si accetta di usare un certo tipo di sintassi 
senza spiegarsi il perche' oppure si cerca di capire, io ad esempio leggendo 
la rivista firmware dove si trova qualche sorgente per pic usando il 
compilatore della CCS trovo un tipo di forma poi mi capita vedere dei 
semplici esempi presi dal sito della ccs dove si cambia la forma delle 
istruzioni 

 volte main(void) quale e' la differenza?
La risposta è nel thread a cui ho partecipato anche io, comunque un 
prototipo di funzione generico:
<tipo di ritorno> <nome funzione> (<tipo arg1>, <tipo arg2>, ...)
il tipo di ritorno è ciò che rende la funzione una volta terminata, con la 
funzione return, i tipi degli argomenti sono i tipi dei dati passati. Per 
esempio
void funzione(unsigned char, float, * int)
è una funzione che non ritorna niente (void), cioè non è necessario il 
return, che viene usato al limite per uscire dalla funzione in punti 
differenti.
Puoi passargli un char senza segno (8 bit, da 0 a 255), un float (32 bit, 
numero in virgola mobile) e un puntatore a intero (i puntatori guardateli 
sono fondamentali).
Puoi per esempio invocare questa funzione così :
funzione (42, 4.586, &numero)
Chiaro che l'indirizzamento non deve essere per forza immediato, cioè gli 
passi un numero, ma può essere anche diretto (una variabile) o indiretto (un 
puntatore a una variabile)
Ciao
-- 
____________________
      CG Engineering
 Lab. Ricerca & Sviluppo
********************
Skype : cg_ingegnering
MSN : 
cgaudiola...@interfree.it
ICQ UIN# : 104528066 

 funzione (42, 4.586, &numero)
Scusa, ma cosa è quello strano segno prima di "numero" ? Forse un
emoticon ?
Non lo so, spesso la gente scrive le cose dando per scontato un sacco
gli argomenti, come l'uso del font più appropriato nella dichiarazione
delle macro.
Io so che qui siete stanchi di rispondere ai dubbi dei principianti
come me... ma io,  continuo lo stesso a produrre domande su argomenti
che, alla prima passata su google, fornirebbero materiale per 40 ore
di lettura. E riesco anche a ripeterle pari pari, quando mi sento
solo.
Una volta ho anche fatto una domanda sull'arm .... 8^).
Saluti programmabili
{simone.bern}

 gli argomenti, come l'uso del font pi� appropriato nella dichiarazione


il tuo sarcasmo é fuori luogo se hai problemi puoi rivolgerti ad un
buon psicologo usa google vedrai troverai qualcuno



 buon psicologo usa google vedrai troverai qualcuno
si rileva una certa difficoltà nell'uso della punteggiatura. La prima
parte della frase, per esempio, non è coordinabile con le restanti ed
è quindi necessario terminarla con un punto.
<< il tuo sarcasmo é fuori luogo. >>
La parte restante va comunque spezzata, poichè è composta di due frasi
indipendenti. In questo caso, tuttavia, si può immaginare un nesso di
causa-effetto, quindi è possibile usare un'interpunzione lieve, come
un punto e virgola.
Inoltre, dopo la frase con il verbo imperativo, va inserita una
virgola.
Per correttezza, il tutto andrebbe concluso con un ulteriore punto.
<< se hai problemi puoi rivolgerti ad un buon psicologo; usa google,
vedrai troverai qualcuno. >>
Il testo corretto, quindi, anche utilizzando correttamente la prima
lettera maiuscola,  risulta:
<< Il tuo sarcasmo é fuori luogo. Se hai problemi puoi rivolgerti ad
un buon psicologo; usa google, vedrai troverai qualcuno. >>
Saluti,
simone.bern

 simone.bern
Secondo me loa frase esatta è ..., vedrai che troverai qualcuno.
Comunque, non ho ancora letto un post costruttivo da parte tua!
Frankie

 Comunque, non ho ancora letto un post costruttivo da parte tua!
Come, come ?! Proprio tu, parli, che usi una punteggiatura accurata!
Dimmi infatti se non vale la pena di spendersi, in questo mondo, per
recuperare coloro che si sono smarriti alle tradizioni della gloriosa
grammatica italiana ....
saluti,
simone.bern

non è semplice scrivere con una PSP comunque è evidente che tu abbia
capito.



>......Una volta ho anche fatto una domanda sull'arm .... 8^).
Gia' in un altro mio post ti avevo pregato di non rompere piu' le palle, 
evidentemete ti diverti.
P.s. il mio consiglio e' di usare google per trovare un buon ospedale, ti 
ricoveri fai tutti gli accertamenti, vedrai che facendo le sedute 
psicologiche starai meglio con te stesso e con gli altri, ma forse la tua 
presunzione ti dice che stai bene e non hai bisogno del medico? 


Hai ragione rileggendo quei messaggi ed approfondendo i puntatori la cosa e' 
piu' chiara, ma chiedo scusa a te e agli altri perche' finoa poco tempo fa 
usavo il compilatore Basic della Melabs, l'uso del C ha cose completamente 
diverse rispetto al basic, ad esempio il dubbio che ho ora e' perche' usare 
i puntatori invece di usare una variabile globale? comunque pensavo e vorrei 
conferma da te che converrebbe usare un sistema di Debug come puo' essere 
ICDU40 della CCS e con semplici programmi si potrebbe capire bene3 come 
funzionano i puntatori ed altre cose. 

 funzionano i puntatori ed altre cose. 
Non vedo una stretta attinenza tra un sistema di debug in-system e la 
teoria sui puntatori. Per capirli non è nemmeno necessario usare un 
compilatore per microcontroller, basta un qualunque compilatore C per 
PC. Per rimanere sui micro è sufficiente il simulatore (MPLAB per i PIC, 
AVRStudio per gli AVR) per vedere "cosa succede".
Ciao!
Marco / iw2nzm

 Marco / iw2nzm
Sai dirmi se la simulazione posso farla da Mplab usando il compilatore CCS? 

 Sai dirmi se la simulazione posso farla da Mplab usando il compilatore CCS? 
Potrei sbagliarmi, ma se ben ricordo lo puoi fare tranquillamente.
Marco / iw2nzm

 ha scritto nel messaggio 
news:2I6hj.219934$U01.1...@twister1.libero.it...

Avevi ragione si puo' fare ho fatto una prova con un programmino molto 
semplice:
#include <16f628A.h>
#fuses hs,nolvp,nowdt
#use delay (clock=2)
#define green_led pin_a5
#define yellow_led pin_b4
#define red_led pin_b5
void main ()  {
while (true) {
output_low (green_led);
output_low (yellow_led);
output_low (red_led),
delay_ms (300);
output_high (green_led);
output_high (yellow_led);
output_high (red_led);
delay_ms (300);
}
}
poi cliccando sul simbolo di animate comapre una freccai verde che fa vedere 
la sequenza che parte da output_low (green_led) e finisce alla prima 
parentesi graffa, ho dovuto fare una modifica alla riga #use delay (clock=2) 
infatti era impostata per il clock a 20Mhz  e cosi' quando arrivava al primo 
ritardo cioe' a delay_ms (300) ci voleva moltissimo tempo per avere 
l'avanzamento alla riga successiva

 Una volta ho anche fatto una domanda sull'arm .... 8^).
Non ho dato scontato niente, ho solo cercato di dare uno spunto. Chiaro che 
non posso mettermi a raccontare il C, ci sono libri e corsi universitari 
apposta!!!


 e' perche' usare i puntatori invece di usare una variabile globale?
-cut-
I motivi te li ha già detto Marco Trapanese. Usare variabili globali è 
sempre brutta abitudine di programmazione, non molto a basso livello quanto 
ad alto livello, dove si cerca sempre di definire variabili PRIVATE non 
accessibili al di fuori della classe, utilizzando dei metodini void per 
estrarle.
A livello più basso rischi di fare confusione e difficilmente riesci a 
separare parti di programma. Ti faccio un esempio: metti che hai fatto una 
scheda che ha sopra ethernet, una compact flash, un adc, un dac e un 
display. Metti che vuoi utilizzare lo stesso hardware per fare tutte le cose 
tranne una, perchè non riesci a farle tutte (non ci entri come ram). Se hai 
usato variabili globali è un casino isolare le parti di programma, mentre se 
hai fatto le cose "pulite" è molto semplice.
Peggiori inoltre la portabilità del tuo codice e l'ottimizzabilità da parte 
di compilatori (che magari si fanno un albero delle chiamate a funzione e 
recuperano lo spazio delle variabili locali delle funzioni, cosa impossibile 
da fare con variabili globali in giro)


 sempre brutta abitudine di programmazione
CUT
manca una cosa (se ho letto attentamente) alla vostra spiegazione, 
comunque corretta.
Se chiamo una funzione passandogli un numero in virgola mobile come 
argomento gli sto passando 32bit, se gli passo un puntatore a un 
indirizzo di memoria glie ne passo soltanto 16 e il tutto risulta più 
snello, veloce e meno esoso.
(32 e 16 sono valori presi a caso, dipende dal sistema su cui si opera ma 
il concetto è quello).
-- 
Nuno on zx-6r '04 & CR 250 '98 working in progress...
Agarra la HONDA
*** 
www.gladio.org
 ***

 il concetto è quello).
Non sono d'accordo con la filosofia espressa in questo concetto.
Non è sano fare assunzioni sulla grandezza dei tipi in modo così generico.
Non è assolutamente detto, in generale, che un puntatore occupi meno 
memoria di un float o di un intero. Quindi non è detto di ottenere un 
vantaggio dal passare i parametri per puntatore. E anche se fosse vero 
che occupano meno memoria, il guadagno che se ne ottiene è davvero 
minimo: occupo 2 byte di stack o qualche registro in meno, che tanto 
verranno riciclati appena la funzione esce.
In compenso non è assolutamente detto che il compilatore generi codice 
più efficiente se deve lavorare con un puntatore invece di una 
variabile. Alla fine è molto probabile che quella che tu pensi sia 
un'ottimizzazione faccia in realtà sprecare più memoria programma.
Inoltre avere puntatori in giro aumenta la possibilità di inserire bug 
in modo consistente.
Io penso che i puntatori andrebbero usati solo quando servono; essi sono 
responsabili dei peggiori bug mai concepiti dall'uomo e della 
maggioranza dei bug in generale. Se non ce n'è bisogno, io non li toccherei.
Ciao

 un'ottimizzazione faccia in realt… sprecare pi— memoria programma.
assolutamente no. Non sono cose che io penso, è così e ci sono delle 
motivazioni. Quando invece che un INT passerai una intera istanza di una 
classe come argomento vedrai come cambieranno le cose. Ad ogni modo se 
anche si trattasse di 2 miseri byte vanno comunque presi in 
considerazione. 2 byte in meno in memoria sono 2 byte in meno 
spostati/scritti/rispostati quando necessario. 
Pensa a una CPU che muove 4 byte per volta e tu invece ne hai memorizzati 
5...avrai bisogno di leggere 2 volte per completare tutto il 
trasferimento. 1 solo byte ti fa perdere del misero spazio in memoria e 
del tempo considerevole, non era meglio risparmiarlo?


 del tempo considerevole, non era meglio risparmiarlo?
Come ti ho già detto, risparmiare sul passaggio, non significa 
ottimizzare in assoluto. Metti il caso (tutt'altro che infrequente) che 
accedere alla memoria in modo indiretto sia meno efficiente. Risparmi sì 
sul passaggio, ma tutte le volte che modifichi il valore perdi tempo.
Alla fine come risultato avrai codice più lento, meno leggibile, e più 
bug prone.
Questa mi sembra proprio un'ottimizzazione preventiva, e cioè senza 
reali necessità. E, come saprai, le ottimizzazioni preventive sono 
l'origine di tutti i mali.
Se risparmiare 1-2 cicli di clock significa dover passare tutto per 
puntatore, direi che proprio non conviene.
O almeno non conviene fino a che non c'è una reale necessità di 
performance, che è cosa rara in ambito embedded.
Ciao

 
quello che ho scritto nel post originale è che la vostra spiegazione era 
incompleta e non comprendeva questo caso tutt'altro che raro. L'esempio 
con l'int è solo per facilità di comprensione e l'ho specifiato.
Il punto è che uno deve sapere quando usare uno o l'altro metodo e, 
ripeto, non l'avevate specificato.
Non si tratta di ottimizzazione preventiva, si tratta di sapere la 
differenza tra i 2 approcci e poter scegliere quella migliore.


 differenza tra i 2 approcci e poter scegliere quella migliore.
Sì però per semplificare troppo, non hai espresso il concetto corretto, 
che è quest'ultimo indicato. Per il resto sono d'accordo.
Ciao