Scusate ho un problema con la compilazione di due moduli, praticamnete nel progetto ho due file:
main.c:
ed una libreria chiamata stringpool.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"); }
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?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; } }


Rispondi quotando