Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
compilando con lo standard C89 se non sbaglio non rispettando gli struct ******* il compilatore da errore (è una cosa che arriva dall'ANSI C se non sbaglio e termina con il C99).
L'ho anche provato proprio adesso ed infatti mi urla contro.
Blizzard ha scritto:
compilando con lo standard C89 se non sbaglio non rispettando gli struct ******* il compilatore da errore (è una cosa che arriva dall'ANSI C se non sbaglio e termina con il C99).
L'ho anche provato proprio adesso ed infatti mi urla contro.
perchè compili con quello statndard?! è richiesto da posix?!
con il seguente codice:
#include "stdio.h"
typedef struct _pippo {
int pluto;
int topolino;
} pippo;
void initPippo(struct pippo *aStruct){
aStruct->pluto=0;
aStruct->topolino=0;
}
int main (){
pippo myPippo;
initPippo(&myPippo);
fprinft(stdout,"tu c'ha le pupp'a pera!\n");
return 0;
}
il gcc della slack di incacchia parecchio e restituisce:
bash-3.1$ gcc -c eliminami.c -o fernando eliminami.c:8: warning: 'struct pippo' declared inside parameter list
eliminami.c:8: warning: its scope is only this definition or declaration, which is probably not what you want
eliminami.c: In function 'initPippo':
eliminami.c:9: error: dereferencing pointer to incomplete type
eliminami.c:10: error: dereferencing pointer to incomplete type
eliminami.c: In function 'main':
eliminami.c:16: warning: passing argument 1 of 'initPippo' from incompatible pointer type
mentre se rimuovo lo struct, correggento la funzione con:
se non è per motivi di standard posix, allora sto andando off-topic (non c'entra più con l'implementazione di una shell posix) quindi rispondi pure in PM.
tu dichiari la struttura struct _pippo. Il tipo è *struct _pippo*.
Poi con la typedef crei il tipo *pippo* che altro non è che un alias del tipo *struct _pippo*.
E' normale che ti dia errore perchè il tipo *struct pippo* non è mai stato definito e ti da quell'errore perchè il parser si incasina.
Conviene usare sempre la stessa convenzione: o si usa la struct (ripetendo ogni volta struct _pippo) oppure si usano delle typedef e ci si riferisce sempre a quelle (pippo). Usare la typedef insieme alla dichiarazione della struct fa figo, ma può essere causa di confusione
Così dichiaro una struttura utilizzabile direttamente con pippo.
Tuttavia questa volta per scelta ho deciso di utilizzare il costrutto ANSI.
Voglio che sia compilabile anche su macchine non recentissime.... avevo quasi deciso di sviluppare sotto ANSI ma è esagerato a volte :P ( ad esempio non puoi utilizzare i // ma solo i /**/ )
gioco ha scritto:
tu dichiari la struttura struct _pippo. Il tipo è *struct _pippo*.
Poi con la typedef crei il tipo *pippo* che altro non è che un alias del tipo *struct _pippo*.
E' normale che ti dia errore perchè il tipo *struct pippo* non è mai stato definito e ti da quell'errore perchè il parser si incasina.
Conviene usare sempre la stessa convenzione: o si usa la struct (ripetendo ogni volta struct _pippo) oppure si usano delle typedef e ci si riferisce sempre a quelle (pippo). Usare la typedef insieme alla dichiarazione della struct fa figo, ma può essere causa di confusione
ma porc... scusate: sono talmente abituato ad usare gli alias che manco mi ero accorto che il codice di Blizzard non li conteneva! chiarito il dubbio! chiedo scusa per il macello.
imho senza typedef si diventa scemi alla fine... però ognuno ha il suo stile (a me hanno "inclucato" i typedef per definire la strutture già dalla prima volta che ho visto il c in vita mia e ormai è un riflesso incondizionato )
ma porc... scusate: sono talmente abituato ad usare gli alias che manco mi ero accorto che il codice di Blizzard non li conteneva! chiarito il dubbio! chiedo scusa per il macello.
Traquillo!
imho senza typedef si diventa scemi alla fine... però ognuno ha il suo stile
hehehe.... io gli alias li uso eccome. Tuttavia questo progetto l'ho impostato così e a dire la verità la leggibilità non è minacciata più di tanto... anzi comincio a trovarmici bene.
sinceramente l'ho utilizzata perchè penso che comunque la free utilizzi un sistema analogo
void free(void* ptr)
{
if(!ptr) return;
....
....
}
oppure il contrario... è il modo più logico che mi è venuto in mente.
Se è così risparmio comunque parecchie manovre di stack e branch perchè effettuo lo stesso controllo evitando di effettuare una call di funzione... credo sia una buona cosa in fin dei conti. MA POSSO SBAGLIARMI
Blizzard ha scritto:piuttosto non mi hai fatto notare la dimenticanza più grave che potrebbe causare dei crash a dir poco spettacolari.
MI SONO "IMBECILLEMENTE" DIMENTICATO DI SETTARE A "NULL" TUTTI QUEI PUNTATORI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Se allo stato attuale della funzione la richiamo un'altra volta non voglio neanche immaginare cosa va a deallocarmi!
il reset dei puntatori, insieme ai memory leaks è uno degli errori più frequenti. è una soluzione bruttissima ma ho visto più di un codice con cose del tipo:
mmm ... effettivamente per quanto brutta sarebbe una soluzione da tenere in considerazione (non per altro mi dici che è abbastanza usata).
comunque per il momento cerco di procedere a mano... spero di non pentirmene con l'aumentare del codice (non ho mai negato di essere un tipo distratto :P).
ho implementato si può dire una parte del sistema che si occupa di gestire, parsare ed eseguire i comandi builtin della shell permettendo semplice manutenzione ed estensione.
Detto questo lo scopo del post riguarda il rilascio del codice.
Prima di una release volevo caricare volta per volta i sorgenti su un CVS o SVN... tuttavia utilizzo CrossVC sul CVS del progetto su sourceforge ma non ci ho capito una ceppa.
Difatti ho caricato con immani sforzi il sorgente della 0.1 dopodichè non sono riuscito ad aggiornare i file.
Mi chiedevo se conoscevate qualche servizio di CVS o SVN che potevo usare in tutta tranquillità e magari un client for dummies :P
Come client puoi usare cervisia (CVS) o ksvn (SVN) entrambi per kde.
Di guide su CVS ce ne sono moltissime in rete a partire da cederqvist (approfondito) fino a guide passo passo come quella che c'è qui su slacky.eu: