Ciao, il tuo programma è molto disordinato quindi coordinare tutto, in quella maniera, è difficile e controproduttivo. Io ti consiglio di evitare la definizione di variabili globali (mi riferisco ad sp).
Inoltre il tipo booleano esiste, in stdbool.h.
Ho semplicemente spostato le parti del tuo programma nei diversi file. Un modo può essere questo:
File global.h - ci metti tutto quello che deve essere visibile globalmente
Codice PHP:
#ifndef GLOBAL_H
#define GLOBAL_H
#define COST_NUM_CHAR 30
#define COST_ELEM_MAX 20
#define COST_NUM_CHAR 30
#define COST_ELEM_MAX 20
typedef char string[COST_NUM_CHAR]; //definizione di un nuovo tipo di dato chiamato "string"
struct StringPool sp[COST_ELEM_MAX]; //definizione del vettore globale "sp" di grandezza "COST_ELEM_MAX" di tipo "StringPool"
#endif
File stringpool.h
Codice PHP:
#ifndef STRINGPOOL_H
#define STRINGPOOL_H
#include <stdbool.h>
#include "global.h"
struct StringPool
{
int identifier;
string str;
};
bool add (int identifier, string str);
#endif
File stringpool.c
Codice PHP:
#include "stringpool.h"
bool 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;
}
}
File main.c
Codice PHP:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <stdbool.h>
#include "global.h"
#include "stringpool.h"
void stampa(bool 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
int main()
{
bool NEW_INPUT=true;
bool 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 bool 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(bool 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");
}
Compila il tutto con:
codice:
>> gcc stringpool.c -c
>> gcc main.c -c
>> gcc main.o stringpool.o -o main