PDA

Visualizza la versione completa : [C] Includere header file in un progetto (ERA:Errori...AIUTO!!!)


aLeX-P
12-07-2005, 19:54
Ciao a tutti...

Mio fratello deve consegnare per Lunedì 18 una tesina (cioè un'applicazione) in C...
Il programma è strutturato in:

- main.c;
- func.c (descrizione delle funzioni);
- func.h (dichiarazione delle funzioni utilizzate in func.c);
- type.h (come da consiglio di cagnu...).

Però il compilatore mi da ancora degli errori...

Questo è il codice del "type.h":



struct {
char nome[30];
char cognome[30];
char affittato[50]; // variabile contente il titolo del film noleggiato
int riconsegnato: 1; /* variabile di controllo per la restituzione del film
valore 1 = non noleggiato , valore 0 = noleggiato */
int telefono;
} cliente[100]; // nome del vettore di struttura

struct {
char titolo[50];
char genere[30];
int disponibile: 1; /* variabile di controllo della disponibilità del film
valore 1 = disponibile , valore 0 = non disponibile */
} film[100]; // nome del vettore di struttura


Questo è il codice del "func.h":



void SezioneClienti(); // funzione di scelta dell'operazione per cliente

void NuovoCliente();

void ModificaCliente();

void RicercaCliente();

void MostraClienti();

void SezioneFilms(); // funzione di scelta dell'operazione per film

void NuovoFilm();

void ModificaFilm();

void RicercaFilm();

void MostraFilms();

void SezioneNoleggio(); // funzione di scelta dell'operazione per noleggio/restituzione

void NoleggiaFilm();

void RestituisciFilm();


Questo è il codice del "main.c":



#include <stdio.h> // inclusione degli direttive (.h)
#include "func.h"
#include "type.h"
#include "func.c" // inclusione dei files (.c)


main() {

int scelta;

do {
printf("BENVENUTI NEL PROGRAMMA GESTIONALE VIDEOTECA\n"); // stampa su video del menù principale
printf("Confermare una delle operazioni disponibili di seguito.\n\n"); // di scelta delle operazioni
printf("1) Entra nella sezione relativa alla clientela.\n");
printf("2) Entra nella sezione relativa all'archivio dei films.\n");
printf("3) Entra nella sezione relativa al noleggio dei films.\n");
printf("4) Chiudi il programma gestionale.\n");

do { // inserimento della scelta con controllo
scanf("%d", &scelta); // del tasto premuto
} while(scelta == 1 || scelta == 2 || scelta == 3 || scelta == 4);

switch(scelta) { // valutazione dell'espressione e confronto
case 1: // dei i valori nei vari case
{
SezioneClienti(); // chiamata alla funzione
break; // break di uscita dello switch
}

case 2:
{
SezioneFilms();
break;
}

case 3:
{
SezioneNoleggio();
break;
}

case 4:
{
break;
}
}
} while(scelta == 4); // controllo della scelta di chiusura
}

aLeX-P
12-07-2005, 20:17
"func.c"



#include "type.h"

void NuovoCliente(){

int i,n;
char scelta;

for(i=n;i<100;i++){

printf("NOME:");
gets(cliente[i].nome );
printf("COGNOME:");
gets(cliente[i].cognome );
printf("TELEFONO:");
scanf("%d", cliente[i].telefono);
printf("Ancora?");
do{
scanf("%c", &scelta);
}while(scelta == 's' || scelta == 'n');

if(scelta=='n') break;

n++;
}
return;
}

void ModificaCliente(){

int i;
char scelta,cognome[30];

do{
printf("COGNOME:");
gets(cognome);
for(i=0;i<100;i++) {

if(cognome == cliente[i].cognome) {

printf("Profilo: ");
printf("%s, %s - %d\n\n", cliente[i].cognome, cliente[i].nome, cliente[i].telefono);

printf("NOME: ");
gets(cliente[i].nome );
printf("COGNOME: ");
gets(cliente[i].cognome );
printf("TELEFONO: ");
scanf("%d", cliente[i].telefono);

printf("Profilo : ");
printf("%s, %s - %d\n\n", cliente[i].cognome, cliente[i].nome, cliente[i].telefono);
} else {
printf("Non e' registrato nessun cliente con questo cognome.");
}
}

printf("Ancora (S/N) ? ");
do {
scanf("%c", &scelta);
} while(scelta == 's' || scelta == 'n');

} while(scelta == 'n');

return;
}


void NuovoFilm() {

int i,n;
char scelta;

for(i=n;i<100;i++) {

printf("TITOLO: ");
gets(film[i].titolo);
printf("GENERE: ");
gets(film[i].genere);
printf("Ancora (S/N) ? ");
do {
scanf("%c", &scelta);
} while(scelta == 's' || scelta == 'n');

if(scelta == 'n') break;

n++;
}

return;
}


void ModificaFilm() {

int i;
char scelta,titolo[50];

do {
printf("TITOLO: ");
gets(titolo);

for(i=0;i<100;i++) {

if(titolo == film[i].titolo) {

printf("Il film e': ");
printf("%s - %s.\n", film[i].titolo, film[i].genere);

printf(" TITOLO: ");
gets(film[i].titolo);
printf("GENERE: ");
gets(film[i].genere);

printf("Film: ");
printf("%s - %s.\n", film[i].titolo, film[i].genere);
} else {
printf("Non e' memorizzato nessun film con questo titolo.");
}
}

printf("Ancora (S/N) ? ");
do {
scanf("%c", &scelta);
} while(scelta == 's' || scelta=='n');

} while(scelta == 'n');

return;
}


void RicercaFilm() {

int i,j;
char scelta,titolo[50];

do {
printf("TITOLO : ");
gets(titolo);

for(i=0;i<100;i++) {

if(titolo == film[i].titolo) {

printf("Il film e': ");
printf("%s - %s. ", film[i].titolo, film[i].genere);
if(film[i].disponibile==1) {

printf("Il film e' disponibile.\n\n");
} else {
printf("Il film non e' disponibile.\n\n");
for(j=0;j<100;j++) {
if(film[i].titolo == cliente[j].affittato) break;
}
printf("E' noleggiato da: %s, %s.\n", cliente[j].cognome, cliente[j].nome);
}
} else {
printf("Non e' memorizzato nessun film con questo titolo.");
}
}

printf("Ancora (S/N) ? ");

do {
scanf("%c", &scelta);
} while(scelta == 's' || scelta=='n');

} while(scelta == 'n');

return;
}


void PrelevaFilm() {

int i,j;
char scelta,cognome[30],titolo[50];

do {
printf("COGNOME: ");
gets(cognome);
printf("TITOLO: ");
gets(titolo);

for(i=0;i<100;i++) {

if(cognome == cliente[i].cognome) {

for(j=0;j<100;j++) {

if(titolo == film[j].titolo) {

break;
} else {
printf("Non e' memorizzato nessun film con questo titolo.\n");
}
}
break;
} else {
printf("Non e' registrato nessun cliente con questo cognome.\n");
}
}

if(cognome == cliente[i].cognome && titolo == film[j].titolo) {

if(cliente[i].riconsegnato == 1 && film[j].disponibile == 1) {

film[j].disponibile = 0;
cliente[i].riconsegnato = 0;
strcopy(film[j].titolo,cliente[i].affittato);
printf("OK.");
} else {

if(cliente[i].riconsegnato == 0) {

printf("Noleggiare un film.\n");
}
if(film[j].disponibile == 0) {

printf("Il film e' noleggiato.\n");
}
}
}

printf("Ancora (S/N) ? ");
do {
scanf("%c", &scelta);
} while(scelta == 's' || scelta == 'n');

} while(scelta == 'n');

return;
}


void RestituisciFilm() {

int i,j;
char scelta,cognome[30],titolo[50],app[50];

do {
printf("COGNOME: ");
gets(cognome);
printf("TITOLO: ");
gets(titolo);

for(i=0;i<100;i++) {

if(cognome == cliente[i].cognome) {

for(j=0;j<100;j++) {

if(titolo == film[j].titolo) {

break;
} else {
printf("Non e' memorizzato nessun film con questo titolo.\n");
}
}
break;
} else {
printf("Non e' registrato nessun cliente con questo cognome.\n");
}
}

if(cognome == cliente[i].cognome && titolo == film[j].titolo) {

if(cliente[i].riconsegnato == 0 && film[j].disponibile == 0) {

film[j].disponibile = 1;
cliente[i].riconsegnato = 1;
strcopy(app,cliente[i].affittato);
printf("OK.");
} else {

if(cliente[i].riconsegnato == 1) {

printf("Il cliente non ha noleggiato .\n");
}
if(film[j].disponibile == 1) {

printf("Il film non e' noleggiato.\n");
}
}
}

printf("Ancora (S/N) ? ");
do {
scanf("%c", &scelta);
} while(scelta == 's' || scelta == 'n');

} while(scelta == 'n');

return;
}


void RicercaCliente(){

int i;
char scelta,cognome[30];

do {
printf("COGNOME : ");
gets(cognome);

for(i=0;i<100;i++) {

if(cognome == cliente[i].cognome) {

printf("Profilo: ");
printf("%s, %s - %d.\n", cliente[i].cognome, cliente[i].nome, cliente[i].telefono);

if(cliente[i].riconsegnato == 0) {

printf("Film noleggiato: %s.\n", cliente[i].affittato);
}

} else {
printf("Non e' registrato nessun cliente con questo cognome.");
}
}

printf("Ancora (S/N) ? ");

do {
scanf("%c", &scelta);
} while(scelta == 's' || scelta=='n');

} while(scelta == 'n');

return;
}


void MostraFilms() {

int i;

printf("Lista f: \n\n");

for(i=0;i<100;i++) {

if(film[i].disponibile == 0) {
printf("%s, %s - NOLEGGIATO", film[i].titolo, film[i].genere);
} else {
printf("%s, %s - DISPONIBILE", film[i].titolo, film[i].genere);
}
if(film[i].titolo == NULL) break;
}
return;
}


void MostraClienti() {

int i;

printf("Lista c: \n\n");

for(i=0;i<100;i++) {

if(cliente[i].riconsegnato == 1) {
printf("%s, %s - FILM NOLEGGIATO: -\n", cliente[i].cognome, cliente[i].nome);
} else {
printf("%s, %s - FILM NOLEGGIATO: %s\n", cliente[i].cognome, cliente[i].nome, cliente[i].affittato);
}
if(cliente[i].nome == NULL) break;
}
return;
}


void SezioneNoleggio() {

int scelta;

printf("1) Noleggia f.\n");
printf("2) Restituisci f.\n");

do {
scanf("%d", &scelta);
} while(scelta == 1 || scelta == 2 || scelta == 3);

switch(scelta) {

case 1:
{
NoleggiaFilm();
break;
}

case 2:
{
RestituisciFilm();
break;
}
}
return;
}


void SezioneClienti() {

int scelta;

printf("1) Aggiungi c.\n");
printf("2) Modifica c.\n");
printf("3) Ricerca c.\n");
printf("4) Mostra c.\n");

do {
scanf("%d", &scelta);

} while(scelta == 1 || scelta == 2 || scelta == 3 || scelta == 4);

switch(scelta) {

case 1:
{
NuovoCliente();
break;
}

case 2:
{
ModificaCliente();
break;
}

case 3:
{
RicercaCliente();
break;
}
case 4:
{
MostraClienti();
break;
}
}
return;
}


void SezioneFilms() {

int scelta;

printf("1) Aggiungi f.\n");
printf("2) Modifica f.\n");
printf("3) Ricerca f.\n");
printf("4) Mostra f.\n");

do {
scanf("%d", &scelta);

} while(scelta == 1 || scelta == 2 || scelta == 3 || scelta == 4);

switch(scelta){

case 1:

{
NuovoFilm();
break;
}

case 2:
{
ModificaFilm();
break;
}

case 3:
{
RicercaFilm();
break;
}

case 4:
{
MostraFilms();
break;
}
}
return;
}


Questi gli errori:

http://img305.imageshack.us/img305/1976/err8ny.gif

Spero che qualcuno possa aiutarmi...

Ciao

infinitejustice
12-07-2005, 20:26
#ifndef
#define

...

#endif

no eh? ;)

