Newsgroup: it.comp.lang.c
Titolo: header

Salve a tutti, ho un grosso immenso problema da risolvere entro 2 gg!
Ho un progetto universitario da consegnare ora durante la compilazione
del sorgente...il compilatore mi dice che nella linea 15 nn riesce a
trovare la definizione di header qualcuno potrebbe gentilmente darmi
una mano nel spulciare il mio codice? Grazie infinite anticipatamente e
scusate.
#include "LPC_M1_Include.h"
#include "LPC_Include.h"
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
//Funzione per la creazione di un database
int CreateDatabaseFile(char *Name, int NumFields, FIELD_DATA_t
*FieldData){
    int i;
    char *finale;
    header *h;            // l'errore in pratica stà qui! :( e nn
ricordo dove ho definito l'header
    Name=(char *)malloc(sizeof(char)*DBF_NAME_LENGTH);
    h=(header
*)malloc(sizeof(header)*(DBF_FIXED_HEADER_LEN+MAX_NUM_FIELDS*(DBF_FIELD_LEN+MAX_NUM_FIELDS)+2));
    FieldData=(FIELD_DATA_t
*)malloc(sizeof(FIELD_DATA_t)*MAX_NUM_FIELDS);
    if((Name==NULL) || (cercaErr(Name)==1)){
       char Err1[256];
       (void) sprintf(Err1, "Nome DB nullo o non valido o
NumFields<=0");
       LPC_GestioneErrore(LPC_BAD_ARG, "CreateDatabaseFile", Err1);
       if(h!=NULL)
          free(h);
       if(FieldData!=NULL)
          free(FieldData);
       return LPC_BAD_ARG;
    }
    if((NumFields<=0) || (NumFields>MAX_NUM_FIELDS)){
       char Err10[256];
       (void) sprintf(Err10, "Nome DB nullo o non valido o
NumFields<=0");
       LPC_GestioneErrore(LPC_BAD_ARG, "CreateDatabaseFile", Err10);
       if(Name!=NULL)
          free(Name);
       if(h!=NULL)
          free(h);
       if(FieldData!=NULL)
          free(FieldData);
       return LPC_BAD_ARG;
    }
    if(FieldData==NULL){
       char Err4[256];
       (void) sprintf(Err4, "Errore allocazione memoria");
       LPC_GestioneErrore(LPC_NO_MEMORY, "CreateDatabaseFile", Err4);
       if(Name!=NULL)
          free(Name);
       if(h!=NULL)
          free(h);
       return LPC_NO_MEMORY;
    }
    h->NumCampi=(uint16_t) htons(h->NumCampi);
    h->NumCampi=NumFields;
    h->NumRecords=(uint32_t) htonl(h->NumRecords);
    h->NumRecords=0;
    h->dimHeader=(uint16_t) htons(h->dimHeader);
h->dimHeader=DBF_FIXED_HEADER_LEN+NumFields*(DBF_FIELD_LEN+NumFields)+2;
    h->dimRecord=(uint16_t) htons(h->dimRecord);
    h->dimRecord=0;
    h->timestamp=(uint32_t) htonl(h->timestamp);
    h->timestamp=time(NULL);
    for(i=0; i<NumFields; ++i){
       if(cercaErr(FieldData->Name)==1){
          char Err5[256];
          (void) sprintf(Err5, "Valore di uno dei campi non valido:
nome, tipo o lunghezza");
          LPC_GestioneErrore(LPC_BAD_FIELD, "CreateDatabaseFile",
Err5);
          return LPC_BAD_FIELD;
       }
       if(StringaUguale(FieldData->Name,h,i)==1){
          char Err8[256];
          (void) sprintf(Err8, "Valore di uno dei campi non valido:
nome, tipo o lunghezza");
          LPC_GestioneErrore(LPC_BAD_FIELD, "CreateDatabaseFile",
Err8);
          return LPC_BAD_FIELD;
       }
       strcpy(h->campo[i].name,FieldData->Name);
       if ((FieldData->FieldType!=CHARACTER) ||
(FieldData->FieldType!=NUMERIC) || (FieldData->FieldType!=DATE) ||
(FieldData->FieldType!=LOGICAL)){
          char Err6[256];
          (void) sprintf(Err6, "Valore di uno dei campi non valido:
nome, tipo o lunghezza");
          LPC_GestioneErrore(LPC_BAD_FIELD, "CreateDatabaseFile",
Err6);
          return LPC_BAD_FIELD;
	}
       h->campo[i].fieldtype=(uint16_t) htons(h->campo[i].fieldtype);
       h->campo[i].fieldtype=FieldData->FieldType;
       h->campo[i].fieldlen=(uint16_t) htons(h->campo[i].fieldlen);
       if((h->campo[i].fieldtype!=CHARACTER) ||
(h->campo[i].fieldtype!=NUMERIC) || (h->campo[i].fieldtype!=DATE) ||
(h->campo[i].fieldtype!=LOGICAL)){
          char Err7[256];
             (void) sprintf(Err7, "Valore di uno dei campi non valido:
nome, tipo o lunghezza");
             LPC_GestioneErrore(LPC_BAD_FIELD, "CreateDatabaseFile",
Err7);
             return LPC_BAD_FIELD;
       }
       if((h->campo[i].fieldtype==CHARACTER) &&
((FieldData->FieldLen>=1) && (FieldData->FieldLen<=FIELD_CHAR_LEN)))
           h->campo[i].fieldlen=FieldData->FieldLen;
       if((h->campo[i].fieldtype==NUMERIC) &&
(FieldData->FieldLen<=FIELD_NUM_LEN))
           h->campo[i].fieldlen=FieldData->FieldLen;
       if((h->campo[i].fieldtype==DATE) &&
(FieldData->FieldLen<=FIELD_DATE_LEN))
           h->campo[i].fieldlen=FieldData->FieldLen;
       if((h->campo[i].fieldtype==LOGICAL) &&
(FieldData->FieldLen<=FIELD_LOGI_LEN))
           h->campo[i].fieldlen=FieldData->FieldLen;
     }
   int ret=fwrite(h,sizeof(h),(size_t) h->dimHeader,fp);
   if(ret!=h->dimHeader){
      char Err9[256];
             (void) sprintf(Err9, "Errore di scrittura su file");
             LPC_GestioneErrore(LPC_ERR_WRITE, "CreateDatabaseFile",
Err9);
             return LPC_ERR_WRITE;
       }
   rename(Name,finale);
   fclose(fp);
   free(fp);
   free(FieldData);
   free(h);
   free(Name);
   return LPC_OK;
   putchar('\n');
}

 scusate.
Scusa ma quale e' il senso di postare tutto il codice dopo la linea 15,
visto che il problema e' che il compilatore non trova la definizione per
header ?
Chiaramente nel codice che hai mandato non puo' esserci la definizione,
deve essere in qualche file che non hai incluso. E non e' certo "spulciando"
quello che hai scritto che si puo' trovare la definizione, bisogna
che "spulci" i files che hai scritto e che stanno sul tuo HD.
Basta che apri i file che hai scritto e cerchi la definizione
di header con un qualsiasi editor di testo. O con un grep.
Se per sbaglio hai cancellato il file con la definizione,
avrai pure da qualche parte un backup, no ?
E se proprio non trovi il file dove l'hai definito, perche' invece
non la riscrivi banalmente in un altro file *.h o al limite
anche all'inizio del file che hai postato, se non serve anche altrove ?
Nel tuo codice ci sono anche delle cose un po' strane, tipo
    return LPC_OK;
    putchar('\n');
oppure
    fclose(fp);
    free(fp);
o anche
(void) sprintf(.....);
ciao,
g.

perchè sono cose strane? sono standard ahime' obbligatoriamente da
inserire, date dal prof.  Dato che non sono molto bravo nella
programmazione in c potresti essere più chiaro perfavore?
E se proprio non trovi il file dove l'hai definito, perche' invece
non la riscrivi banalmente in un altro file *.h o al limite
anche all'inizio del file che hai postato, se non serve anche altrove ?
grazie

 programmazione in c potresti essere più chiaro perfavore?
   fclose(fp);
   free(fp);
E' un errore invocare 'free' su un puntatore restituito da 'fopen'. 
(In ogni caso, dopo 'fclose', il puntatore non deve essere usato in alcun
modo.)
Questo...
   return LPC_OK;
   putchar('\n');
...non ha senso: l'ultima espressione non verrà mai eseguita.
Max

Quindi dovrei rimuovere   free(fp);  ?
Si...grazie ma invece di
Questo... cosa ci potrei scrivere affinkè l'espressione venga
eseguita?


 (void) sprintf(.....);
fare il cast a (void) del valore di ritorno di
una sprintf() anche se non costituisce un errore,
e' una cosa totalmente inutile e quindi non capisco cosa
ci stia a fare. (Il valore di ritorno di una sprinft e'
un intero corrispondente al numero di caratteri "stampati",
escluso il terminatore 0).
A dirla tutta, non capisco bene nemmeno perche'
usi sempre 3 linee di codice, tipo
char Err4[256];
(void) sprintf(Err4, "Errore allocazione memoria");
LPC_GestioneErrore(LPC_NO_MEMORY, "CreateDatabaseFile", Err4);
quando basterebbe:
LPC_GestioneErrore(LPC_NO_MEMORY, "CreateDatabaseFile",
"Errore allocazione memoria");
(Comunque anche questo e' solo un suggerimento).
Queste sono solo cose che mi sono saltate violentemente
agli occhi, non ho controllato il codice.
ciao,
g. (vanvera)

 
devi solo invertire le due istruzioni...
g.

ho provato a cambiare queste istruzioni ma mi dà lo stesso errore, e
non mi crea il file eseguibile :(( qualcuno è così gentile da
apportare le modifiche al mio codice? e postarlo? Affinchè possa
crearmi questo stramaledetto eseguibile! Sto uscendo matto! Grazie

Allora ho un progetto da fare per l'università è mi hanno fornito
tutta la gerarchia delle directory che si presenta in questo modo:
DBF/
       doc/       contiene la documentazione relativa al progetto
       include/   contiene un header da includere in tutti i moduli del
progetto
       Modulo1/  il modulo che devo compilare
       Modulo2/
       Modulo3/
       Modulo4/
       obj/         una volta compilato un modulo qui andrà il file .o
della gest. errori
       src/         c'è il sorgente della funzione che gestisce gli
errori
Per compilare devo entrare nella cartella Modulo1 e digitare make test.
La cartella Modulo1 si presenta così:
Modulo1/
           doc/   documentazione inerente questo Modulo
           include/   ci va un header che creo per contenere costanti,
struct e prototipi di  funzione
           lib/     dopo la compilazione ci aggiunge il file Modulo1.a
           obj/    dopo la compilazione ci aggiunge i file .o dei
sorgenti da me creati
           src/    sorgenti da me creati
           test/   qui dentro ci sono le funzioni per testare la
funzionalità dei miei sorgenti
           makefile   penso che sappiate tutti cosa sia :)
Praticamente entro dentro la cartella Modulo1, lancio make test e poi
dovrei andare nella cartella test e lanciare ./TestM1 (creato durante
la fase di compilazione), solamente che mi dà questi stramaledetti
errori! E non mi crea quest'eseguibile...
make test
gcc -c -g -I include -I ../include test/TestM1.c -o test/TestM1.o
gcc -c -g -I include -I ../include src/LPC_Common.c -o obj/LPC_Common.o
gcc -c -g -I include -I ../include src/LPC_CreateDBF.c -o
obj/LPC_CreateDBF.o
src/LPC_CreateDBF.c: In function 'CreateDatabaseFile':
src/LPC_CreateDBF.c:16: error: 'header' undeclared (first use in
this function)
src/LPC_CreateDBF.c:16: error: (Each undeclared identifier is reported
only once
src/LPC_CreateDBF.c:16: error: for each function it appears in.)
src/LPC_CreateDBF.c:16: error: 'h' undeclared (first use in this
function)
src/LPC_CreateDBF.c:18: error: syntax error before ')' token
src/LPC_CreateDBF.c:20: error: syntax error before '=' token
src/LPC_CreateDBF.c:102: error: 'fp' undeclared (first use in this
function)
make: *** [obj/LPC_CreateDBF.o] Error 1
 
Grazie

Che grande guru che sei! Ho kiesto l'aiuto al forum, non avevo bisogno
di una paternale! Adesso grazie a te..il prob è risolto

 
Mi fa piacere che il problema sia stato risolto ;-)


Senti, non riesco a capire bene com'è definita la struttura
header.....
Me lo potresti spiegare???