Newsgroup: it.comp.lang.c
Titolo: Programmi scritti su più file.

Ciao.
Ho scritto, in C, un semplice programma, distribuito su quattro file (un 
.h e tre .c), salvati nella stessa directory.
Il programma viene compilato senza problemi, ma, in fase di esecuzione, 
ottengo un errore a cui non so come porre rimedio.
1 - Dove sbaglio secondo voi?
2 - Potete provare a compilarlo ed eseguirlo voi, per vedere se sulle 
vostre macchine gira? 
Non vorrei che il problema dipendesse dal fatto che sto tentando di 
scrivere programmi in C utilizzando un compilatore per il C++, per la 
precisione Borland C++ builder 5.5.
Vi posto di seguito il codice dei vari file ed il messaggio di errore 
che ottengo dopo aver pigiato f9 per eseguire il programma, non prima di 
avervi ringraziato per le risposte ai messaggi precedenti e per essere 
arrivati a leggere fino a qui.
Bizio.
***Nel file pgm.h: ***
/*File di intestazione per pgm.*/
#include <stdio.h>
#include <stdlib.h>
#define N 3
void fct1(int k);
void fct2(void);
void wrt_info(char *);
***Nel file main.c*** 
/*File contenente la funzione main del programma pgm.*/
#include "pgm.h"
int main(void)
{
 char ans;
 int i, n = N;
 printf("%s", "Questo programma non fa un gran che.\n",
 "Vuoi saperne di più? ");
 scanf("%c", &ans);
 if (ans == 'y' || ans == 'Y')
  wrt_info("pgm");
 for (i = 0; i < n; ++i)
  fct1(i);
 printf("Ciao!\n");
 return 0;
}
 
***Nel file fct.c***
/*File fct del programma pgm.*/
#include "pgm.h"
void fct1(int n)
{
 int i;
 printf("Ciao da fact1!\n");
 for (i = 0; i < n; ++i)
  fact2();
} /*Fine funzione.*/
void fct2(void)
{
 printf("Ciao da fact2!\n");
} 
***Nel file wrt.c***
/*File wrt.c per il programma pgm.*/
#include "pgm.h"
void wrt_info(char *pgm_name)
{
 printf("Utilizzo: %s\n\n", pgm_name);
 printf("%s", "Questo programma illustra come si possa scrivere un 
programma\n"
 "in più di un file. In questo esempio abbiamo \n"
 "un unico file .h che viene incluso all'inizio dei nostri \n"
 "file .c. In questo modo, il file .h agisce da collante \n"
 "che tiene unito il programma.\n\n"
 "Si noti che le funzioni fact1 e fact2, quando vengono chiamate, "
 "dicono solo \"ciao\". Quando si scrive un programma serio, \n"
 "il programmatore, ogni tanto, fa queste cose in una prima versione 
funzionante\n"
 "del codice.\n");
}
Ora vi racconto come creo e compilo questi file con Borland C++ builder 
5.5.
1 - Creo un nuovo header file (pgm.h) e lo edito. Non ho la possibilità 
di compilarlo separatamente dagli altri, o almeno non so come fare. 
Pertanto lo salvo e lo chiudo.
2 - Creo un nuovo file main.c e lo edito, quindi lo salvo e lo chiudo. 
Faccio la stessa cosa con i file fct.c e wrt.c. 
3 - Apro il file main.c e rispondo di sì alla domanda se voglio creare 
un progetto così che questo programma possa essere compilato ed 
eseguito.
4 - Con alt+f9 compilo il programma (non so se la compilazione riguardi 
solo questo file o anche gli altri tre). La compilazione avviene 
correttamente.
5 - Con il tasto f9 tento di eseguire il programma, ed ottengo il 
seguente messaggio di errore:
[Linker Error] Unresolved external '_wrt_info' referenced from C:
\PROGRAMMI\BORLAND\CBUILDER5\PROJECTS\PGM2\MAIN.OBJ
[Linker Error] Unresolved external '_fct1' referenced from C:\PROGRAMMI
\BORLAND\CBUILDER5\PROJECTS\PGM2\MAIN.OBJ
Fine dello sproloquio. 
Sono nelle vostre mani!:-)

 \BORLAND\CBUILDER5\PROJECTS\PGM2\MAIN.OBJ
Questi sono gli errori del linker.
Il compilatore dovrebbe dartene altri che indicano il perche' non sono 
stati creati i file obj che il linker non trova.
Ciao
G.

 Sono nelle vostre mani!:-)
spero di esserti stato d'aiuto
nota bene: il file .h non agisce da collante e' il linker, che va 
opportunamente istruito, che provvede ad unire insieme i tre sorgenti, 
il file .h serve solo a condividere le definizioni ( di tipi, variabili 
... ) tra i vari file .c .
nulla ti impedirebbe di lavorare di copia ed incolla dentro l'editor e 
di sincronizzare a mano le eventuali modifiche del contenuto del .h

 Non mi pare scritta in modo corretto questa printf().
perche'?
Ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 Pertanto lo salvo e lo chiudo.
Ciao :)


Ciao a tutti.
Volevo ringraziare tutti voi per l'aiuto che mi avete dato.
Come al solito, la soluzione al problema era più facile di quanto 
pensassi.
Bastava aggiungere correttamente i file al progetto.
Grazie davvero a tutti.
Bizio.