[PIC] aiuto su direttiva (difficile)

Apr 15, 2008 8 Replies

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-


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.

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-

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-

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 :-)

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-

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 ;-)

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

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-

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required