Newsgroup: it.comp.lang.c
Titolo: Composizione file Header e problemi

Ciao,
Sto tentando di suddividere il programma che sto facendo su più file,
in modo da poter controllare meglio il lavoro.
Ho un file server.c,un main.c e infine un serverhead.h.
Ho incluso in server.c e main.c il file serverhead.h con la direttiva
#include "serverhead.h";
In compilazione però ho errore nel file serverhead.h che è così
composto:
/*Big params functions*/
void killparams();
void printparams();
void populate_params(FILE *in);
/*Server Functions*/
void init_server(int re_sv_sock);
/*Actions*/
int send_public_params(int *send_sock);
Mi da errore su void populate_params(FILE *in)... Ho provato a
guardare come vengono definite le funzioni che prendono come argomento
un file sulla libreria standard, ma non ho notato differenze.
Vi ringrazio per ogni aiuto
Ciao
Pierpaolo


Quel che hai scritto e detto è giusto. L'errore dev'essere altrove.

 Quel che hai scritto e detto è giusto. L'errore dev'essere altrove.
Beh quindi l'errore può essere solo nel file server.c, no? però non
capisco dove andare a parare...


Non è che hai incluso due volte l'header?
Io comunque ormai mi aspetto di tutto. Ho scoperto
mezz'ora fa che il compilatore Borland dal quale
purtroppo sono totalmente dipendente per un
progetto, fa casino nel generare codice se una
variabile globale e una statica iniziano con la
stessa sequenza di caratteri.
Prova a cambiare nome alla dichiarazione /
definizione della funzione; non perché io stia
pensando allo stesso tipo di errore, ma perché
provocandone uno o più apposta spesso si capisce
cosa sta accadendo.
-- 
Due cannibali si trovano per cena e in
confidenza uno dice all'altro:
- Non ce la faccio piu' con mia moglie...
- almeno finisci le patate

 Non è che hai incluso due volte l'header?
No, ho ricontrollato per escluderlo. Paradossalmente ora funziona
senza segnalare errori modificando con:
void populate_params();
e chiamando nel main populate_params(in) //in è un fd.
La cosa mi disorienta ancora di più...
Pierpaolo

 un fd. La cosa mi disorienta ancora di più...
provare a dichiararla senza usare il nome di
variabile? Tipo
void  miafunzione (FILE*) ;
invece di
void miafunzione (FILE *fp) ;
Anche se lo standard lo permetterebbe, inizio a
pensare a un bug del compilatore. Dopo quello
mostruoso in cui mi sono imbattuto, ora su due piedi
mi aspetto qualsiasi cosa :D



Questo è standard. Se non sbaglio, la sequenza di iniziale di
caratteri che è garantita per il controllo di uguaglianza dei nomi
degli identificatori in C89/90 è lunga 31 (nel pre-ansi era
normalmente 8 (?)).
Ciao!

 era normalmente 8 (?)). Ciao!
!!!!!!!! Non ci posso credere :(((( Vuol dire che
solo dopo il 31^ carattere inizia a distinguere i
nomi? Perché se come credo volevi dire che dopo il
31^ carattere non li distingue più, io ci stavo ben
addentro, erano i primi 4.


On 10 Mar, 17:14, Archaeopteryx
<cor.bonukFANCULOSPAM@libero_NOMAIL_.it> wrote:

Si provato, ma nessun risultato...
Ora ho cancellato tutto e riscritto da capo client server più semplici
con solo scambio messaggi e funziona... Domani (perchè ora sto
fondendo) provo a "ripopolare" il .c del server e il .h con le
funzioni che mi servono e vedo se va... e vi faccio sapere :)
Ciao
Pierpaolo

 
Ciao,
bug del compilatore? FILE non ï¿œ un tipo. E' 
definito in 'stdio.h'. Dovresti includerlo.


Un identificatore può essere lungo quanto vuoi.
Se due identificatori iniziano con gli stessi 31 caratteri non è detto
che un compilatore conforme C89 li distingua.
Detto questo, se non è questo il tuo caso, direi che un bug del
compilatore è la spiegazione più plausibile :-)
Ciao!


Altro flash istantaneo integrativo:
ANSI: 31 caratteri per gli identificatori *iterni*, 6 per gli
*esterni* (definiti extern).
Ciao!

 Mi da errore su void populate_params(FILE *in)... 
Penso potrebbe essere utile sapere esattamente che errore ti d�. Sar� 
mica che non hai incluso stdio.h?
E.


Ok, bella boiata.
Non avevo incluso stdio.h dentro l'header pensando non fosse
necessario linkarlo, cioè che bastasse includerlo nei file
"destinazione" per poterne usufruire.

 "destinazione" per poterne usufruire.
Se devi programmare seriamente ti conviene studiarti un po' il processo 
di compilazione dell'eseguibile. L'errore lo hai ottenuto in 
compilazione, non in fase di linking. Bisogna distinguere tra libreria e 
header, anche se nel parlare comune spesso si identificano.
E.


"linkare" e "includere" non sono sinonimi (a dire il vero la prima
parola non è nemmeno italiano, ma tant'è).
Breve riassunto:
Il processo di inclusione viene effettuato dal (pre)compilatore, e
serve principalmente per avere in uno spazio di compilazione tutte le
definizioni che servono.
Il processo di linking viene effettuato dal linker, e serve per
"attaccare" varie librerie e file-oggetto in un unico
"oggettone" (solitamente una libreria o un eseguibile).
Quindi, per quanto riguarda questa cosa della stdio.h:
stdio.h è un file di inclusione della libreria standard.
stdio.h va "incluso" ovunque servano le definizioni e i prototipi in
essa contenuti.
la libreria standard va "linkata" ai tuoi file oggetto per avere
l'oggetto finale (questo processo solitamente per la libreria standrad
è del tutto trasparente -ovvero ci pensa il compilatore/linker per
te-, ma non è così per altre liberie).
Ciao!

 parola non è nemmeno italiano, ma tant'è).
Lo so,ovviamente. Intendevo dire che non pensavo di doverlo includere
anche all'interno della libreria (che a sua volta veniva inclusa nei
file "collegati" dalla libreria stessa.
Cioè pensavo, come da testo di consultazione, che la include
sostituisse la parte di inclusione all'interno del file (una specie di
copia&incolla, in sostanza) di conseguenza
mi è sembrato inutile includere anche nel'header le stesse librerie.
Quando mi avete parlato dell'inclusione di stdio.h effettivametne mi è
venuto in mente che i tipi non fossero importati come pensavo
(erroneamente).
Grazie per l'aiuto
Pierpaolo

 mi è sembrato inutile includere anche nel'header le stesse librerie.
Diciamo che a livello intuitivo ci sei. Ricordati però che la ricerca
di definizioni e prototipi è one-pass (un solo passaggio), quindi se
hai:
#include <stdio.h>
#include "miofile.h"
/* dentro miofile.h sono visibili le definizioni di stdio.h */
e
#include "miofile.h"
#include <stdio.h>
 /* dentro miofile.h NON sono visibili le definizioni di stdio.h */
Per evitare questo tipo di problemi è buona norma mettere in ogni .h
tutte le inclusioni che servono, in maniera da evitare spiacevoli
inconveniente come quello che è capitato a te ;-)
Ciao!


Ti ringrazio, ottima spiegazione.
Ora mi rimane solo da capire come fungono le socket... :D
Ciao
Pierpaolo