PDA

View Full Version : [C] Refactoring del codice: voi cosa usate?


Matrixbob
24-08-2007, 13:56
Se per refectoring si intende dare il codice in pasto a qualche sorta di tool che ti verifica le variabili rimaste inutilizzate e che re-indenta il codice.

;)

Matrixbob
24-08-2007, 13:57
Io avevo sentito parlare di:
CERP refactoring

, ma non so se esiste ancora, come è fatto e come si usa. :)

[EDIT]
Ecco dove lo avevo visto:
[How-to] Sviluppare in C/C++ usando Eclipse+CDT (http://eraora.wordpress.com/2006/10/04/costruirsi-un-ambiente-di-programmazione-cc-usando-eclipsecdt/#comment-23)

cionci
24-08-2007, 15:36
No, il refactoring non fa quello che dici. Il refactoring è un processo di trasformazione da applicare al codice che mantiene gli effetti esterni del codice, ma che muta la sua struttura interna.
Si applica a linguaggi Object Oriented quindi non al C, anche se volendo alcune norme di refactoring possono essere riportate anche al C.

Quello che vuoi te è un formattatore automatico di codice.
La verifica delle variabili inutilizzate te la dovrebbe fare già il compiltatore ritornandoti un warning.

Matrixbob
24-08-2007, 15:49
Il refactoring è un processo di trasformazione da applicare al codice che mantiene gli effetti esterni del codice, ma che muta la sua struttura interna.
Si applica a linguaggi Object Oriented quindi non al C, anche se volendo alcune norme di refactoring possono essere riportate anche al C.

Ma dai, quindi il codice muta, ma quello che l'applicazione fa no?
Quindi lo migliora magari rimpiazzando le classi deprecate con le + aggiornate & co?
:confused:


Quello che vuoi te è un formattatore automatico di codice.
La verifica delle variabili inutilizzate te la dovrebbe fare già il compiltatore ritornandoti un warning.

Hai qualche nome di questo formattatori?
C'è 1 opz da dare al compilatore GCC perchè sia pedantico e mi restituisca i warning?
Altrimenti di default compila e non mi dice nulla.
Tutto pulito parrebbe.
:boh:

cionci
24-08-2007, 15:59
Ma dai, quindi il codice muta, ma quello che l'applicazione fa no?
Quindi lo migliora magari rimpiazzando le classi deprecate con le + aggiornate & co?:confused:
No, questo non c'entra niente. Il refactoring da applicare lo scegli tu, ci sono tot regole già scritte, ma te la puoi inventare anche tu sul momento. Ad esempio vuoi creare un nuovo metodo partendo da TOT righe di codice di un altri metodo. Questo è un refactoring ed il tool di refactoring integrato in Eclipse, ad esempio, te lo fa in automatico perché basta selezionare le righe, scegliere il refactoring da fare ed impostare il nome del nuovo metodo: lui ti sposta le righe in un nuovo metodo e mette una chiamata al nuovo metodo al posto delle righe selezionate.
Hai qualche nome di questo formattatori?

Solitamente ci sono diversi IDE che lo hanno già integrato, basta scegliere le convenzioni di formattazione e lui ti formatta il codice.
Di standalone conosco astyle e indent.
C'è 1 opz da dare al compilatore GCC perchè sia pedantico e mi restituisca i warning?
Altrimenti di default compila e non mi dice nulla.
Tutto pulito parrebbe.
:boh:
-Wpedantic

vizzz
24-08-2007, 15:59
C'è 1 opz da dare al compilatore GCC perchè sia pedantico e mi restituisca i warning?
Altrimenti di default compila e non mi dice nulla.
Tutto pulito parrebbe.
:boh:


-Wall dovrebbe bastare

Matrixbob
24-08-2007, 16:10
Ah ok x il refact.

Solitamente ci sono diversi IDE che lo hanno già integrato, basta scegliere le convenzioni di formattazione e lui ti formatta il codice.
Di standalone conosco astyle e indent.

CodeBlocks NB?


-Wpedantic

OK, controllo.

Matrixbob
24-08-2007, 16:10
-Wall dovrebbe bastare

OK, controllo.

cionci
24-08-2007, 16:36
CodeBlocks NB?
Non me lo ricordo...

Matrixbob
24-08-2007, 16:41
Non me lo ricordo...
Ah ma non lo usi + come IDE?
Mi ricordo che ne eri un sostenitore. :)

variabilepippo
24-08-2007, 17:06
CodeBlocks NB?


Ha integrato il plugin AStyle, vedi tra le voci del menu Plugins, c'è scritto Source Code Formatter (AStyle).

cionci
24-08-2007, 17:46
Ah ma non lo usi + come IDE?
Mi ricordo che ne eri un sostenitore. :)
Lo sono ancora, ma ora su Linux sto usando Anjuta.

Matrixbob
24-08-2007, 18:14
Sfrutto il fatto che conoscete C::B per chiedervi questo popup:
POST (http://www.hwupgrade.it/forum/showpost.php?p=18225611&postcount=3)
mi segnala qualcosa, ma non so dove guardare per capire cosa non ha caricato allo start C::B. :(

Non trovo file.log di C::B :boh:

variabilepippo
24-08-2007, 18:22
mi segnala qualcosa, ma non so dove guardare per capire cosa non ha caricato allo start C::B.


Probabilmente il file viene creato nella cartella CodeBlocks contenuta in "Documents & Settings".

Se fossi in te eliminerei tutta la cartella di Code::Blocks (quella in cui si trova l'eseguibile), dopo averla creata di nuovo vi decomprimerei:

http://prdownload.berlios.de/codeblocks/wxmsw28u_gcc_cb_wx284.7z

http://prdownload.berlios.de/codeblocks/mingwm10.7z

http://prdownload.berlios.de/codeblocks/CB_20070822_rev4405_win32.7z

Se non hai già installato 7ZIP scaricalo da http://downloads.sourceforge.net/sevenzip/7z452.exe

Matrixbob
24-08-2007, 19:20
Probabilmente il file viene creato nella cartella CodeBlocks contenuta in "Documents & Settings".

Se fossi in te eliminerei tutta la cartella di Code::Blocks (quella in cui si trova l'eseguibile), dopo averla creata di nuovo vi decomprimerei:

http://prdownload.berlios.de/codeblocks/wxmsw28u_gcc_cb_wx284.7z

http://prdownload.berlios.de/codeblocks/mingwm10.7z

http://prdownload.berlios.de/codeblocks/CB_20070822_rev4405_win32.7z

Se non hai già installato 7ZIP scaricalo da http://downloads.sourceforge.net/sevenzip/7z452.exe

Quindi:
- raso C::B
- installo C::B classic
- e poi sovrascrivo con questi files il contenuto?

variabilepippo
24-08-2007, 19:28
Elimina il passaggio "installo C::B classic", decomprimere quei file in una cartella VUOTA equivale ad installare la versione più recente di C::B.

Matrixbob
24-08-2007, 19:28
Niente da fare il pop è sempre li. :)
Ed io non so dove leggere quei logs.
Mah ... :muro:

Matrixbob
24-08-2007, 19:28
Elimina il passaggio "installo C::B classic", decomprimere quei file in una cartella VUOTA equivale ad installare la versione più recente di C::B.

Ah ok provo.

Matrixbob
24-08-2007, 19:32
Elimina il passaggio "installo C::B classic", decomprimere quei file in una cartella VUOTA equivale ad installare la versione più recente di C::B.

Pare funzionare, provo quella funzione di indentatura.

Matrixbob
24-08-2007, 19:36
Pare funzionare, provo quella funzione di indentatura.

Non mi convince molto lo vedo inserire dei TAB dal bordo e bon,
io mi aspettavo sistemasse gli IF ed i test negli IF, ecc..
E' meglio l'indentatura che gli ho dato io. ;)

variabilepippo
24-08-2007, 19:42
E' meglio l'indentatura che gli ho dato io.

Lo stile di indentazione è una questione di gusti. Io non uso AStyle ma http://www.textrush.com/formatx.htm.

variabilepippo
24-08-2007, 19:46
Puoi comunque personalizzare la formattazione del codice con AStyle modificando le impostazioni:

Menu Settings -> Editor -> Source Formatter (l'ultima icona in basso)

Di default non tocca molto il codice ma puoi abilitare un bel po' di opzioni!

Matrixbob
25-08-2007, 13:22
Lo stile di indentazione è una questione di gusti. Io non uso AStyle ma http://www.textrush.com/formatx.htm.

Che è a pagamento di 40e anui?
Puoi comunque personalizzare la formattazione del codice con AStyle modificando le impostazioni:

Menu Settings -> Editor -> Source Formatter (l'ultima icona in basso)

Di default non tocca molto il codice ma puoi abilitare un bel po' di opzioni!
Visto, grazie.

variabilepippo
25-08-2007, 13:31
Che è a pagamento di 40e anui?

A parte il fatto che puoi configurare il code beautifier AStyle integrato in C::B in modo da rispettare il tuo stile di programmazione, SourceFormatX costa 29 euro, li paghi una sola volta, non ogni anno. Io ho una licenza gratuita rilasciata dallo sviluppatore di quel programma.

Matrixbob
25-08-2007, 13:36
A parte il fatto che puoi configurare il code beautifier AStyle integrato in C::B in modo da rispettare il tuo stile di programmazione, SourceFormatX costa 29 euro, li paghi una sola volta, non ogni anno. Io ho una licenza gratuita rilasciata dallo sviluppatore di quel programma.

Annnn! Hai ragione.

Matrixbob
03-09-2007, 10:37
-Wpedantic


-Wall dovrebbe bastare


In un makefile dove dovrei metterli?
Alla fine quando compilo tutti i files oggetto insieme, oppure ad ogni voce di GCC?

[EDIT]
OK l'ho messo dappertutto.

Mi dice questo:

http://img508.imageshack.us/img508/3533/immaginexi7.gif

vizzz
03-09-2007, 10:43
In un makefile dove dovrei metterli?
Alla fine quando compilo tutti i files oggetto insieme, oppure ad ogni voce di GCC?

guardando un mio makefile, ad ogni voce.

Matrixbob
03-09-2007, 11:08
Com'è che si fa già invece per sapere quali di queste librerie hoi messo, ma non uso? :stordita:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
#include <windows.h>
#include <math.h>

Matrixbob
03-09-2007, 11:13
Ho ancora questi errori:

http://img508.imageshack.us/img508/9672/immaginern2.gif

Mi segnale questa riga praticamente:
printf("\nERRORE TIPO1: %d> %s\n", mciErr, stringa);
Dove:
MCIERROR mciErr;

[EDIT]
Ho fatto cher castarlo ad intero:
printf("\nERRORE TIPO3: %d> %s\n", (int) mciErr, stringa);
Non sapevo che altro fare.

vizzz
03-09-2007, 11:17
per gli include che non ti servono...togli e vedi se ti da errori in compilazione o linking.
stringa che tipo è?

Matrixbob
03-09-2007, 11:26
per gli include che non ti servono...togli e vedi se ti da errori in compilazione o linking.
stringa che tipo è?


char stringa[512];
memset(stringa, 0, 512);


Ho editato sopra per l'MCI.

Adesso provo a commentare gli include.

Matrixbob
03-09-2007, 11:35
Adesso l'ultimo errore è questo:

http://img444.imageshack.us/img444/5750/immagineal1.gif

La riga 363:
free_array_strings(descrizione_strptr, side_lines);

La funzione è nel header p28.h:
void free_array_string(char **array_string, int dimension);

[EDIT]
Può centrare l'ordine in cui il makefile va ad esaminare le etichette?
Qualche sorta di dipendenza?


parser: mp7.o layout.o routine.o comportamento.o andbin_multimedia.o p28.o
gcc -o parser.exe p28.o layout.o routine.o comportamento.o andbin_multimedia.o mp7.o -lwinmm -Wall

mp7.o: mp7.c P28.h
gcc -c mp7.c -Wall

layout.o: layout.c p28.h
gcc -c layout.c -Wall

routine.o: routine.c p28.h
gcc -c routine.c -Wall

comportamento.o: comportamento.c p28.h
gcc -c comportamento.c -Wall

andbin_multimedia.o: andbin_multimedia.c P28.h
gcc -c andbin_multimedia.c -Wall

p28.o: p28.c p28.h
gcc -c p28.c -Wall

clean:
rm p28.o layout.o routine.o comportamento.o andbin_multimedia.o mp7.o

Matrixbob
03-09-2007, 11:48
per gli include che non ti servono...togli e vedi se ti da errori in compilazione o linking.

Mah è impossibile, le ho rimosse una ad una compilando ogni volta e tranne lo stdio.h delle altre non diceva nulla.

Questo è impossibile perchè le stringhe ad esempio le uso, quindi questo modo non funziona granchè. :)

Matrixbob
03-09-2007, 12:00
Mah è impossibile, le ho rimosse una ad una compilando ogni volta e tranne lo stdio.h delle altre non diceva nulla.

Questo è impossibile perchè le stringhe ad esempio le uso, quindi questo modo non funziona granchè. :)

A meno che la windows.h non si porti già lei tutto dentro come macro include. :boh:

Matrixbob
03-09-2007, 12:03
A meno che la windows.h non si porti già lei tutto dentro come macro include. :boh:

Si è sicuramente lei.