Scusate ho un problema con la compilazione di due moduli, praticamnete nel progetto ho due file:
main.c:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define COST_NUM_CHAR 30 //Costante utilizzata per indicare il numero massimo dei caratteri nella stringa
#define COST_ELEM_MAX 20 //Costante utilizzata per indicare il numero massimo degli elementi nel vettore
typedef char string[COST_NUM_CHAR]; //definizione di un nuovo tipo di dato chiamato "string"
typedef enum{FALSE, TRUE} BOOLEAN; /*definizione di un nuovo tipo di dato chiamato "BOOLEAN" avente due soli
valori accettati: "FALSE" (valore 0) e "TRUE" (valore 1)*/
void stampa(BOOLEAN RITORNO_ADD); //funzione per avvisare l'utente se l'inserimento dei dati è avvenuto con successo
struct StringPool acquisizione(); //funzione per far inserire all'utente i dati
struct StringPool
{ //Struttura contenente due tipi di dati:
int identifier; //"identifier":dato di tipo int
string str; //"str":dato di tipo string
};
struct StringPool sp[COST_ELEM_MAX]; //definizione del vettore globale "sp" di grandezza "COST_ELEM_MAX"
//di tipo "StringPool"
#include "stringpool.c"
int main()
{
BOOLEAN NEW_INPUT=TRUE;
BOOLEAN RITORNO_ADD; //definizione variabili
struct StringPool TEMP_DATA;
int I=0;
for(I=0;I<COST_ELEM_MAX;I++)
{
*sp[I].str='\0'; //ciclo utilizzato per inizializzare il vettore "sp" con i seguenti valori:
sp[I].identifier=-1; //il campo "identifier" viene inizializzato con il valore "-1"
} //il campo "str" viene inizializzato con la stringa vuota
for(I=0;I<COST_ELEM_MAX && NEW_INPUT==TRUE;I++)
{
do{
/*questo ciclo do-while viene eseguito per far inserire all'utente i dati.
ciclerà fino a quando i dati immessi dall'utente non saranno inseriti nel vettore (cioè se si verifica
la seguente condizione: RITORNO_ADD==FALSE) e se l'utente vorrà inserire nuovi dati
(ciè se si verifica la seguente condizione:NEW_INPUT==TRUE)*/
TEMP_DATA=acquisizione(); //viene chiamata la funzione "acquisizione" che ritorerà un dato di tipo
//StringPool che verrà salvato nella variabile "TEMP_DATA"
//QUI SI CHIAMA LA FUNZIONE ADD CHE RITORNA UN VALORE BOOLEAN ALLA VARIABILE RITORNO_ADD E SI INVIA
//COME PARAMETRO LA VARIABILE TEMP_DATA
add(TEMP_DATA.identifier,TEMP_DATA.str);//Richiamo la funzione add della libreria stringpool.c
stampa(RITORNO_ADD); //viene chiamata la funzione "stampa" che manderà a schermo un diverso
//messaggio in base all'esito dell'inserimento
printf("\n Si vuole inserire un nuovo dato? (0=NO, 1=SI)");
do{
scanf("%d",&NEW_INPUT); //ciclo che chiede all'utente se si vuole
}while(NEW_INPUT<0 || NEW_INPUT>1); //inserire un nuovo dato.Il ciclo verrà
//eseguito fino a quando non si inserirà
// o 1 o 0
}while((NEW_INPUT==TRUE) && (RITORNO_ADD==FALSE));
}
system("pause");
}
struct StringPool acquisizione()
{
struct StringPool TEMP_DATA;
do{
printf("\nInserire l'ID"); //ciclo per l'inserimento dell'ID.Ciclerà
scanf("%d",&TEMP_DATA.identifier); //fino a quando non verrà immesso un numero positivo
}while(TEMP_DATA.identifier<0);
do{
printf("\nInserire la stringa"); //ciclo per l'inserimento della stringa.Ciclerà
scanf("%s",TEMP_DATA.str); //fino a quando non verrà immessa una stringa
}while(*TEMP_DATA.str=='\0'); //diversa dalla stringa vuota
return(TEMP_DATA);
}
void stampa(BOOLEAN RITORNO_ADD)
{
if(RITORNO_ADD==1)
printf("\nL'inserimento dei dati è avvenuto con successo");
else
printf("\nErrore: inserimento non avvenuto");
/*in base all'avvenuto inserimento dei dati nel vettore, verrà stampato a video un messaggio diverso*/
system("pause");
}
ed una libreria chiamata stringpool.c:
codice:
BOOLEAN add (int identifier, string str);
BOOLEAN add (int identifier, string str)
{
int spazio_vettore = -1; //Indice di controllo presenza spazio libero
int i; //Indice per il ciclo for di scansione
/*Se identifier hanno dati non corretti ritorna false*/
if((identifier < 1) || (strcmp(str,"") != 0))
{
return 0;
}
/*Controlla da 0 a minore del numero massimo di elementi
che l'identifier non è dupplicato e che ci sia almeno uno spazio vuoto
per l'inserimento*/
for(i=0;i<COST_ELEM_MAX;i++)
{
//se l'indice è dupplicato ritorna false
if(identifier == sp[i].identifier)
{
return 0;
}
//in caso di presenza di spazio vuoto, segna la prima posizione libera
if(sp[i].identifier == -1)
{
spazio_vettore = i;
}
}
//se tutto è andato a buon fine alloca i dati nella struttura
if(spazio_vettore > -1)
{
sp[spazio_vettore].identifier = identifier;
return 1;
}
else
{
return 0;
}
}
E nel main sono dichiarate delle variabili globali che poi utilizzerà anche la libreria. Alla compilazione però il compilatore dice nella libreria che le variabili non sono state dichiarate e da errore. Come posso risolvere?