DydBoy
12-07-2005, 20:28
C'è un problema di doppia inclusione e conseguente ridichiarazione delle strutture dati.

Ti consiglio di includere nel tuo file di main solo il "func.h" e il "type.h".

Nel file "func.h" e "type.h" utilizza la primititiva (all'inizio del file)


#ifndef FUNC_H
#define FUNC_H
...codice...
#endif

per il func.h e


#ifndef TYPE_H
#define TYPE_H
...codice...
#endif

per il type.h

Con questa direttiva al preprocessore eviti le doppie inclusioni.

Considera che il file "func.c" deve essere compreso nel tuo progetto di lavoro in modo che ti basti fare l'include , nel main, dell'header.

E' sbagliato includere sia il ".h" che il ".c" dello stesso file.

Spero di averti aiutato se così nn fosse resto a disposizione.

Ciao

:ciauz:

DydBoy
12-07-2005, 20:29
infinitejustice abbiamo postato contemporaneamente :unz:

infinitejustice
12-07-2005, 20:57
no io prima :madai!?: :unz:

aLeX-P
12-07-2005, 22:34
Gli errori di sintassi li ho risolti, ora però ci sono quelli logici...

Praticamente non funziona quasi niente...

Se qualk1 è disponibile posso linkare i sorgenti e mi date una mano...

Ah, un'altra cosa:

praticamente deve confrontare una campo con il "vuoto"...
non so se mi sono spiegato ma devo fare una cosa del genere:

if(cliente[i].nome == ' ');

però non credo si possa fare proprio così...

Ditemi voi.

Ciao e grazie per la prontezza delle risposte!

DydBoy
12-07-2005, 22:45
I confronti tra stringhe si fanno con la "strcmp" compresa in <string.h>

Ad esempio :

strcmp(cliente[i].nome," ");

restituisce 0 se cliente[i].nome è uno spazio vuoto.(attenzione uno SPAZIO VUOTO non NULL).

restituisce 1 altrimenti (le stringhe sono diverse).

Ciau :ciauz:

Johnny_Depp
12-07-2005, 23:11
come da regolamento: titoli più specifici, please

aLeX-P
12-07-2005, 23:57
Non era quello il problema cmq ho risolto in altro modo... aggiungendo una variabile di controllo...

Cmq rimane il problema che non funziona molto il programma...

Se ti invio il file gli puoi dare un'occhiata???

Cmq grazie x le risposte...

@Johnny_Deep: l'errorre non era solo quello (e cmq non potevo saperlo visto che sono riuscito solo ora a risolverlo. Non posso mica scrivere tutti gli errori nel titolo...).

D'ora in avanti farò + attenzione... :stordita:

Loading