[PIC] aiuto su direttiva (difficile)

ciao!

sto programmando con il PCH della CCS (pic18xxx)

la direttiva #inline piazzata prima di una function() dice al compilatore di non generare una chiamata alla funzione dichiarata #inline ma di "copiare" la funzione in ogni punto del programma in cui questa viene richiesta. questo comporta un codicè più efficiente ma meno compatto e permette di risparmiare un livello di stack

fin qui tutto ok

il mio problema sarebbe trovare un sistema per dire al compilatore di copiare la funzione solo in certi punti del programma e nelle altre posizioni lasciare la chiamata alla funzione stessa

cerco un sistema che non sia quello di fare copia-incolla, ovviamente :)

qualcuno ha idea se sia possibile questo?

-ice-

Reply to
ice
Loading thread data ...

Sulu! Fuoco coi phaser su ice che ha violato la prima direttiva in data stellare mar 15 apr 2008 07:40:44p dicendo:

Se il tuo scopo è quello di avere il codice in un posto solo, definisci una funzione non inline con un altro nome (o in overload con un parametro fittizio) che richiama la funzione inline. Quando vuoi la sostituzione userai un nome, altrimenti userai l'altro nome.

Reply to
Luca

esattamente!

definisci una

cioè tu suggerisci qualcosa tipo:

#inline void task_a(int i) { //do something here }

#separate void task_a() { task_a(0); }

ora provo... geniale!!! grazie

-ice-

Reply to
ice

ho provato ma con la #separate mi da un errore a causa dell'overloading... togliendo la #separate funziona però viene lasciata al compilatore la possibilità di decidere se fare o no la funzione #inline mentre a me serve che dove non la voglio #inline non lo sia...

provo a pensarci su un attimo

-ice-

Reply to
ice

Sulu! Fuoco coi phaser su ice che ha violato la prima direttiva in data stellare mar 15 apr 2008 08:04:31p dicendo:

Prova a dargli due nomi diversi. Teoricamente dovrebbe funzionare, ma se il compilatore "osa" certe ottimizzazioni, sei fregato :-)

Reply to
Luca

evitando l'overloading il problema si risolve perchè #inline e #separate agiscono su funzioni con nomi diversi tengo buona questa:

#inline void buffer_load_addr_INLINE(long addr) { //code here }

#separate void buffer_load_addr(long addr) { buffer_load_addr_INLINE(addr); }

grazie per la velocissima consuleza!

-ice-

Reply to
ice

Sulu! Fuoco coi phaser su ice che ha violato la prima direttiva in data stellare mar 15 apr 2008 08:08:41p dicendo:

... passavo di qui per caso ;-)

Reply to
Luca

non ho mai provato a farlo programmando i pic ma la sintassi usata nel C++ piu o meno funziona così:

int somma(int a, int b) {return a+b} // funzione in oggetto .... .. //codice vario .... printf("la somma e' ", inline somma(num1,num2)); //funzione inline ..... ..... s=somma(num1,num2); //fuzione non inline

se funzionasse sarebbe decisamente migliore del definire due volte la stessa funzione.. se provi facci sapere l'esito.

--
Davide C.
www.ingegnerando.it



questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news segnala gli abusi ad abuse@newsland.it
Reply to
ahrfukkio

ho provato ma il compilatore che uso non permette un function-qualifier (come #inline o #separate) messo prima della chiamata alla funzione ma permette solo di piazzare un function-qualifier prima della dichiarazione della funzione stessa

grazie, ad ogni modo!

-ice-

Reply to
ice

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.