Domande sul Modulo 1 (creazione del database)

In questa pagina potete porre domande sul Modulo 1.

Vi prego di inserire un titolo che chiarisca che tipo di domanda state ponendo.


Pagina di consegna

Ho creato la pagina per la consegna dei moduli .

Dovete zippare la directory del vostro modulo 1 e farne l'upload.

Se riesco semplifico la pagina per farvi consegnare solo i files giusti.

-- AndreaSterbini - 11 Mar 2006


Due domande

Due cose non mi sono chiare. La conversione in Network Byte Order va fatta in concomitanza alla lettura del file? E poi non ho capito perché bisogna leggere i file con il suffisso b invece che leggerli normalmente. Che cosa comporta?

-- EmanueleGallo - 15 Mar 2006

Re: Due domande

I dati vanno memorizzati in NBO, quindi prima della scrittura c'è la conversione host-> Network. LA lettura farà la conversione contraria. Per quanto riguarda la "b", si tratta dell'apertura, non della lettura e serve perché sono files binari.

-- GianniCampanile - 15 Mar 2006

Visto che ci sono....

faccio un'altra domanda smile .... Oggi a lezione è stato detto che praticamente dobbiamo ignorare il parametro FIELD_DATA per la creazione di un database. Quindi quando andiamo a creare la funzione createdatabase con quali parametri dobbiamo crearla? Solo con *Name? Grazie.

-- EmanueleGallo - 15 Mar 2006

Re: FIELD_DATA

C'è un malinteso: è solo il campo FieldDecs della struttura FIELD_DATA_t che va ignorato. In ogni caso questo campo non viene mai citato nella descrizione delle funzioni di interfaccia.

-- GianniCampanile - 15 Mar 2006

Problema con estensione del file aperto su linux

il problema è semplice, non si puo creare un file avente il formato .$$$ su linux perche la bash lo interpreta come un comando! per fare un test provate a fare:

1) touch test.$$$ oppure 2) echo $$$

queste operazioni producono: 1) un file con nome: test."pid processo padre della shell"$ 2) pid processo padre della shell

Ovviamente bisogna correggere anche la funzione di test in quanto prova a creare "file.$$$". Tutto ciò ha senso solo su linux, su windows non ho idea e sinceramente non mi interessa neanche saperlo wink


-- GabrieleGristina - 15 Mar 2006

Re: problema con estensione del file aperto su linux

E' chiaro che lo shell interpreta i caratteri speciali, ma bastano gli apici (singoli o doppi) e il problema si risolve.

Tutto il codice è stato sviluppato e testato su diversi ambienti, a parte possibili sviste sulla documentazione, nel codice non ci dovrebbero essere errori.


-- GianniCampanile - 15 Mar 2006

Big lendian

il formato Network byte Order è il Big Endian?

-- GiuseppeEsposito - 15 Mar 2006

Re: Big Endian

Si.

-- GianniCampanile - 15 Mar 2006

Creazione Database

Grazie per le risposte. wink

Visto quindi che è solo il campo FieldDecs a non essere contemplato, allora la creazione di un database implica anche la creazione di un campo?


-- EmanueleGallo - 15 Mar 2006

Re: Creazione Database

Di molti campi. Le specifiche mi sembrano comunque chiare su questo punto.

-- GianniCampanile - 15 Mar 2006

Re: Re: Creazione Database
Ok ma quando creo un nuovo database si presuppone che sia vuoto o no? Cioè quando lo creo il database dovrebbe avere al più un campo (vuoto peraltro), poi successivamente se dovrà essere modificato allora si aggiungeranno credo tramite apposite funzioni.

-- EmanueleGallo - 15 Mar 2006

Re: Re: Re: Creazione Database
No, la funzione di creazione crea tutto da zero. Il file non esiste (altrimenti ci sarebbe errore) e la definizione di tutti i campi è passata nel parametro FieldData, che è un vettore di NumFields elementi. Per favore leggete BENE le specifiche e la documentazione delle funzioni.


-- GianniCampanile - 15 Mar 2006

Errore nella CreateDatabaseFile(): DBF_MAX_FIELDS -> MAX_NUM_FIELDS

C'è un errore nella descrizione della funzione CreateDatabaseFile(). La costante citata DBF_MAX_FIELDS è in realtà la costante MAX_NUM_FIELDS .


-- GianniCampanile - 15 Mar 2006

Modalità creazione file

Il file deve esere creato in modalità "wb+" o "rb+", giusto??

-- GiuseppeLisanti - 15 Mar 2006

Re: Modalità creazione file

Beh, c'è una differenza tra wb+ e rb+ no ?

Provate e verificate, cercando di capire anche se il "+" è necessario oppure no.


-- GianniCampanile - 15 Mar 2006

Header di un DBF

Nell'header, nella parte che riguarda la descrizione dei campi, non e' specificato che anche il "tipo di campo" e' uno short in network byte order.

-- GianniCampanile - 15 Mar 2006

(senza titolo)

scusate l'ignoranza, ma cancellare un database, significa "svuotare" il file o cancellarlo fisicamente???? nel secondo caso non dovrebbero servire permessi di root???

-- LorenzoReatini - 15 Mar 2006

Re: Cancellazione

Dare sempre un titolo ai topic. Nelle specifiche è spiegato cosa si intende.

root ?????


-- GianniCampanile - 15 Mar 2006

Re: Re: Cancellazione
intendevo permessi di superuser su linux...

-- LorenzoReatini - 15 Mar 2006

Re: Re: Re: Cancellazione
Sta dicendo che per cancellare un file su un sistema Linux biaogna essere superuser. Non le sembra strano ? Non risponderò ancora su questo topic.

-- GianniCampanile - 16 Mar 2006

(senza titolo)

ah... dimenticavo, i file .$$$ devono essere presenti quando il database è aperto al posto del .dbf o assieme al .dbf???

-- LorenzoReatini - 15 Mar 2006

Re: File .$$$

Assieme. Non risponderò ancora a topic senza titolo.

-- GianniCampanile - 16 Mar 2006

Little Endian-Big Endian

Questo discorso non mi è chiarissimo! Dobbiamo fare la conversione prima di verificare se un campo NUMERIC;DATE o LOGICAL è corretto??

-- GiuseppeLisanti - 15 Mar 2006

Little Endian-Big Endian

...o solo quando andiamo a scrivere nel file??

-- GiuseppeLisanti - 15 Mar 2006

Re: Little Endian-Big Endian

Quello che fate nella funzione ha importanza solo per il suo comportamento esterno. In altre parole, se nella vostra funzione fate 7 conversioni, 2 capriole e 3 radici quadrate questo non interessa. Le specifiche riguardano solo l'external behaviour delle funzioni: cosa leggono, cosa scrivono, cosa prendono in input, cosa ritornano.


-- GianniCampanile - 16 Mar 2006

Controlo del parametro Name

In CreateDatabaseFile bisogna controllare che il nome del database sia valido. Questo bisogna farlo prima o dopo averlo troncato a 10 caratteri? C'è una certa differenza perché nel primo caso un nome tipo "ciaocomeva?$%!" lo rifiuta e nel secondo lo prende buono. Inoltre caratteri alfanumerici includono le accentate?

-- MicheleBalistreri - 15 Mar 2006

Re: Controlo del parametro Name

Il controllo va fatto prima del troncamento. I caratteri accentati o in generale non ASCII non sono ammessi.


-- GianniCampanile - 16 Mar 2006

Campi di FieldData

Un'altra domandina, i campi passati in FieldData hanno già i valori di FieldType e FieldLen in Network Byte Order o bisogna convertirli? Stando su un processore Big Endian (G5) non mi accorgerei della differenza con il test.

-- MicheleBalistreri - 15 Mar 2006

Re: Campi di FieldData

Il chiamante (il cliente) non sa nulla delle specifiche interne. E' importante distinguere i diversi livelli di conoscenza.


-- GianniCampanile - 16 Mar 2006

Lunghezza di un record

Quando si salva l'header del DBF si deve salvare anche la lunghezza di ogni record, me la documentazione non dice come questa va calcolata. Ho provato sommando la dimensione di ogni campo, ma non va bene: nel test 10112 ad esempio, si ottiene 32 ( 10 + 8 + 4 + 1 + 1 + 8 ) mentre nel file ProvaTest.dbf il valore salvato e' 38.

-- AlessandroAgostini - 15 Mar 2006

Re: Lunghezza di un record ***** ATTENZIONE******

Ha ragione. Nelle specifiche interne non è detto che nel record, dopo ogni campo c'è un NULL come separatore. A questo punto il conto torna.

-- GianniCampanile - 16 Mar 2006

Controllo esistenza di un file

Mi sono scontrato con un problema un po' particolare. Non c'è un modo ANSI C standard di controllare l'esistenza di un file. Infatti controllare se esiste soltanto aprendolo "r" e testare che il ritorno non sia NULL non funziona bene in sistemi multi-utente tipo UNIX (in cui il file potrebbe per esempio non venire aperto per problema di permessi, risultando inesistente). Capisco che il problema è poco serio visto il contesto, però come dobbiamo comportarci?

-- MicheleBalistreri - 15 Mar 2006

Re: Controllo esistenza di un file

Il modo ANSI C c'è.


-- GianniCampanile - 16 Mar 2006

Re: Re: Controllo esistenza di un file
Sì, c'è, è quello di cui parlavo (provare fopen in modalità read e controllare se ritorna NULL), e presenta le limitazioni appunto di cui mi preoccupavo nel mio post. Non so se ci sia un altro modo ma su vari newsgroup che ho consultato la risposta era sempre la stessa. Insomma, usiamo il metodo ANSI C e ignoriamo le altre possibili cause di fallita apertura (fopen su unix setta anche errno, ma i codici di errore sembrano essere system-dependent).

-- MicheleBalistreri - 16 Mar 2006

Re: Re: Re: Controllo esistenza di un file
Non è con la fopen. Le ripeto che c'è, cerchi ancora.


-- GianniCampanile - 16 Mar 2006

Re: Re: Re: Re: Controllo esistenza di un file Ha ragione, il modo non è ANSI C ma POSIX. Ho aggiunto un topic e delle note per chiarire l'utilizzo di funzioni POSIX.


-- GianniCampanile - 17 Mar 2006

Database File

Quando andiamo a scrivere nel file che creiamo per il database, come devono essere strutturati i vari dati nel file?

-- EmanueleGallo - 16 Mar 2006

Re: Database File

Questo e' scritto esattamente nelle specifiche.

-- GianniCampanile - 16 Mar 2006

FieldValue

vorrei sapere se la struct FIELD_VALUE_t (riguarda i campi del database) va usata in questo modulo!!! grazie

-- LucaTartaglia - 16 Mar 2006

Re: FieldValue

Nelle specifiche di interfaccia non è presente. Se vuole la può usare internamente per suo comodo.

-- GianniCampanile - 16 Mar 2006

Re: Re: FieldValue
ok grazie mille...

-- LucaTartaglia - 16 Mar 2006

Chiarimento su strutture dati

Vorrei sapere se dobbiamo usare forzatamente le strutture definite da voi oppure possiamo accedere ai dati in altri modi. Grazie

-- GabrieleGristina - 16 Mar 2006

Re: Chiarimento su strutture dati

Non è questione di "forza". Ci sono delle specifiche che vanno rispettate. Modificare o non rispettare le specifiche equivale a invalidare il programma di test e quindi il compito. Ad.es. usare una propria struttura nella chiamata alla CreateDatabaseFile() al posto della FIELD_DATA_t vuol dire sbagliare completamente il compito. All'interno di ogni funzione o in chiamate tra funzioni non di interfaccia potete usare tutte le strutture che volete.

-- GianniCampanile - 16 Mar 2006

Chiarimento sull'header

io non capisco una cosa, il vostro file di prova la dimensione dell'header è in realta la dimensione del file stesso... com'è possibile che a voi viene scritto su file 75 invece di 19?

-- GabrieleGristina - 16 Mar 2006

Re: Chiarimento sull'header

Per header si intende tutta la parte di definizione "fissa" più tutta la parte di definizione dei campi, di lunghezza variabile. Se il database è vuoto, cioè non ha record, in pratica contiene solo l'header.

-- GianniCampanile - 16 Mar 2006

Re: Re: header
no avete ragione, mi esce fuori quel numero smile

-- GabrieleGristina - 16 Mar 2006

chiarimento sul nome del database

ciao a tutti vorrei sapere se il nome del database da creare si chiama Name oppure e' dipende dall'input...grazie!!!!

-- SimoneSantoro - 16 Mar 2006

Re: chiarimento sul nome del database

Credo basti LEGGERE BENE le specifiche.

-- GianniCampanile - 16 Mar 2006

**** ATTENZIONE: REGOLE SULLE DOMANDE *****

A questo punto credo sia necessario dare alcune regole: LEGGETE BENE TUTTE LE SPECIFICHE , sia quelle di intefaccia che quelle interne. Di tutte le domande poste sinora solo poche avevano effettivamente bisogno di chiarimenti. Ricordate che il codice è stato sviluppato e testato, quindi la soluzione c'è anche se ci vuole un po' di tempo per trovarla.
Inoltre date titoli significativi e rispettate l'indentazione (RE: etc.).

-- GianniCampanile - 16 Mar 2006

Possibilità di ritornare LPC_NO_MEMORY anche in DeleteDatabase ()

Le specifiche non prevedono la possibilità di ritornare LPC_NO_MEMORY nella funzione DeleteDatabase (), tuttavia ho bisogno di allocare memoria dinamicamente quindi la possibilità che questo errore seppur remota si presenta. Si può ritornare quindi questo valore? O bisogna ritornarne uno di quelli ammessi dalle specifiche?

-- MicheleBalistreri - 16 Mar 2006

Re: (senza titolo) Possibilità di ritornare LPC_NO_MEMORY anche in DeleteDatabase

Si, potete ritornare errori aggiuntivi rispetto a quelli specificati nell'interfaccia delle funzioni, purché sia in casi diversi da quelli citati esplicitamente.

-- GianniCampanile - 16 Mar 2006

OpenDatabaseFiles

a quanto ho visto, sulle specifiche del modulo 1, c'e' una parte in cui si parla di questa funzione, ma a quanto pare e' parte del modulo 2...ora quello che vorrei sapere e': devo implementare questa funzion(e se si devo modificare il suo .h visto che le versioni non combaciano) oppure semplicemente e' un errore nella stesura delle specifiche e la ignoro? grazie

-- AndreaFerraresi - 16 Mar 2006

Re: OpenDatabaseFile

Mi può indicare più precisamente dove se ne parla ?


-- GianniCampanile - 16 Mar 2006

Re: Re:
ECCO QUI:

Una volta creato, il database file viene chiuso, e per essere utilizzato deve essere chiamata la funzione OpenDatabaseFile (). Parameters: Name Nome del database file, stringa alfanumerica + '_' NULL terminated. NumFields numero di campi del database. *FieldData Vettore di strutture di dimensione numfields.

nel .h invece prende solo il parametro name


-- AndreaFerraresi - 16 Mar 2006

Re: Re: Re: OpenDatabaseFile
E' ovviamente un riferimento ad una funzione del secondo modulo. La parte dei parametri si riferisce alla Create, mi sembra ovvio anche questo. Fate solo quello che vi viene richiesto.

-- GianniCampanile - 17 Mar 2006

FIELD_DECS

Cosa e esattamente il field decs???


-- AlainBindele - 16 Mar 2006

Re: FIELD_DECS

LEGGERE BENE LE NOTE E I TOPIC PRIMA DI POSTARE!!!!!

-- GianniCampanile - 17 Mar 2006

come si compila????

provo a compilare con il comando ./makefile test oppure all ma mi da una serie di errori......ki mi può aiutare?????

-- FilippoMazzei - 16 Mar 2006

Re: come si compila????

UTILIZZARE QUESTE PAGINE SOLO PER DOMANDE DI CHIARIMENTI AI DOCENTI

-- GianniCampanile - 17 Mar 2006

Julian Date

Per quanto riguarda il timestamp sul man c'è scritto di usare il giulian date. Dobbiamo implementare la conversione noi o dobbiamo usare qualche funzione specifica?

-- GabrieleGristina - 16 Mar 2006

Re: Julian Date

Vi viene chiesto di sviluppare 2 funzioni. Cosa utilizzare per farlo è un problema vostro.

-- GianniCampanile - 17 Mar 2006

Re: Re: Julian Date
non mi sono spiegato bene a quanto sembra...

"timestamp ultimo update.... rappresenta il time in Julian Date."

Precisamente non capisco cosa intendete voi per "time in Julian Date". Il Julian Date ha vari formati, tra cui quello per la data e quello un pò piu preciso che tiene in considerazione anche ore, minuti e secondi ! Quale algoritmo devo implementare?


-- GabrieleGristina - 17 Mar 2006
Re: Re: Re: Julian Date
Le consiglio di capire un po' meglio cos'è una Julian Date.

-- GianniCampanile - 17 Mar 2006

Non mi trova LPC_Include.h

Nel mio codice ho scritto #include "LPC_Include.h", però non riesce a trovarmelo. Come mai?

-- EmanueleGallo - 16 Mar 2006

Re: Non mi trova LPC_Include.h

UTILIZZARE QUESTE PAGINE SOLO PER DOMANDE DI CHIARIMENTI AI DOCENTI

-- GianniCampanile - 17 Mar 2006

Controllo sul parametro *name

Se il parametro *name della funzione CreateDatabaseFile () ha lunghezza maggiore di DBF_NAME_LENGTH e contiene un carattere non consentito nei caratteri che vanno da name[DBF_NAME_LENGTH] a name[strlen(name) - 1] come si deve comportare la funzione? Troncare il nome ed aggiungere l'estensione oppure ritornare ugualmente il valore LPC_BAD_ARG?

-- MassimilianoNatale - 17 Mar 2006

Re: Controllo sul parametro *name

Credo solamente troncare il nome.

-- EmanueleGallo - 17 Mar 2006

Re: Controllo sul parametro *name

..in un post precedente, se ho capito bene, si diceva che bisogna prima controllare la correttezza di tutto il nome e poi fare il controllo sulla lunghezza. Dunque questo secondo controllo viene fatto solo se il nome contiene caratteri validi.

-- GiuseppeLisanti - 17 Mar 2006

Re: Re: Controllo sul parametro *name
LEGGERE BENE LE NOTE E I TOPIC PRIMA DI POSTARE!!!!!

-- GianniCampanile - 17 Mar 2006

libreria netinet.h

vorrei sapere perkè qnd compilo il programma dice ke la ibreria non estiste...qualcuno puoi aiutarmi big grin

-- SimoneSantoro - 17 Mar 2006

Re: libreria netinet.h

UTILIZZARE QUESTE PAGINE SOLO PER DOMANDE DI CHIARIMENTI AI DOCENTI

-- GianniCampanile - 17 Mar 2006

funzioni POSIX ****ATTENZIONE****

E' possibile utilizzare anche funzioni C POSIX, non solo ANSI. In particolare è ammesso (e in alcuni (pochi) casi necessario) l'utilizzo delle system calls. Per ragioni di portabilità vanno usate solo quando non c'è un'alternativa ANSI. Ricordo che il test verrà effettuato su macchine Unix/Linux, quindi è il caso che sviluppiate o almeno testiate su una macchina simile.


-- GianniCampanile - 17 Mar 2006

libreria netinet.h

buongiorno professore la mia domanda era rivolta a tutti coloro ke potevano aiutarmi a capire il motivo per la quale la libreria netinet\in.h nella fase di compilazione mi da errore..mi dice ke non lo trova!!! vorrei capire il problema!!

-- SimoneSantoro - 17 Mar 2006

Re: libreria netinet.h

Queste pagine vanno utilizzate solo per domande ai docenti di CHIARIMENTI SULLE SPECIFICHE, non per risolvere problemi di compilazione, link, librerie etc. etc. etc.

-- GianniCampanile - 17 Mar 2006

Valore costante DBF_FILENAME_LENGTH

questa costante non dovrebbe essere pari a 15?? Cioè 10+4+1 ??

-- GiuseppeLisanti - 17 Mar 2006

Re: Valore costante DBF_FILENAME_LENGTH

Il NULL è escluso.

-- GianniCampanile - 17 Mar 2006

Verifica Esistenza File

Salve Professore, volevo sapere se era possibile utilizzare la funzione access() per verificare l'esistenza di un file anche se da Linux a Win cambia la libreria da dover includere. Grazie

-- AlessioDezi - 17 Mar 2006

Re: Verifica Esistenza File

access() è una funzione POSIX molto utile che non ha equivalente in ANSI. Sì, può essere usata. Non utilizzate particolarità di Windows oppure utilizzate #ifdef opportune.

-- GianniCampanile - 17 Mar 2006

Julian Date

pensavo che ci potesse dare un aiuto generale sul julian date, mi manca solo quello e ho finito...

-- GabrieleGristina - 17 Mar 2006

Julian Date

una julian date non è altro che la rappresentazione in giorni di una data, il suo formato è "%d%d", cur_year, tot_day se per esempio la data è 17 marzo 2006 il julian date è: tot_day=31+28+17 cur_year=2006 jd=200676

intendete questo per julian date (spero)...


-- GabrieleGristina - 17 Mar 2006

Re: Julian Date

Su Unix/Linux un timestamp si può ottenere in ben pochi modi. Non è necessario avere i millisecondi, basta una precisione al secondo.

-- GianniCampanile - 17 Mar 2006

Re: Re: Julian Date
il mio dubbio rimane lo stesso: time in julian date

per esempio: io ho un timestamp di un file da epoch, quindi ho i secondi che sono passati fino ad ora da epoch; a questo punto mi viene in mente di convertire questi secondi in julian date...

che ne dice? smile


-- GabrieleGristina - 17 Mar 2006

Re: Re: Re: Julian Date
forse ho capito, per time intendete timestamp? perche se è cosi quello che ho scritto sopra ha un senso wink

-- GabrieleGristina - 17 Mar 2006

Buffer di char, ma Short e Long

Salve professore, sulle note c'è scritto che è consigliabile usare un buffer di char per poi copiarlo nel file, ma come si fa a inserire in questo buffer uno short o un long?bisogna scomporre lo short in 2 e il long in 4 per ottenere 1 byte, come si fa? Grazie.

-- AlessioDezi - 17 Mar 2006

Re: Buffer di char, ma Short e Long

Si intende solo dire che invece di fare tante singole scritture è conveniente preparare un buffer di bytes e fare una sola scrittura. In questo senso "char" è sinonimo di "byte".

-- GianniCampanile - 17 Mar 2006

Riempire una stringa di NULL

Cosa si intende per "Riempire una stringa di NULL"? NULL nel senso di carattere nullo ('\0')?

-- MassimilianoNatale - 17 Mar 2006

Re: Riempire una stringa di NULL

La definizione di NULL è quella, non credo ve ne possano essere altre.

-- GianniCampanile - 20 Mar 2006

File aperti in modalita' binaria & scrittura dell'header

Salve, ho notato che bisogna apripre i file in modalita' binaria...visto che si dice che si testa il tutto su sistemi Unix che senso ha visto che su questi sistemi non cambia nulla? Bisogna rendere il programma compatibile con win32? L'header deve essere formattato decentemente oppure non ci interessa?


-- AndreaFerraresi - 18 Mar 2006

Re: File aperti in modalita' binaria & scrittura dell'header

Da quello che lei dice, visto che su Unix è la stessa cosa, l'opzione "b" della fopen() sarebbe inutile. Per la seconda domanda la invito a LEGGERE le specifiche.

-- GianniCampanile - 20 Mar 2006

Re: Re: File aperti in modalita' binaria
Ho solo riportato quanto letto sul Kernigan & Ritchie...

-- AndreaFerraresi - 20 Mar 2006
Re: Re: Re: File aperti in modalita' binaria
cmq leggendo il man ecco quello che ne esce fuori

The mode string can also include the letter ``b'' either as a last character or as a character between the charac- ters in any of the two-character strings described above. This is strictly for compatibility with ANSI X3.159-1989 (``ANSI C'') and has no effect; the ``b'' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the ``b'' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-Unix environments.)


-- AndreaFerraresi - 20 Mar 2006
Re: Re: Re: Re: File aperti in modalita' binaria Bene, quindi la "b" serve a rendere il tutto portabile e compatibile ANSI e non fa male ai sistemi POSIX. Qual è il problema ?

-- GianniCampanile - 20 Mar 2006

Modulo1

#)->wc -l src/* include/* 53 src/LPC_Common.c 95 src/LPC_CreateDBF.c 39 src/LPC_DeleteDBF.c 25 include/LPC_M1_Include.h 212 total

Numtests:[19] Totvalue:[65] Passed:[65] Score:[100.00]

r0cks

Se ora consegno e voi per caso campiate qualcosa sulle specifiche posso riconsegnare il modulo senza problemi no? wink


-- GabrieleGristina - 19 Mar 2006

Re: Modulo1

Le specifiche non cambiano. Visto che c'è ancora tempo per la consegna, le consiglio di provare su un altro sistema Linux/Unix per sicurezza, e/o verificare che il codice sia scritto come da specifiche, ad.es. uso della funzione di errore, liberazione della memoria, indentazione, etc.

-- GianniCampanile - 20 Mar 2006

bytes del MAX_NUM_FIELDS

perchè se il numero massimo di campi che possiamo mettere è 255 usiamo 2 bytes e non 1??

-- MatteoSignorini - 19 Mar 2006

Re: bytes del MAX_NUM_FIELDS

Domanda corretta. Inizialmente si pensava ad un numero maggiore di campi, poi la specifica è cambiata ma il campo nell'header no. Consideratelo come "espansione futura...."

-- GianniCampanile - 20 Mar 2006

Lunghezza Campi

Volevo sapere se la lnghezza del nome campo deve essere troncata al auo limite massimo o se va consiederata errata. Nelle specifiche non viene spiegato. Grazie

-- PaoloParlapiano - 19 Mar 2006

Re: Lunghezza Campi

Non capisco bene la domanda. Se intende il troncamento del nome campo mi risulta difficile che riesca a passare un nome campo più lungo del limite visto che nella struttura FIELD_DATA_t il campo Name è già dimensionato.

-- GianniCampanile - 20 Mar 2006

Valore NULL

Sempre riguardo al valore NULL quello che volevo capire è questo: in pratica sappiamo che i diversi campi sono separati da NULL. Tuttavia quando dobbiamo scrivere l'header del DBF utilizziamo un buffer di char nel quale dobbiamo trasferire il contenuto dei vari campi. NULL quindi sarà rappresentato dal carattere '\0'?

-- MassimilianoNatale - 19 Mar 2006

Re: Valore NULL

Già risposto.

-- GianniCampanile - 20 Mar 2006

Modulo1

Non ho provato a compilare su un'altra macchina perchè non ne vedo l'utilità, posso capire se cambio architettura e lo compilo su un 64bit o su un powerpc.. Non uso la malloc quindi neanche gestisco quel tipo di errore, dovrebbe workare tutto bene. wink

-- GabrieleGristina - 20 Mar 2006

Re: Modulo1

Se è sicuro che tutto worki bene può consegnare. Il consiglio era perché comunque il suo programma verrà ricompilato su sistemi diverso dal suo, magari le è sfuggito un path esplicito oppure qualche altra specifica, magari il readme o altro. Faccia come crede, non si tiene comunque conto dell'ordine di consegna.

-- GianniCampanile - 20 Mar 2006

Chiarimento sulla scrittura dell'header

Cè una cosa che non mi è molto chiara riguardo l'Header: Avete detto che è consigliabile utilizzare un buffer per scrivere l'header.Ma il buffer va utilizzato solo per inserirci la parte fissa dell'header, mentre la parte variabile(cioè ogni campo) va scritta a parte dato che varia a secondo del valore NumField?cioè metto la parte fissa dell'header in un buffer, lo scrivo sul file e dopo scrivo NumField campi nel file. Giusto?

-- GiuseppeVioli - 20 Mar 2006

Re: Chiarimento sulla scrittura dell'header

Evidentemente i suggerimenti a volte confondono. Per efficienza, è buona abitudine limitare gli accessi all'I/O, quindi il suggerimento è di preparare tutto un buffer (sia della parte fissa che dei campi) e fare una sola scrittura. E' un SUGGERIMENTO, quindi potete seguirlo oppure scrivere come volete.

-- GianniCampanile - 20 Mar 2006

chiarimento su Modulo1

Ultime 2 domande: 1) dentro LPC_Include.h sono definiti degli include che cmq io uso nel mio Modulo, quindi non c'è bisogno che nel mio LPC_M1_Include.h li riscrivo perchè voi cmq lo testate nella workdir DBF/ giusto?

2) sulla documentazione c'è scritto che bisogna controllare la ret di qualsiasi funzione usiamo (es.: snprintf), però non sono definiti giustamente i codici di errore queste queste funzioni sull'include vostro. Devo usare errno.h per gestire la ret di questi errori oppure posso far ritornare un vostro codice di errore? per esempio, quando tronco la lunghezza del nome del database, se c'è un errore posso fare uso di LPC_BAD_ARG per la ret?


-- GabrieleGristina - 20 Mar 2006

Re: chiarimento su Modulo1

1) Ridefinire costanti già definite in LPC_Include.h è un ERRORE

2) Per la sprintf è possibile non fare il controllo dell'errore, ma in generale sono rare le funzioni che possono essere chiamate senza controllo. Comunque, se dovessero servire altri codici di errore possono essere definiti in LPC_M1_Include.h.


-- GianniCampanile - 20 Mar 2006

chiarimento su Modulo1

1) Meglio cosi, almeno il programma a meno righe 2) per la sprintf ho un idea:

DBF/Modulo1:#)->ret=0; (( ret=(( "$(grep sprintf * -R |grep -v "rtf\|html" |wc -l)" == 0 ) && ( "$(grep snprintf * -R |grep -v "rtf\|html" |wc -l)" > 0 )) ? 1337 : -1 )) && echo $ret 1337

usando snfprintf mi limito soltanto a controllare che non mi ritorni un numero negativo. Grazie per il chiarimento. Modulo up


-- GabrieleGristina - 20 Mar 2006

Gestione errori

Nel caso in cui l'utente inserisca un nome non valido, si deve permettere nuovamente l'inserimento?

-- AndreaLaudoni - 20 Mar 2006

Re: Gestione errori

Non so se ho capito bene la domanda, ma non sembra avere senso. State sviluppando una libreria, non un programma che dialoga con l'utente. Se il parametro è errato, le specifiche dicono che la funzione deve ritornare il valore LPC_BAD_ARG.


-- GianniCampanile - 20 Mar 2006

Re: Re: GestioneErrore
Chiarisco. Il nome del database e il numero dei campi li prendo con scanf dopo opportune printf (E' errato?) altrimenti da dove prendo il nome del dataBase (e il numero dei campi) ? Visto che ho scritto una funzione per il controllo del nome, nel caso in cui questo contiene caratteri non alfanumerici(per esempio), ritorno LPC_BAD_ARG ok ma poi come continuo l'esecuzione del programma?(da dove prendo l'eventuale nome corretto?)

-- AndreaLaudoni - 21 Mar 2006

Re: Re: Re: Gestione errori
E' sbagliato. Legga bene le specifiche, il nome e i campi sono parametri della CreateDatabase().

-- GianniCampanile - 21 Mar 2006

Numero record

Dalle specifiche non sono riuscito a capire come si calcola il numero di record... potrei avere un chiarimento... grazie

-- MarcoLaVecchia - 20 Mar 2006

Re: Numero record

E' il numero dei record del database. In un database appena creato ci sono 0 record. La gestione dei record (aggiunta, cancellazione etc.) è in un modulo successivo.

-- GianniCampanile - 20 Mar 2006

scrittura su file

ho constatato dopo innumerevoli tentativi che le mie scritture su file non corrispondono mai a quelle dell'esempio... vorrei chiedere ai prof se sono sicuri della correttezza dell'esempio di scrittura

-- MarcoLaVecchia - 20 Mar 2006

Re: scrittura su file

Si. Se sta verificando i due files con un compare binario non possono corrispondere, sia per il nome che per la data. Se sta usando il programma di test allora nella sua scrittura c'è qualche errore.

-- GianniCampanile - 21 Mar 2006

Re: Re: Numero record
quindi anche NumRecs (numero record corrente) va inizializzato a zero..giusto?

-- FrancescoPaturzo - 21 Mar 2006

Re: Re: Re: Numero record
NumRecs è il numero di record nel DB. Non c'è, nelle specifiche della CreateDatabaseFile() e DeleteDatabaseFile() un riferimento al record corrente. Attenetevi alle specifiche.

-- GianniCampanile - 21 Mar 2006

Re: Re: Re: Numero record
quindi la struttura DBF_INFO_t NON va utilizzata in questo modulo per la creazione dell'header ma bisogna creacre una struttura a parte?

-- FrancescoPaturzo - 21 Mar 2006

Re: Re: Re: Re: Numero record

Potete usare quello che volete, compreso la DBF_INFO_t (anche se mi sembra assurdo). Usare quello che volete, vuol dire che poi lo sapete voi cosa mettere come valore, visto che nelle specifiche non se ne parla. In pratica: non usate la DBF_INFO_t perché non è indicato da nessuna parte e non è sicuramente necessario.

-- GianniCampanile - 21 Mar 2006

PARAMETRO NumFields ***** ATTENZIONE******

Il parametro NumFields della CreateDatabaseFile() è un int, mentre il numero dei campi da inserire nell'header è uno short. Alcuni compilatori potrebbero dare un warning nell'assegnazione di un int ad uno short: in questo caso questo specifico warning non sarà considerato un errore.

-- GianniCampanile - 21 Mar 2006

Numero campi database

Non ho capito bene questa parte. Nelle specifiche si dice che se NumFields<=0 bisogna tornare un errore. Ma se noi stiamo creando un nuovo database anche il numero dei campi dovrebbe essere 0 o sbaglio? Di conseguenza anche FieldData non dovrebbe essere usata. Le specifiche l'ho lette bene ma non si capisce.

-- EmanueleGallo - 21 Mar 2006

Re: Numero campi database

Quando definisco ua tabella di un database devo obbligatoriamente definire anche i campi che ne fanno parte. Nel nostro sistema la creazione di un database vuoto non va effettuata, si parte subito con la creazione delle tabelle. La CreateDatabaseFile() è l'equivalente della creazione di una tabella in un database: nome della tabella (per noi è un file), un certo numero di campi ognuno con un nome, tipo e lunghezza.

-- GianniCampanile - 21 Mar 2006

Re: Re: Numero campi database
Ok ho capito, poco fa in risposta ad altri studenti ha detto che il un database nuovo il numero di record è uguale a 0, per cui se non ci sono record come fanno a esserci campi????!!

-- EmanueleGallo - 21 Mar 2006

Re: Re: Re: Numero campi database
E' lo stesso concetto di una tabella di un database che non contiene record. Ad.es. una tabella PERSONA, con i campi NOME, COGNOME, ETA, SESSO , quindi 4 campi, che però, appena creata, non ha record. Mi sembra che lei confonda i valori dei campi (quindi un record) con la definizione dei campi. In questo modulo definiamo i campi ma NON le funzioni per inserire i valori, cioè per creare i record.

-- GianniCampanile - 21 Mar 2006

Re: Re: Re: Numero campi database
Ok ora sembra più chiaro big grin

Grazie.


-- EmanueleGallo - 21 Mar 2006

Problemi per il controllo dei Field_Len

Salve, ho un problema nel controllo dei FIELD_***_LEN . Nel mio programma, apparte per il caso del tipo CHARACTER, controllo la validità della loro lunghezza confrontandola con le costanti definite nell'LPC_Include.h , ma controllando i dati che passa il test nella verifica della Funzionalità mi sono accorto che per un campo NUMERIC ad esempio mi viene passato il valore 10 quando su questa macchina sizeof(double) è 8 (così è definito tale campo in LPC_Include.h). Mi accade anche per gli altri tipi di campo di ricevere valori differenti dalle costanti, e questo se non sbaglio dovrebbe essere il tipo di test che passa i valori corretti per verificare poi la creazione del file, o sbaglio? Premetto che il test non è stato asolutamente modificato. Da cosa può dipendere? Mi potete aiutare? Grazie


-- PaoloParlapiano - 21 Mar 2006

Re: Problemi per il controllo dei Field_Len

Controlli meglio, perché la lunghezza di un NUMERIC è effettivamente 8, quindi non capisco dove sia il problema. Forse sta verificando il nome del campo (che è lungo 10 + 1) oppure, se sta parlando del calcolo della lunghezza di un record, consideri il NULL alla fine di ogni campo, ad esempio: COGNOME CHARACTER 3 ETA NUMERIC dà una lunghezza record di 3+1+8+1

-- GianniCampanile - 21 Mar 2006

conversioni formato

gentile professore, non riesco a capire una cosa riguardo le conversioni in network byte order: se stampo un valore prima della conversione e dopo la conversione devo ottenere lo stesso risultato??? intendo una stampa con una printf. oppure invece la visualizzazione corretta la si ottiene solo nella scrittura su file?????

-- MarcoLaVecchia - 22 Mar 2006

Re: conversioni formato

Consideriamo uno short e mettiamoci il valore 255. In esadecimale, nel formato host sarà 00FF=255 mentre dopo la conversione, qualora il formato Network fosse diverso da quello host (ad.es. su processore Intel) sarà FF00=65280.


-- GianniCampanile - 22 Mar 2006

Controllo lunghezza campi?

Dalle specifiche leggo che il valore di FieldLen è valido solo per i campi di tipo CHARACTER. Questo significa che per gli altri tipi non devo controllare la lunghezza?? Se faccio questo controllo per i campi LOGICAL,DATE e NUMERIC ho degli errori..mentre se non lo faccio...tutto fila liscio!! E' casualità o non va fatto il controllo?

-- GiuseppeLisanti - 22 Mar 2006

Re: Controllo lunghezza campi?

No, non deve verificare la lunghezza dei parametri di input. Però deve settare la lunghezza correttamente prima di scrivere nell'header. Probabilmente gli errori sono dovuti al fatto che quei valori, non essendo inizializzati, non sono validi. Li deve ignorare nei test di verifica parametri.

-- GianniCampanile - 23 Mar 2006

correttezza dei nomi del campo

Nelle specifiche nn mi e sembrato di leggere come devo comportarmi se il nome di un campo e piu lungo del dovuto, che devo fare troncare il nome del campo o considerarlo errato e ritornare errore?

-- PaoloGrasso - 22 Mar 2006

Re: correttezza dei nomi del campo

Ha ragione ed è strano che nessuno l'abbia notato sinora. Se un nome campo è più lungo di FIELD_NAME_LENGTH caratteri (escluso il NULL) va troncato a FIELD_NAME_LEGTH caratteri, come per il nome DBF. Non va ritornato errore.

-- GianniCampanile - 22 Mar 2006

Re: Re: correttezza dei nomi del campo
Quindi prima lo tronco e poi controllo se e uguale ad un altro campo,così metti che ce campocampo1 e campocampo2, me li segna uguali e eda errore.

-- PaoloGrasso - 22 Mar 2006
Re: Re: Re: correttezza dei nomi del campo
Prima verifica se rispetta le regole dei nomi campo (solo alfanum, etc. etc.), poi lo tronca e poi verifica se c'è già un campo con quel nome.

-- GianniCampanile - 23 Mar 2006

Chiarimento sulla scrittura dell'header

Non ho ben chiaro come deve essere formattato l'header del DBF o se la formattazione dell'header stesso non ha importanza. Ad esempio il carattere NULL deve dividere anche informazioni quali "numero dei campi" e "numero dei record"? O vanno scritte consecutivamente?

-- MassimilianoNatale - 23 Mar 2006

Re: Chiarimento sulla scrittura dell'header

Nelle specifiche interne c'è scritto esattamente come deve essere scritto l'header, byte dopo byte.

-- GianniCampanile - 23 Mar 2006

Nome di un campo ***** ATTENZIONE******

Anche il nome di un campo va troncato (al massimo FIELD_NAME_LENGTH caratteri, escluso il NULL), DOPO aver fatto i controlli di correttezza del nome. DOPO il troncamento va verificato che non vi sia un campo con lo stesso nome.

-- GianniCampanile - 23 Mar 2006

Lunghezza totale del dbf

Salve, ho notato una cosa riguardo alla lughezza del dbf...il file ProvaTest.dbf è di 117byte invece il nostro Prova.dbf in teoria dovrebbe essere di 123byte ovvero: 11+2+4+2+2+4=25 che è la parte fissa + quella relativa ai campi che sono 6 quindi 11+2+2+1=16*6=96 + 2 null finali TOT=25+96+2=123!!! Come mai?togliendo il null dopo ogni campo...123-6=117. Infatti anche nel ProvaTest.dbf dopo ogni campo non c'è un NULL che da quello che ho capito in binario è rappresentato da '^@'.

-- AlessandroMarinelli - 23 Mar 2006

Re: Lunghezza totale del dbf

Chiariamo una volta pe tutte questa storia del NULL: il NULL è il valore binario 0 (zero). Quello che lei vede come '^@' è la rappresentazione che alcuni editor o visualizzatori ne fanno, ma non certo il valore. Per vedere i valori di un file binario utilizzate il comando "od" e vedete l'output in decimale, esadecimale o carattere. La visualizzazione in carattere ha senso solo per i caratteri "stampabili" quindi di valore ascii tra 32 e 126 (compresi). Detto questo: legga bene i topic riguardo al NULL tra i campi: va considerato SOLO per calcolare la lunghezza del record. Non ci sono altri byte nell'header oltre quelli indicati nelle specifiche.


-- GianniCampanile - 23 Mar 2006

Re: Re: Lunghezza totale del dbf
Chiedo scusa...mi sono dimenticato di dire...aprendo il file TestProva.dbf con vim. Ora è chiaro nn avevo capito che i null dopo ogni campo venivano usati solo x calcolare la lunghezza del record mi scusi!

-- AlessandroMarinelli - 23 Mar 2006

Ancora sul nome campo ***** ATTENZIONE******

Anche se quanto scritto sul troncamento del nome campo è in teoria corretto, contrariamento al nome del database il nome del campo viene passato utilizzando il campo Name della struttura FIELD_DATA_t. Dato che questo è un vettore dimensionato, è IMPOSSIBILE che venga passato un nome campo più lungo di FIELD_NAME_LENGTH caratteri.

-- GianniCampanile - 23 Mar 2006

Calcolo della lunghezza di un record

Ogni campo, essendo in campo di bit sara della forma: NOME TIPO:LUNGHEZZA Sappiamo che si possono avere quattro tipi di campo e cioè: "nome" CHARACTER : FIELD_CHAR_LEN, "Nome" NUMERIC: FIELD_NUM_LEN, ecc.. Adesso per calcolare la lunghezza del record,faccio la somma di tutti questi campi, compresi Nome e Tipo per ogni campo,dato che ogni campo avra' il suo nome, la sua tipologia e la sua lunghezza?Oppure Nome e Tipo del campo, vanno scritti una sola volta?

-- GiuseppeVioli - 23 Mar 2006

Re: Calcolo della lunghezza di un record

No, la lunghezza di un record è data dalla somma delle lunghezze definite per ogni campo più un NULL. La definizione dei campi è scritta una volta sola nell'header. Ad.es. COGNOME CHARACTER 50 ETA NUMERIC NASCITA DATE La lunghezza del record sarà (50+1) + (FIELD_NUM_LEN+1) + (FIELD_DATE_LEN+1)


-- GianniCampanile - 23 Mar 2006

Controllo errore LPC_BAD_FIELD

Ho un altro dubbio: non mi è molto chiaro il concetto di "Valore di uno dei campi non valido" riguardo la gestione dell'errore LPC_BAD_FIELD. In che senso bisogna controllare che un valore del campo(nome,tipo o lunghezza) sia valido? Per esempio, per verificare se il valore di "TypeField" è corretto, devo controllare che "FieldData->TypeField" sia compreso tra 1 e 4?

-- GiuseppeVioli - 23 Mar 2006

Re: Controllo errore LPC_BAD_FIELD

Ovviamente devono essere rispettate tutte le regole definite nell'interfaccia, quindi che FieldData[i].Name rispetti le regole del nome di un campo etc. In particolare il tipo campo può essere solo dei valori CHARACTER, NUMERIC, DATE e LOGICAL e va verificato. Dimenticate i valori numerici (1-4), usate sempre le costanti. Se utilizzate valori numerici, anche se il test viene passato, il compito subirà una penalità, perché è detto esplicitamente di non farlo.


-- GianniCampanile - 23 Mar 2006


Scrittura parte variabile dell'header

Grazie.Comunque avrei un'altra domanda da farle:per scrivere la parte variabile dell'Header(cioè i Numfields campi), li scrivo uno alla volta? cioè scrivo "nome", "tipo","Lunghezza"e il NULL separatore per Numfiels volte?Visto che TypeFields deve essere convertito in NBO?sempre se sto ipoteticamente utilizzando un buffer.

-- GiuseppeVioli - 23 Mar 2006

Re: Scrittura parte variabile dell'header

La domanda non è molto chiara ma mi sembra comunque troppo specifica, può chiedere chiarimenti sulle specifiche, non sul modo di implementare il codice.

-- GianniCampanile - 23 Mar 2006

Re: Re: Scrittura parte variabile dell'header
Cerco di formulare la domanda in un altro modo:utilizzando un buffer di caratteri per memorizzare l'header, questo conterra' sia la parte fissa che quella variabile di esso.Ora, dato che anche la parte variabile deve essere scritta(in questo caso) nel buffer, non posso copiare tutta la struttura in un singolo campo di esso perchè, non facendo la conversione Host-->Network sia del tipo che della lunghezza del campo, faccio un errore. Quindi,(credo) non posso scrivere la struttura che definisce un campo,ma devo scrivere(dopo aver scritto la parte fissa dell'Header),uno alla volta i valori della struttura,spaziati successivamente da un NULL,in modo tale che, ad ogni 3 elementi del buffer(+ un campo per il NULL divisore),corrisponda un campo.E' giusto cio'?

-- GiuseppeVioli - 23 Mar 2006
Re: Re: Re: Scrittura parte variabile dell'header
Tutto corretto tranne il fatto che non c'è un NULL che separa la definizione dei campi. In alcuni topic precedenti ho spiegato che le specifiche dell'header sono corrette così; il NULL va considerato solo nel calcolare la lunghezza di un record, valore numerico che va messo nell'header. Per il resto non può mettere la struttura così com'è nel buffer sia per i motivi che lei ha esposto, sia per il fatto che non è mai detto che il sizeof di una struttura sia uguale alla somma delle lunghezze dei suoi elementi.

-- GianniCampanile - 23 Mar 2006

Nome di un campo

Mi scusi professore ma poco fa ha detto che dobbiamo controllare che anche i nomi dei campi debbano essere massimo di una certa lunghezza. Ma se nella struttura che ci avete fornito il nome del campo è definito con char Name[FIELD_NAME_LENGTH+1] a che serve fare il controllo?

-- EmanueleGallo - 23 Mar 2006

Re: Nome di un campo

Pardon ancora non avevo letto l'altra risposta smile

-- EmanueleGallo - 23 Mar 2006

Esistenza nome di un campo

Questa non mi pare di averla letta nelle specifiche, comunque se incontriamo un nome di un campo uguale ad un altro che dobbiamo fare? Lo ignoriamo e non lo inseriamo? Oppure torniamo un errore?

-- EmanueleGallo - 23 Mar 2006

Re: Esistenza nome di un campo

Viene ritornato LPC_BAD_FIELD. (cfr. specifica della CreateDatabaseFile() al codice di errore LPC_BAD_FIELD).

-- GianniCampanile - 23 Mar 2006

Re: *Julian date

Per chiarire le idee sulla Julian date, notate che:
  • il tipo di dato time_t definito in time.h è un long (4 bytes)
  • la funzione time produce il tempo in secondi passato dal 1 jan 1970

Questo non è esattamente il tempo nel calendario Giuliano (che inizia prima di Cristo), ma va bene per i nostri scopi.

In questo modulo il campo dello header del timestamp non viene controllato, ma in un modulo successivo potrebbe esserlo.


-- AndreaSterbini - 23 Mar 2006

Re: Re: Julian date
Quindi dobbiamo calcolare i giorni partendo da quello che ci restituisce time?

-- EmanueleGallo - 23 Mar 2006
Re: Re: Re: Julian date
Nessun calcolo. Bisogna memorizzare la data di ultima modifica del file, cioè (per questo modulo) la data di creazione, con precisione al secondo e che occupi 4 bytes. Guarda caso la funzione time() ritorna una data in un formato adatto allo scopo.

-- GianniCampanile - 23 Mar 2006

field data

salve professore vorrei avere un ulteriore kiarimento riguardo il valore field data: ciò ke io ho capito è ke se avro da input (persona,3,p), p dovrà creare 3 campi per il file persona,vero? spero ke sia così altrimenti dovrò rimodificare il programma quasi finito!!

-- SimoneSantoro - 23 Mar 2006

Re: field data

Immagino che p sia un tipo FIELD_DATA_t * e che contenga le definizioni di 3 campi. Il resto non e' chiaro.

-- GianniCampanile - 23 Mar 2006

Errore di scrittura su file

Cosa si intende per errore di scrittura su file? Cioè per quale tipo di evento devo ritornare errore?

-- EmanueleGallo - 23 Mar 2006

Re: Errore di scrittura su file

Se la funzione di scrittura su file ritorna un errore allora bisogna intercettarlo e ritornare un errore tramite la funzione LPC_GestioneErrore() e secondo gli esempi forniti nelle specifiche.

-- GianniCampanile - 23 Mar 2006

BUFFER

Sono tre giorni che non riesco ad andare avanti perche non riesco a capire come posso crearmi un buffer e metterci dentro sia char, sia long, sia short. Come posso fare???

-- FrancescoPaturzo - 23 Mar 2006

Re: BUFFER

Non so se posso dirtelo direttamente ma pensaci un attimo... vai a vedere cosa ti fornisce la specifica del progetto.

-- EmanueleGallo - 23 Mar 2006

Re: BUFFER

Non so se posso dirtelo in maniera diretta, ma pensaci un attimo... qualcosa di simile è fornito nelle specifiche.

-- EmanueleGallo - 23 Mar 2006
Re: Re: Errore di scrittura su file
Le servono funzioni che facciano la copia da un buffer ad un altro, cioè qualcosa di simile alla strcpy() ma più generiche. In questo modo può copiare da una qualunque variabile, in quanto viene considerata come sequenza di bytes.

-- GianniCampanile - 24 Mar 2006

Lunghezza record

Buongiorno professore, sono due giorni che il mio test di funzionalità del modulo 1 fallisce perché il SOLO valore della lunghezza di ogni record è diversa da quella specificata nell'esempio. Nell'esempio ProvaTest.dbf il valore è pari a \0& ovvero 38 ma eseguendo la somma della lungezza dei vari campi(campi utilizzati nel file di test) si ottiene 32; infatti il campo 1 "misura" 10 byte il campo 2 = 8 (un double) e i seguenti 4 1 1 8 per un totale di 32. Cosa può essermi sfuggito?

-- ClaudioMignanti - 24 Mar 2006

Re: Lunghezza record

Le è sfuggito di leggere con attenzione le note e i topic di questa pagina.

-- GianniCampanile - 24 Mar 2006

errore stranissimo

gentil professore, compilando il mio progetto mi sono imbattuto in un errore simile a questo: **glibc detected** free() invalid next size... o un altro simile che riguardava la malloc(). Da cosa puo dipendere?????

-- MarcoLaVecchia - 24 Mar 2006

Re: errore stranissimo

Così incompleto non le so rispondere, e comunque ripeto che questa pagina serve per chiarimenti sulle specifiche, non per problemi di compilazione, link etc..

-- GianniCampanile - 24 Mar 2006

gestione errore

vorrei sapere se e' necessario utilizzare la funzione di gestione degli errori, io finora non ne ho visto l'utilita'....

-- MarcoLaVecchia - 24 Mar 2006

Re: gestione errore

E' necessario perché è scritto nelle specifiche. Se non viene usata il compito verrà penalizzato. Avere una singola funzione di gestione dell'errore permette di modificare facilmente la gestione dello stesso, ad esempio indirizzano gli errori su un file di log piuttosto che su sdterr o su /dev/console.


-- GianniCampanile - 24 Mar 2006

field data(2)

p è un tipo field data ma intendevo sapere ske se ricevo da input i valori (persona,3,p) la funzione create() mi creerà: come nome del database persona 3 campi ad esempoio : età,sesso,nome p è il puntatore ke punterà al file "persona" ed ai relativi campi di persona?

-- SimoneSantoro - 24 Mar 2006

Re: field data(2)

Ho l'impressione che non abbia letto con attenzione le specifiche. I campi da creare sono passati nell'input, non lo decide la funzione, e sono specificati attraverso il puntatore che è il terzo parametro della funzione CreateDataabaseFile(). Legga bene sia le specifiche di interfaccia, sia quelle interne.

-- GianniCampanile - 24 Mar 2006

DeleteDatabase: controllare se un file è aperto

Volevo sapere se c'è qualche modo per sapere se un file è aperto oppure no. Si potrebbe usare la funzione access() a questo scopo? Cioè io controllo tramite access() se esiste il file con estensione .$$$ e se lo trova significa che è aperto. Potrebbe andare una soluzione simile?

-- EmanueleGallo - 24 Mar 2006

Re: DeleteDatabase: controllare se un file è aperto

Si. Il file con estensione "speciale" serve come flag dell'apertura di un database file.

-- GianniCampanile - 24 Mar 2006

include vari

ok non ho capito una cosa e dalle domande proposta questo errore pare che l'abbia riscontrato solo io. ma come e dove va incluso il file LPC_M1_Include? perchè in fase di compilazione non mi viene trovato....

-- LucaDiFilippo - 24 Mar 2006

Re: include vari

Lei è del mio canale e io a lezione l'ho spiegato. Comunque: è un file di che va utilizzato per tutte le dichiarazioni di costanti, funzioni e tipi dati che vi servono per realizzare il modulo e che non sono di tipo "generale" come quelle di LPC_Include.h. Va nella directory DBF/Modulo1/include, il makefile lo cerca lì. Ricordo che non vanno messi path espliciti nella direttiva include, ad esempio non è ammesso #include "../include/LPC_M1_Include.h"

-- GianniCampanile - 25 Mar 2006

string.h

possiamo su nostri funzioni usare funzioni di header string.h p.e. strncpy(yy,xx); ??

-- SotiraqSima - 24 Mar 2006

Re: string.h

Certamente sì, anzi cercate di utilizzare il più possibile le funzioni disponibili nella libreria ANSI e POSIX, non rifate quello che già c'è.

-- GianniCampanile - 25 Mar 2006

Controllo FieldLen

volevo sapere se quando scrive lunghezza fissa per campi NUMERIC,LOGICAL e DATE intende che non si DEBBANO fare controlli. Glielo chiedo perche' farli risulta errato con il test ma solo perche' non vengono inizializzati.Grazie.

-- FerdinandoAlessi - 24 Mar 2006

Re: Controllo FieldLen

A questa domanda ho già risposto molte volte in questa pagina. Per l'ennesima volta: il controllo va fatto SOLO sui campi CHARACTER.

-- GianniCampanile - 25 Mar 2006

File.dbf e File.$$$

Quando un file "Prova" e' aperto coesistono il Prova.dbf e il Prova.$$$ oppure c'e' solo il Prova.$$$? Grazie.

-- FerdinandoAlessi - 24 Mar 2006

Re: File.dbf e File.$$$

Anche a questa domanda ho già risposto in questa pagina. SI, coesistono.

-- GianniCampanile - 25 Mar 2006

Modalità di cancellazione file

Per cancellare il file si può usare la funzione remove()?

-- EmanueleGallo - 24 Mar 2006

Re: Modalità di cancellazione file

SI.

-- GianniCampanile - 25 Mar 2006

Una domanda generale su LPC_OK

La costante LPC_OK va ritornata solamente alla fine se tutto è andato bene?

-- EmanueleGallo - 24 Mar 2006

Re: Una domanda generale su LPC_OK

SI.

-- GianniCampanile - 25 Mar 2006

Funzione access

Ho un problema con la funzione access. Se la uso per controllare se un file esiste mi va in segmentation fault invece se uso la fopen con flag "r" non mi da nessuno problema e mi passa tutti i test!Quale potrebbe essere il problema?C'è un errore da qualche altra parte oppure la access ha una funzione di chiusura come la fclose per la fopen?

-- AlessandroMarinelli - 24 Mar 2006

Re: Funzione access

SOLO CHIARIMENTI SULLE SPECIFICHE, NON SULL'USO DELLE FUNZIONI

-- GianniCampanile - 25 Mar 2006

Test delle funzioni

Ma perché in alcuni test mi torna dei valori che non gli ho assegnato nella gestione degli errori? Cioè ad esempio per controllare se DBF è esistente mi torna il messaggio "Nome DB nullo o non valido" mentre io gli ho detto esplicitamente di tornare "DBF esistente".

-- EmanueleGallo - 24 Mar 2006

Re: Test delle funzioni

probabilmente ti rileva un altro errore che in realtà non c'è! cioè il test dovrebbe rilevare "dbf non esistente" ma sul tuo codice trova qualche altra cosa che non va! almeno credo!

-- GiuseppeLisanti - 24 Mar 2006
Re: Re: Test delle funzioni
Ma non è che per caso devo mettere il mio codice in ordine a seconda di quale test effettua?

-- EmanueleGallo - 25 Mar 2006

Re: Re: Test delle funzioni
Il programma di test stampa un errore generico, ma sopra all'errore stampato dalla funzione di test dovrebbe apparire l'errore intercettato e stampato dalla vostra funzione, se avete chiamato correttamente la LPC_GestioneErrore(). L'ordine di verifica degli errori non ha nessuna importanza.

-- GianniCampanile - 25 Mar 2006

Re: Re: Re: Test delle funzioni
Ok questo l'ho capito. Io l'ho chiamate correttamente per ogni errore speicifco. Ma non è che per caso ho messo più controlli di quanto richiesto? Perché ad esempio per la funzione DeleteDatabase, nel resoconto finale c'è scritto NumTest 6 e Test Passati 9.

-- EmanueleGallo - 25 Mar 2006

short e long nel buffer di caratteri

quando vado a scrivere nel buffer di caratteri uno short, per esempio il 117 della lunghezza dell'header vedo nel file solo 11..questo perchè mi vengono memorizzari separatamente i bytes...sto sbagliando completamente a procedere o sbaglio solo il formato nel momento in cui scrivo nel buffer??

-- GiuseppeLisanti - 24 Mar 2006

Re: short e long nel buffer di caratteri

Se sta scrivendo "117", cioè una stringa di 3 caratteri allora sta sbagliando.

-- GianniCampanile - 25 Mar 2006

Re: Re: Funzione access
Posso usare la funzione fopen con flag "r" per vedere se un file esiste?

-- AlessandroMarinelli - 25 Mar 2006
Re: Re: Re: Funzione access
Si, va bene, solo che la fopen() non distingue tra errore di esistenza e di permesso di accesso. Per i nostri scopi ha comunque il significato di "file non accessibile". L'uso della access(), anche se meno portabile, è sicuramente più preciso. Ma ripeto, va bene anche la fopen().

-- GianniCampanile - 26 Mar 2006

File $$$ necessario quando si crea il Database

Salve, volevo sapere se è necessario creare il file temporaneo .$$$ anche quando usiamo la Create per creare un nuovo DB. Pensavo che è impossibile che qualcuno tenti di modificare o leggere un file che ancora non esiste...Grazie

-- PaoloParlapiano - 25 Mar 2006

Re: File $$$ necessario quando si crea il Database

Forse c'è confusione su questo .$$$. NON VA CREATO NELLA FUNZIONE. Leggendo dalle specifiche risulta che se esiste il file .$$$ allora il database file è "aperto" e non può essere cancellato. La funzione CreateDatabaseFile() non "apre" un databse file, lo crea solo. In altre parole, nella DeleteDatabaseFile() dovete solo verificare se quel file esiste. Ripeto: LA CreateDatabaseFile() NON CREA IL FILE CON ESTENSIONE $$$.

-- GianniCampanile - 26 Mar 2006

chiarimento sul formato del nome

Salve, mi è venuto un dubbio, credo di non aver capito bene la storia dell'underscore.... In pratica questo underscore può essere presente dal secondo carattere in poi del nome? all'inizio pensavo che potesse stare solo alla fine del nome ma non ha molto senso. Grazie

-- GabrieleGristina - 25 Mar 2006

Re: chiarimento sul formato del nome

Il nome, da quanto è scritto sulle specifiche, può iniziare solo con i caratteri. Quindi l'underscore può solo partire dal secondo char in poi

-- EmanueleGallo - 25 Mar 2006

Definizioni dei campi

Nelle definizioni dei campi per immettere la dimensione di un campo vengono riservati due byetes (sizeof(short)) . Nel file LPC_Include.h, però, per la lunghezza riservata al campo "data" è sizeof(long) e quella riservata al campo "numeric" è sizeof(double). possono uscire fuori dei warning??

-- GiuseppeLisanti - 25 Mar 2006

Re: Definizioni dei campi

chiedo scusa...ho scritto una cavoata!! A proposito di warning però, quello relativo al NumFIelds che nel file è uno short non sarà considerato come errore giusto?

-- GiuseppeLisanti - 25 Mar 2006
Re: Re: Definizioni dei campi
Un eventuale warning sul cast tra l'int della definizione della CreateDatabaseFile() ad uno short NON SARA' CONSIDERATO ERRORE: Ma solo quello....

-- GianniCampanile - 26 Mar 2006

NumFields e lunghezza vettore FieldData -- Precondizioni

Premessa: se ho capito bene NumField è un intero che contiene il numero di elementi del vettore di strutture FieldData.

Domanda: un tipo di errore potrebbe essere che il numero di elementi nel vettore di strutture (FIELD_DATA_t * FieldData) sia diverso dal valore di NumField? In tal caso che errore sarebbe meglio ritornare? (non mi sembra ci sia un tipo di errore appropriato... sarebbe meglio che ne creassi uno io di valore -13, magari con la dicitura LPC_BAD_NUM).

Domanda più generale: sono previste delle precondizioni per le funzioni che dobbiamo implementare? Faccio un esempio: la CreateDatabaseFile accetta un qualsiasi tipo di stringa nel campo char * Name e quindi sta a noi individuare un eventuale errore di passaggio dei dati (per cui non c'è una precondizione sulle stringhe). Dobbiamo considerare OGNI TIPO di valore passabile alla funzione, oppure per qualcosa dobbiamo dare una limitazione a chi usa la funzione?

Questa domanda mi è venuta in mente perchè mi sembra che nella funzione TestCreate del file TestM1.c non sia previsto un caso come quello descritto da me nella prima domanda (NumField diverso dal numero di elementi del vettore FieldData).


-- DanieleSchirmo - 25 Mar 2006

Re: NumFields e lunghezza vettore FieldData -- Precondizioni

Se NumFields vale ad esempio 3, perché andare a cercare il 4 elemento in FieldData ? Le limitazioni all'uso della funzione sono esattamnente quelle che devono essere controllate da voi. Se un utente passa un valore non valido, questo DEVE essere intercettato. Non c'è modo di impedire ad un utente di provare ad utilizzare male le funzioni. Più in generale vale la regola che "...l'utente è un essere malvagio il cui unico scopo è di dimostrare che le funzioni che voi avete scritto vanno in errore"

-- GianniCampanile - 26 Mar 2006

Rappresentazione NumFields

Se NumFields è piu grande di 128 come va rappresentato nel file??? Dato che ci sono a disposizione 2 byte io ho pensato che si rappresentasse cosi: es. 140 = (pirmo byte = 12, secondo byte = 128) è giusto??? perche nell'esempio del prof NumField è 6 quindi viene rappresentato come primo byte = 0, secondo byte = 6... grazie

-- FrancescoPaturzo - 25 Mar 2006

Re: Rappresentazione NumFields

A me sembra che in uno short si possano rappresentare numeri da 0 a 65535. In un byte da 0 a 255.

-- GianniCampanile - 26 Mar 2006

documentazione

gentile prof, vorrei sapere nel dettaglio quali informazioni vanno inserite nella documentazione. Poi gradirei sapere quanto incide sul puntaggio una documentazione incompleta o mancante.... grazie

-- MarcoLaVecchia - 25 Mar 2006

Re: documentazione

Non c'è un dettaglio sulla documentazione. Inserite un'intestazione davanti ad ogni funzione e un commento davanti ad ogni blocco di istruzioni significative. Evitate commenti tipo: /* Inizio loop */ che non servono a nulla.

-- GianniCampanile - 26 Mar 2006

Include vari

Professore io non riesco a capire come è possibile includere i due header file senza dare il percorso /include/LPC_M1_Include.h. Visto che ho cercato su vari manuali e si internet potrebbe chiarirmi questo fondamentale quesito ?

-- SimoneDiCola - 25 Mar 2006

Re: Include vari

Non c'è bisogno di cercare nulla. Il makefile è già preparato per prelevare gli include dalla directory opportuna.

-- GianniCampanile - 26 Mar 2006

Re: Re: Re: Test delle funzioni
Qualcuno può rispondere al quesito di prima? frown

-- EmanueleGallo - 26 Mar 2006

Re: Re: Re: Test delle funzioni
nella delete i test sono 6..ma ogni test ha un peso...tu nei sei test hai "totalizzato 9 punti" su 19 totali.

-- GiuseppeLisanti - 26 Mar 2006

Re: LUNGHEZZA DI OGNI RECORD

Mi scusi professore ma dalle specifiche non riesco veramente a capire come calcolare la lunghezza di ogni record. Potrebbe spiegarmi meglio ?

-- SimoneDiCola - 26 Mar 2006

Cancellazione File

Salve, per cancellare un file si può usare la funzione unlink()?? E quindi includere le librerie <unistd.h>???

-- Users.691942 - 26 Mar 2006

Re: Cancellazione File

tanto per chiarire: i file di include non sono librerie. la unlink può essere usata.

-- GianniCampanile - 26 Mar 2006

Sempre sulla lunghezza di ogni record

Specifico meglio la domanda appena posta: io so che un record è un'insieme di campi logicamente correlati tra loro. A questo punto la mia domanda è: è corretto calcolare la lunghezza di ogni record sommando la lunghezza di ogni campo che mi viene passato ? Naturalemnte aggiungendo un NULL pe ogni campo ..

-- SimoneDiCola - 26 Mar 2006
Re: Re: LUNGHEZZA DI OGNI RECORD
E' già stato detto e ridetto molte volte in questi topic.

-- GianniCampanile - 26 Mar 2006

Tipo time_t restituito dalla funzione time ()

Professore facendo il sizeof di varibile di tipo time_t mi viene restituito 8 (byte) invece che 4 (byte) come da lei scritto. E' un problema ? Forse dipende dalla mia macchina che utilizza un'arhitettura a 64 bit ?

-- SimoneDiCola - 26 Mar 2006

Re: Tipo time_t restituito dalla funzione time ()

Probabilmente sì. Verifico meglio e le faccio sapere al più presto.

-- GianniCampanile - 26 Mar 2006

Test

Vorrei sapere se è normale che al 14 test consecutivo va in segmentation fault?Oppure è un mio problema...

-- AlessandroMarinelli - 26 Mar 2006

Re: Test

Vuol dire eseguire 14 volte il test ? Quale opzione del test ?

-- GianniCampanile - 26 Mar 2006

Re: Re: Test
Si dopo 14 volte va in seg fault...dipende dal numero del test...se faccio sempre il 3 va in seg fault sul 2 o 3 test.

-- AlessandroMarinelli - 26 Mar 2006
Re: Re: Re: Test
Ho testato nuovamente, ho eseguito 20 volte il test 3 senza problemi, quindi credo che il problema sia nel suo codice.

-- GianniCampanile - 27 Mar 2006

lunghezza campi

la lunghezza dei campi DATA,LOGICAL e NUMERIC va settata nel momento in cui andiamo a scrivere l'header sul file. Dobbiamo inserire questi valori anche nella struttura FieldData_t che la funzione prende in input??

-- GiuseppeLisanti - 26 Mar 2006

Re: lunghezza campi

Non è necessario. Il campo FieldData è stato pensato solo di input.

-- GianniCampanile - 27 Mar 2006

Re: documentazione

per documentazione intendevo il file che dobbiamo aggiungere con una spiegazione del progetto... se qualcuno puo dirmi cosa dobbiamo inserire in questo file...

-- MarcoLaVecchia - 27 Mar 2006
Re: Re: documentazione
Non c'è un file di "spiegazione" del progetto. C'è un readme nel quale dovete mettere il vostro nome (solo lettere e blank senza underscore inizia con una lettera), la matricola (solo numeri) e altre cose che sono scritte nelle specifiche. Per le note, per il 99,99% dovrebbe essere vuoto, ma se c'è veramente qualcosa di particolare allora potete scriverlo.

-- GianniCampanile - 27 Mar 2006

Re: Re: NumFields e lunghezza vettore FieldData -- Precondizioni
Sisi... sono perfettamente d'accordo su questo. La mia domanda intendeva il contrario, cioè se numfields è per esempio 4 e gli elementi di fielddata sono per esempio 3, come mi dovrò comportare? Se ho interpretato bene la sua risposta, quando cercherò il 4° elemento ci sarà un errore e dovrò terminare l'esecuzione della funzione (tornando per esempio LPC_BAD_ARG o LPC_BAD_FIELD o qualcosa che comunque vada bene), per cui anche questo è un errore da dover considerare e non fa parte delle precondizioni.

-- DanieleSchirmo - 27 Mar 2006
Re: Re: NumFields e lunghezza vettore FieldData -- Precondizioni
Se NumFiedls dice 4 e il FieldData ci sono solo 3 elementi, generalmente si va in core dump e non c'è nulla da fare, non è un errore della funzione ma del chiamante. Se FieldData è allocato anche per il 4 elemento, i dati saranno quantomento bizzarri, e in questo caso la funzione li dovrebbe rfiutare con sdegno e errore.

-- GianniCampanile - 27 Mar 2006

make all

Quando faccio il make all, i file da me fatti vengono compilati bene quando arriva a compilare il file di test da errori, in pratica non trova tutte le strutture e variabili che sono dichiarate in LPC_Include.h anche perchè questo .h non è incluso nei file file di test! Che fare?

-- Users.691942 - 27 Mar 2006

Re: domanda

Ma se io applico un buffer di 256 byte su un su un sistema opeativo linux con memoria ddr 333 mhz nel caso che venga utilizzato su Vista con un sistema palladium, quale puo essere il problema modificando la dimensione della cache in base al ciclo del clock scandito in tempi di 2 millisecondi secondo l`architettura della macchina di von neumann e che dedica gran parte del tempo all` impaginaqzione aspettando le operazioni di fetch e di execute andando ibnfine durante la compialzione in segmantation fault???

Attendo vostra risposta Grazie


-- GattoSilvestro - 27 Mar 2006
Re: domanda
Non riuscire ad acchiappare Titti fa brutti scherzi....

-- GianniCampanile - 27 Mar 2006

Re: make all

Nel makefile c'è l'inclusione di LPC_Include.h. Secondo me hai sbagliato ad includerlo nel file LPC_IncludeM1.h...prova a cambiare modo di inclusione...

-- AlessandroMarinelli - 27 Mar 2006

Re: make all


-- Users.691942 - 27 Mar 2006

Re: make all

E' nel file Test_M1.c che non è inclusa la libreria LPC_Include è inclusa solo la libreria LPC_IncludeM1 anche includendo la LPC_Include dentro a LPC_IncludeM1 il discornso non cambia sepre quegli errori Se invece includo la libreria LPC_Include dentro al file Test_M1.c non mi vengono dati più errori, però non dovrebbe essere così anche perchè poi i test automatici saranno fatti su i file standard Che fare??

-- Users.691942 - 27 Mar 2006

Re: make all

Per ora sembra il problema di cui sopra sembra con la mia ultima soluzione risolto in apparenza non mi da errori in compilazione ma mi da questo errore quando faccio il make:

make: warning:  Clock skew detected.  Your build may be incomplete.

-- Users.691942 - 27 Mar 2006

Re: Re: Re: make all
Allora...il problema sta nelle inclusione...nn devi modificare il file di test...devi solo modificare le inclusioni...basta trovare il giusto assetto!Se tu includi un file che ne include un'altro hai risolto ma dei stare attento alle "" e alle <>...

-- AlessandroMarinelli - 27 Mar 2006
Re: Re: Re: Re: make all
Non modificare il file di test. Le include directories sono correttamente individuate nel makefile. Se avete modificato l'albero delle dir del progetto il make non funziona, altrimenti si.

-- GianniCampanile - 27 Mar 2006

Re: inizio

che file devo aprire pr iniziare il progetto??

-- SilviaVitolo - 27 Mar 2006
Re: Re:
Quello delle specifiche.

-- GianniCampanile - 27 Mar 2006

Lunghezza di ogni record in ProvaTest.dbf

Il file ProvaTest.dbf ai byte 20 e 21, che corrispondono al valore della lunghezza di ogni record hanno rispettivamente i valori esadecimali 26 e 44 che interpretati come short little endian valgono 17446. Perche'?

-- VitalijZadneprovskij - 27 Mar 2006

Re: Lunghezza di ogni record in ProvaTest.dbf

A me non risulta ci siano quei valori. Provi un od -c del file e vedrà.

-- GianniCampanile - 27 Mar 2006

Struct per sostituire il buffer

considerato che una struct crea in automanico un area di memoria organizzata posso usare la struct DBF_INFO_t anchicche creare un buffer?

-- AlessandroCasciaro - 27 Mar 2006

Re: Struct per sostituire il buffer

la domanda non è molto chiara. Ovviamente potete usare la la DBF_INFO_t, così come qualunque altra struttura "inventata" da voi, solo che per questo modulo non è indispensabile e soprattutto non ha nulla a che fare con l'esigenza di creare un buffer di dati da scrivere nel file.

-- GianniCampanile - 27 Mar 2006

ANSI C corretto??

E' corretto in ANSI C dichiarare delle variabili non all'inizio del codice ma all'inizio di un blocco di codice?? Per esempio: è corretto dichiarare il buffer e altre variabili(che utilizzo solo nella parte finale della funzione) aprendo un nuovo blocco in modo che faccio la dichiarazione poco prima di usarle??

-- GiuseppeLisanti - 27 Mar 2006

Re: ANSI C corretto??

Si, potete dichiarare le variabili da utilizzare all'interno di blocchi. Gli esempi della funzione di gestione dell'errore fanno così. Fatelo però solo quando effettivamente la dichiarazione e l'uso sono vicini, altrimenti si perde di leggibilità.

-- GianniCampanile - 27 Mar 2006

compilatori difettosi.

gentile prof, volevo chiedere la versione di gcc con cui compilerete i nostri programmi, visto che alcune versioni obsolete vogliono che in ogni funzione le variabili siano dichiarate tutte all'inizio....

-- MarcoLaVecchia - 27 Mar 2006

Re: compilatori difettosi

Sicuramente una versione in cui le dichiarazioni possono essere fatte all'interno di blocchi, cfr. gli esempi di gestione dell'errore.

-- GianniCampanile - 27 Mar 2006

makefile

come faccio ad apire il "makefile" del modulo1?

-- SilviaVitolo - 27 Mar 2006

Re: makefile

Se per "aprire" intende "eseguire": make all oppure make module oppure make all Se intende "editare" allora usi un editor come vim o kedit, ma NON lo modifichi per non invalidare il compito.


-- GianniCampanile - 28 Mar 2006

Buffer di Long?

è sbagliato utilizzare un buffer di long per memorizzare i campi dell'header? O bisogna vedere il buffer come una stringa di dimensione pari alla lunghezza totale dell'header?

-- GiuseppeVioli - 28 Mar 2006

Re: compilatori difettosi

La seconda.

-- GianniCampanile - 28 Mar 2006

GESTIONE ERRORE

professore io ho letto più volte le specifiche tecniche ma non riesco proprio a capire cosa bisogna fare per la gestione degli errori..se puo darmi una delucidazione generale...grazie

-- TommasoIzzo - 28 Mar 2006

Re: compilatori difettosi

Nelle specifiche ci sono degli esempi. Li copi e li adatti nel suo codice, mi sembrano sufficientemente chiari.

-- GianniCampanile - 28 Mar 2006

PARTE FISSA

Professore mi sono dimenticato di chiederle a lezione se anche nella parte fissa ogni campo è separato da un NULL. Per spiegarmi meglio tra "Lunghezza di ogni record" e "timestamp" c'è un NULL di separazione o sono semplicemente attaccati ?

-- SimoneDiCola - 28 Mar 2006

Re: PARTE FISSA

Nelle specifiche dell'header c'è scritto che c'è un NULL tra Lunghezza e timestamp ? No ? Allora non c'è, sono attaccati.

-- GianniCampanile - 28 Mar 2006

Controllo retrun funzioni

nel mio codice uso la funzione memcpy(). anche per questa funzione devo controllare la return e gestire eventuali errori??? Ultima domanda sulla consegna: va zippata e consegnate solo la sotto cartella Modulo1 o tutta la cartela DBF??

-- GiuseppeLisanti - 28 Mar 2006

Re: Controllo retrun funzioni

La funzione memcpy() non ritorna errore ma il puntatore al primo argomento.

-- GianniCampanile - 27 Mar 2006

COMPORTAMENTO IN CASO DI CAMPI NON VALIDI

Grazie Professore, volevo chiederle come mi devo comportare nel caso in cui trovo campo della struttura FIELD_DATA_t. Nello specifico, sò che se trovo ad esempio un Nome doppio devo tornare il codice d'eerore appropriato ma non ho capito se prima devo controllare tutta la struttura, vedere se è tutto ok e poi copiarla nel buffer, oppure copiare finchè i campi sono corretti e nel caso trovo qualcosa che non và mi blocco , torno il codice d'errore appropriato ma comunque copio il mio buffer fino a quel punto nel file. Mi scusi se le faccio ora questa domanda e non a lezione ma non mi ero ancora imbattuto in questo problema.

-- SimoneDiCola - 28 Mar 2006

Re: Controllo retrun funzioni

Si scrive nel file solo se è tutto OK, quindi prima va fatta la verifica di tutti gli errori possibili.

-- GianniCampanile - 27 Mar 2006

TEST 10113

Non riesco a scrivere sul file in modo simile a cio' che e' scritto sul file ProvaTest.dbf anche passando short e long come richiesto la dimensione del file mi coincide ma la scrittura assolutamente no, e quindi non supero il test uso un buffer di char contenente tutti i dati da scrivere. di che tipo devono essere i dati passati al buffer e poi scritti sul file?

-- LucaDiFilippo - 28 Mar 2006

Re: TEST 10113

Non c'è un "Tipo" di dati. Deve essere una sequenza di bytes che rispetti le specifiche. Se il DBF si chiama "Uno", ad esempio, il primo byte sarà il carattere 'U', il secondo 'n', il terzo 'o' e poi fino a DBF_NAME_LENGTH + 1 ci saranno tutti '\0'. Poi ci sta il numero dei campi ad esempio in NBO: se sono 6 campi ci sarà (in esadecimale) 0600, e così via.

-- GianniCampanile - 27 Mar 2006

Ritorno delle funzioni dei test

Professore spero che mi risponda. Non riesco ad uscirne da questo problema. Le return delle funzioni dei test non corrispondono sempre a quello che voglio tornare. Cioè, ad esempio, nel test che verifica se il nome del campo esiste già, mi ritorna l'errore "Nome DB nullo o non valido o NumFields<=0". Perché fa così? Mi sono strettamente attenuto alle specifiche.

-- EmanueleGallo - 28 Mar 2006

Re: Ritorno delle funzioni dei test

Se ho capito bene ad ogni test ti torna sempre lo stesso codice di errore...secondo me hai sbagliato la condizione del test NULL...mi spiego meglio...al posto di == NULL hai messo = NULL...prova a vedere.

-- AlessandroMarinelli - 28 Mar 2006

Re: Ritorno delle funzioni dei test

No no è tutto scritto bene. Forse ho capito dov'è il problema. E' su una funzione che ho creato io per controllare se una stringa è valida oppure no. Praticamente avevo messo un controllo per i che va da 0 a strlen(s) e i messaggi erano tornati normali però andava in Segmentation fault in un test. Allora ho cambiato mettendo *s!='\0' e il Segmentation fault non me lo dava più però i messaggi sono tutti uguali.

-- EmanueleGallo - 28 Mar 2006

Re: Re: Ritorno delle funzioni dei test
Non ho capito: non è lei che scrive i messaggi di errore ? Qual è esattamente il problema ? Sicuramente il "for" deve andare da 0 a strlen(s)-1, altrimenti c'è un segmentation fault, però non ho capito i messaggi tutti uguali. in generale, se accadono cose "strane", tipo valori assurdi in variabili o stringhe, c'è uno sfondamento di memoria. Controlli bene tutti gli accessi alle variabili, dimensioni dei buffer, cicli. Inzeppi il programma di printf e si faccia stampare qualunque cosa dopo ogni istruzione. In alternativa, può usare un debugger, tipo gdb o meglio ddd. Comunque, dato che il programma dovrebbe essere corto, con le printf ne può uscire lo stesso.

-- GianniCampanile - 28 Mar 2006

Re: Lunghezza di un record

non ho capito bene come calcolare la lunghezza di ogni record, potrebbe rispiegarla in pochi passi. Considerato che nel record ogni campo è separato da un NULL se io implemento l'idea del buffer, dopo ogni capo dovro inserirci un NULL?

-- AlessandroCasciaro - 28 Mar 2006

Re: Re: Lunghezza di un record
No. Non vanno inseriti bytes diversi da quelli specificati nelle specifiche dell'header. I NULL servono solo per il CALCOLO della lunghezza del record. In pratica (e spero per l'ultima volta): per calcolare la lunghezza del record, che deve andare ai bytes 20 e 21 dell'header, sommate le lunghezze di ogni campo e poi aggiungete 1 (uno) per ogni campo. Non ci sono altri NULL nell'header. NOn dovete aggiungere NULL se non c'è scritto. Non separate nessun campo con i NULL. Studiate con il comando "od -c provatset.dbf" il file che c'è nella directory di test in modo da capire la struttura.

-- GianniCampanile - 28 Mar 2006

Nome campi duplicati

Non so se questo pto è già stato chiarito; ma nel caso in cui vi siano due campi con lo stesso nome come si deve comportare il nostro codice?

-- FabioFossati - 28 Mar 2006

Re: Nome campi duplicati

non solo è stato chiarito più volte, ma è scritto nelle specifiche della funzione, fra gli errori da ritornare.

-- GianniCampanile - 28 Mar 2006

FieldData[].Name

quant'è il valore massimo di lunghezza queato campo della struttura FieldData_t?

-- TullioSebastiani - 28 Mar 2006

pardon.....

è scritto nelle specifiche ma mi era sfuggito!

-- TullioSebastiani - 28 Mar 2006

Sistemi a 64 bit ***** ATTENZIONE******

Sui sistemi a 64 bit le specifiche per long e size_t non sono corrette. Su tali sistemi utilizzare al posto del long un int (32 bit) e effettuare un cast dal tipo size_t ad un int. Non dovreanno essere modificate le strutture dati fornite, ma solo effettuati dei cast ad int: eventuali warning derivanti da questi cast non saranno considerati errore. Lo studente indichi nelle note del documento readme.txt che il suo sistema è a 64bit.

-- GianniCampanile - 29 Mar 2006

Re: Re: TEST 10113
quindi utilizzando un buffer di tipo char dove immagazino tutti i dati prima della scrittura, dovro' copiare header e campi li sopra bit per bit e in caso di cifre scriverle in esadecimale, non usando una sprintf con %s %hd e %ld a seconda se quello che scrivo sono stringhe short o long?

-- LucaDiFilippo - 29 Mar 2006

Re: Re: Re: TEST 10113
La sprintf serve per creare stringhe formattate e terminate, noi stiamo scrivendo una sequenza di caratteri "strani". Non va usata la sprintf ma, come ho detto più volte, una funzione di copia tra buffer. La copia a quel punto è da un long (o short) TRATTATI COME SEQUENZA DI BYTES al buffer di bytes (o caratteri che, nel nostro caso è lo stesso). In C, trattare una qualunque variabile come sequenza di caratteri è estremamente semplice, non servono funzioni di "conversione".

-- GianniCampanile - 29 Mar 2006

Valutazione?

Se si consegna uno dei due funzioni CreateDatabaseFile() o DeleteDatabaseFile() sarà considerato?

-- IrisKonomi - 29 Mar 2006

ERRORE.

errore stray '\240' che significa?

-- IrisKonomi - 29 Mar 2006

Re: ERRORE

Dovrebbe dare qualche altro dettaglio...

-- GianniCampanile - 29 Mar 2006

Consegna

Devo consegnare Modulo1.zip...o DBF.zip? Grazie

-- GiuseppeLisanti - 29 Mar 2006

Re: Consegna

Se possibile uno zip con solo i 3 sorgenti + il readme. Altrimenti Modulo1.zip. Non mandate tutta la dir DBF.


-- GianniCampanile - 29 Mar 2006

Re: Re: Consegna
...ed anche LPC_M1_Include.h smile

-- GiuseppeLisanti - 29 Mar 2006

Test funzionalità cancellazione del file

Come mai nel test di funzionalità di cancellazione del file mi dà 0? Io ho eliminato il file tramite la remove. Che c'è che non va?

-- EmanueleGallo - 29 Mar 2006

Re: Re: Re: Consegna
Si, avevo dimenticato, va incluso anche il .h.

-- GianniCampanile - 29 Mar 2006

RIEMPIMENTO DEL BUFFER

Salve professore, le volevo chiedere se per riempire il buffer era possibile utilizzare la funzione memcpy(). Se non è possibile quale altra funzione posso utilizzare per fare ciò?. Grazie

-- GianpieroVenditti - 29 Mar 2006

Fclose()

Gentile professore, mi dispiace di dover chiedere spiegazioni su una funz ma non so proprio come fare.non so perchè ma se uso una fopen la fclose non chiude lo stream a file e mi sballa non solo il programma ma anche il test!ho provato anche ad usare fflush(fp) e poi fclose(fp) ma il puntatore non si annulla mai!
FILE * fp = fopen(Filename,"r");
printf("ptr = %d\n",fp);
fflush(fp);
fclose(fp);
printf("ptr = %d\n",fp)

output:
file Prova.dbf è pnt da 134558264
ptr = 134558264
ptr = 134558264

-- TullioSebastiani - 29 Mar 2006

Re: RIEMPIMENTO DEL BUFFER

perché non usare la memcpy ? E' anche una funzione ANSI, quindi portabile.

-- GianniCampanile - 29 Mar 2006

Re: Fclose()

Perché si aspetta che il file pointer si annulli ? Come è possibile che la fclose cambi il valore del parametro fp se questo viene passato per value e non per reference ? Se vuole essere sicuro che la fclose() funzioni non ha che da testare il ritorno e verificare se c'è un errore, altrimenti va tutto bene.

-- GianniCampanile - 29 Mar 2006

Conversione da Host a Network

avrei altre due domande da farle: La conversione da Host a Network la devo fare quando riempio il buffer oppure quando scrivo su file?Inoltre che tipo di parametri passo alle funzioni di conversione? Grazie

-- GianpieroVenditti - 29 Mar 2006

Re: Conversione da Host a Network

La devi fare prima di riempire il buffer. Comunque è già stato detto in post precedenti.

-- EmanueleGallo - 29 Mar 2006

sempre Correttezza ANSI C

...è possibile quindi dichiarare variabili anche all'inizio di un for ed utilizzarle solo per quel blocco?

-- GiuseppeLisanti - 29 Mar 2006

Re: sempre Correttezza ANSI C

E' corretto, anche se non sempre leggibile.

-- GianniCampanile - 30 Mar 2006

Timestamp e Endianess

Salve, vorrei se possibile un chiarimento. Ho sviluppato una funzione per la conversione in Network Byte Order che utilizza htons e htonl e funziona bene, il test sulla Create mi dà 100%. Ho anche verificato a mano l'ordine dei byte dei numeri salvati su file e tutto corrisponde, ad esempio 255 viene salvato come FF00, 70000 come 70 11 01 00 (il mio è un processore Intel). Ora, se stampo su file un timestamp mi viene una stringa del tipo 69 DE FF 44 (già in Network Byte Order). Ho notato che il 44 è sempre presente perchè parte più significativa del numero, anche a distanza di giorni, e infatti c'è anche nel file ProvaTest.dbf , ma stranamente è nella prima posizione! Ai fini del test è ininfluente perchè il timestamp non viene controllato, ok, ma come mai tale numero sembra stampato in Little Endian? E' un'eccezione? Grazie

-- PaoloParlapiano - 29 Mar 2006

Re: Timestamp e Endianess

Nel file ProvaTest.dbf il valore del timestamp è EE790044, corrispondente al 25 Febbraio 2006 ore 16.38.22 (non calcolando l'ora legale). Nessuna eccezione: ovviamente il timestamp non viene controllato perché è per forza di cose diverso.

-- GianniCampanile - 30 Mar 2006

Consegna Parziale *******ATTENZIONE******

E' possibile consegnare solo una parte del compito, cioè sia una sola delle funzioni o funzioni parzialmente svolte. Condizione necessaria comunque è che venga compilato correttamente, altrimenti non potrà essere testato. Per come è strutturato il test, cioè con l'uso i pesi, ovviamente il punteggio dipenderà da quanta parte della funbzione è sviluppata e da quale: ad esempio la CreateDatabaseFile() dà globalmente un punteggio maggiore della DeleteDatabaseFile() perché più complessa.

-- GianniCampanile - 30 Mar 2006

(senza titolo)

Professore avrei due domande da farle: La lunghezza del buffer è data dalla lunghezza della parte fissa dell'header piu la lunghezza di ogni campo per il numero dei campi piu i due NULL finali, giusto? Che tipo di parametri prendono le funzioni htons e htonl? Grazie.

-- GianpieroVenditti - 30 Mar 2006

Re: Lunghezza buffer

Per non confondere nessuno, per "lunghezza di ogni campo" intendiamo la lunghezza di ogni "definizione" campo, cioè il nome, il tipo e la lunghezza del dato. Ricordate che ci sono 2 costanti in LPC_Include.h che hanno come valore la lunghezza della parte fissa e la lunghezza della definizione di ogni campo, quindi il conto è banale.

Per ulteriore chiarezza, il buffer deve ovviamente contenere tutta quella roba, quindi deve essere lungo almeno quanto l'header, ma può esserlo di più; la scrittura deve però essere solo dei bytes dell'header. Non vorrei confondere maggiormente: per semplicità fate coincidere lunghezza del buffer e lunghezza dell'header.

La seconda parte della domanda non è consentita: basta un semplice man per saperlo.


-- GianniCampanile - 30 Mar 2006

TEST

se eseguo il test 3 due volte,la prima volta mi dice score 100% ma la seconda volta mi da un punteggio minore perche mi da errore alla verifica della correttezza cioe al test 10113......se esco e rifaccio il test 3 mi da sempre lo stesso problema:prima 100% e poi no??????? che puo essere anche perche verificando il file risulta corretto!!!!!!grazie

-- LiberatoFarisco - 30 Mar 2006

Re: TEST

Non so che dire, il test funziona bene. Forse c'è un problema nella funzione Delete. Se richiama il test numero 1 più volte e ottiene sempre 100 (come dovrebbe) controlli la sua funzione di Delete.

-- GianniCampanile - 30 Mar 2006

TEST DELETE.

Se eseguo i test per la funzione DeleteDatabaseFile tramite il TestM1.c mi da segmentation fault perche nell codice di TestM1.c quando si chiama la funzione void TestDelete(void) c'è questo codice al inizio // Creo il file fp = fopen("ProvaTest.dbf", "r"); len = fread(buf, sizeof(char), 500, fp); fclose(fp); fp = fopen("Prova.dbf", "w"); fwrite(buf, sizeof(char), len, fp); fclose(fp);

invece se non ci sta tutti i controlli si eseguono al 100%, come mai?


-- IrisKonomi - 30 Mar 2006

Re: TEST DELETE.

Forse ha cancellato il file ProvaTest.dbf. Quelle istruzioni servono a creare un file fittizio per vedere se la Delete lo cancella correttamente. Se è così, anche il test numero 1 dovrebbe andare in fault.

-- GianniCampanile - 30 Mar 2006

Messaggio Make

Quando eseguo il comando make all ricevo il messaggio che ho riportato. A che cosa è dovuto? Grazie mille.
make: *** No rule to make target `obj/LPC_Common.o', needed by `lib/Modulo1.a'.  Stop.
-- SergioLagotto - 30 Mar 2006

PROBLEMI PER COMPILARE

Dopo un pò che compilo il programma con make o make test....mi esce un messaggio : make: Nothing to be done for `test'....e non posso vedere gli errori.. lei prof. sà da cosa può dipendere?

-- TommasoIzzo - 31 Mar 2006

Re: Messaggio Make + PROBLEMI PER COMPILARE

Questi messaggi del make indicano che o è stato modificato il file makefile oppure l'albero delle directories non è quello indicato nelle specifiche. Nel primo caso non riesce a trovare una regola corretta per creare l'oggetto, quindi ci può essere un problema di nome (ad.es. LPC_common.c invece che LPC_Common.c. Il secondo non ho capito il "dopo un po'": quel messaggio esce se il target test non ha nulla da aggiornare o la regola è sbagliata. Vale il discorso di sopra.


-- GianniCampanile - 31 Mar 2006

DEBUGGING CON DDD

Professore non riesco ad effettuare il dubbing delle funzioni con DDD. In particolare se io scrivo : ddd TestM1 parte correttamente il debug ma una volta messo il breakpoint non me lo fà partire in quanto mancano delle parti. A questo punto la mia domanda è : è corretto usare il ddd su questo file o devo utilizzarlo sui file .c da me creati ? Grazie

-- SimoneDiCola - 31 Mar 2006

(senza titolo)

Vorrei sapere quali sono i due argomenti che vengono passati nel main, è questo il motivo per cui DDD non mi fà partire il debug.


-- SimoneDiCola - 31 Mar 2006

Re: DEBUGGING CON DDD

Qualcuno può aiutarmi ?

-- SimoneDiCola - 31 Mar 2006

Nome DB

Mi sorge un dubbio... se passo alla funzione create il nome "ciao" il mio db come si chiamerebbe fisicamente? ciao.dbf o ciao\0\0\0\0\0(fino a lunghezza massima).dbf?

(in pratico non mi è ben chiaro se i NULL nel name vanno messi solo nell'header...)


-- LucaMargiani - 31 Mar 2006

Re: Malloc o Calloc

Sulle specifiche è scritto chiaramente che crea il file ciao.dbf.


-- GianniCampanile - 31 Mar 2006

Re: DEBUGGING CON DDD

In pratica cosa devo mettere nella maschera Run with argument ?

-- SimoneDiCola - 31 Mar 2006

FieldType e FieldLen

In FieldType trovereno gia specificato se si tratta di char, num , data, o logical oppure dovremmo ricavarcelo da soli. Un altra domada : FieldLen varra FIELD_NUM_LEN per numeri FIELD_DATE_LEN per le date ect.. e per i charatteri?sulle specifiche è scritto 1 <= FieldLen <= FIELD_CHAR_LEN quindi da colcolare?

-- AlessandroCasciaro - 31 Mar 2006

Re: Malloc o Calloc

Forse è il caso che legga bene le specifiche: come potreste ricavare da soli il tipo campo ? E' ovvio che viene passato. Inoltre la lunghezza viene passata SOLO nel caso di CHARACTER, negli altri casi no, il contrario di quello che ha scritto lei.

-- GianniCampanile - 31 Mar 2006

DEBUGGING CON DDD

Nessuno di voi usa DDD ? Voglio solo sapere con quali argomenti devo far partire il test !

-- SimoneDiCola - 31 Mar 2006

Re: Debugging con DDD

Lancia DDD passandogli il programma di test ("DDD TestM1") a questo punto hai un prompt normale dove poter passare gli argomenti richiesti. Fai runnare e setta i breakpoint come meglio credi

-- MassimilianoNatale - 31 Mar 2006

Re: DEBUGGING CON DDD

OK, ma se metto i break poiint e poi clicco su Run , mi dice che il main vuole degli argomenti! Tu come hai fatto ? Speigami per cortesia.

-- SimoneDiCola - 31 Mar 2006

Re: Debugging con DDD

Io lo lancio anche senza argomenti wink

-- EmanueleGallo - 31 Mar 2006

Re: Debugging con DDD

Ho semplicemente compilato il modulo utilizzando il makefile e poi ho lanciato il comando "ddd TestM1". L'unico argomento che gli devi passare è quello relativo alla scelta che ti viene chiesto di fare: Test sulla Create(), sulla Delete() oppure completo. Il valore glielo passi utilizzando il prompt che viene visualizzato in basso.

-- MassimilianoNatale - 31 Mar 2006

Re: DEBUGGING CON DDD

Quello lo facevo già, ma come faccio a controllare cosa fanno le singole funzioni ? Se metto i break point mi fà fare la scelta ma non mi fà controllare praticamente niente. Dove sbaglio ?

-- SimoneDiCola - 31 Mar 2006

Re: DEBUGGING CON DDD

Quello lo facevo già, ma come faccio a controllare cosa fanno le singole funzioni ? Se metto i break point mi fà fare la scelta ma non mi fà controllare praticamente niente. Inoltre, non so a voi, ma a me non appare nemmeno il main nella schermata del DDD. A voi appare tutto il programma ?

-- SimoneDiCola - 31 Mar 2006
Re: Re: DEBUGGING CON DDD E ALTRO ******ATTENZIONE******
Eì' stato detto e ribadito più volte che in questa pagina NON SI DANNO CONSIGLI PER IL DEBUGGING, COMPILAZIONE O QUANT'ALTRO C'è l'apposita pagina OffTopic che non è stata molto utilizzata e servirebbe a questo.


-- GianniCampanile - 31 Mar 2006

Malloc o Calloc

Si può aggiungere la stdlib.h x poter usare la malloc o calloc?

-- LucaMargiani - 31 Mar 2006

Re: Malloc o Calloc

Certamente si, non capisco il dubbio.


-- GianniCampanile - 31 Mar 2006

segmentatin fault

ho eseguito il file complitato ciè TestM1 è mi dava segmentation e dopo vari tentativi ho deciso di lasciare solo il prototipo della funzione ma mi davo ugualemte il segmentation come mai ? potrebbe aiutarmi professore?

-- AlessandroCasciaro - 31 Mar 2006

Re: segmentatin fault

l'errore mi viene dato quando arriva a verifica correttezza nel test del create data base

-- AlessandroCasciaro - 31 Mar 2006

Tipo di include da utilizzare

Salve, ho notato che l'include di LPC_M1_include.h mi funziona correttamente sia se lo metto tra doppi apici sia tra '<' e '>' . Senza path, ne relativo ne assoluto, naturalmente! Immagino avvenga grazie alle direttive del makefile...in ogni caso quale dei due metodi è consigliato per non creare problemi di compilazione dopo l'invio del progetto? Grazie

-- PaoloParlapiano - 01 Apr 2006

Re: Re: segmentatin fault

a me se lascio vuota la funzione mi va in segmentation fault alla test 10113 big grin

-- LucaMargiani - 01 Apr 2006

Re: Re: Re: segmentatin fault
Il programma di test non è particolarmente brillante, nel senso che se il programma non è svolto correttamente o non fa quello che ci si aspetta allora può andare in errore. Dovete concentrarvi sul fatto che il votro programma è errato in qualche punto e cercare di capire perché, non dovete cercare di far funzionare il test. In altre parole, se il programma è fatto bene, il test va bene, altrimenti no.

-- GianniCampanile - 01 Apr 2006

Re: Tipo di include da utilizzare

La differenza è nella ricerca o meno nella directory corrente. Con gli apici cerca anche nella dir corrente altrimenti no. Per gli include di sistema si usano le < > per i propri si possono usare le " ". Nel nostro caso, dato che l'include è in un'altra dir, la cosa è indifferente. Occhio a rispettare maiuscole e minuscole: il file si DEVE chiamare LPC_M1_Include.h

-- GianniCampanile - 01 Apr 2006

Re: Re: Re: segmentatin fault
il test l'ho fatto girare con solo il prototipo della funzione, per il delet tutto ok ma per la create dava provìblemi al test 10113. Ho esaminato un po il codice è l'errore era dovuto al fatto che confrontava ProvaTest.dbf con un ipotetico Prova.dbf che ovviamente non siste, che però dopo ho creato a mano e mi sonoi reso conto che ad un certo punto del test cancellava prova.dbf e quindi andava a fare il confronto non lo trovava ed andava in segmentation faul.infatti ho provato a sotrituire il nome con prova1.dbf ed il relativo file ed in effetti il prog di test girava correttamente.

-- AlessandroCasciaro - 01 Apr 2006

FieldLen

Nelle specifiche si dice ke i tipi NUMERIC DATE E LOGICAL hanno lunghezza fissa... ma nel caso si passasse una lunghezza differente da quella come bisogna comportarci? ignorare oppure dare errore? non è molto chiaro nelle specifiche

-- LucaMargiani - 01 Apr 2006

Re: FieldLen

E' stato detto altre volte in questi topic, basta andare a leggere.

-- GianniCampanile - 01 Apr 2006

Lunghezza Header

2 bytes

* Lunghezza totale Header. Short in Network Byte Order.

Si intende la lunghezza fissa DBF_FIXED_HEADER_LEN + la parte dinamica + 2 null?


-- LucaMargiani - 01 Apr 2006

Consegna

ma il modulo lo su può consegnare massimo il 3 aprile alle 24??? oppure entro la mezzanotte di domani???

-- EmanueleCuozzo - 01 Apr 2006

Re: Lunghezza Header

Si

-- GianniCampanile - 01 Apr 2006

Re: Consegna

http://twiki.di.uniroma1.it/twiki/view/Labprog2/ConsegnaDeiModuli

-- GianniCampanile - 01 Apr 2006

gestione errori

ho il seguente dubbio: per la gestione degli errori io chiamo la funzione di gestione direttamente dalle funzioni di controllo che mi sono creato, funzioni che ritornano un errore alla funzione che le ha chiamate. il problema e' che se una funzione per controllare un certo errore la chiamo sia dalla Create che dalla Delete, poi nel messaggio che stampa la funzione di errore non e' possibile "risalire" a chi e' che che la ha chiamata, mentre l'errore ritornato e' lo stesso. Ho fatto questa scelta per non scrivere codice a doppio e perche' ho considerato la possibilita' di riutilizzare queste funzioni anche in moduli successivi. Il mio dubbio era quindi se e' necessario che gli errori vengano gestiti direttamente nella Create o nella Delete o se posso demandare questo compito ad altre funzioni, con la sola pecca di non poter stampare chi ha rintracciato l'errore. grazie

-- MarcoLaVecchia - 02 Apr 2006

Re: gestione errori

Tutto giusto, ma deve stampare l'errore anche nella funzione chiamante, cioè la Create o la Delete. Se ad esempio ha la Create che chiama la funzione VerificaNome, che chiama la funzione TestStringaNulla, se quest'ultima trova un errore, allora, risalendo lo stack, vi saranno 3 chiamate alla funzione di errore, quindi è possibile risalire esattamente ai chiamanti.

-- GianniCampanile - 02 Apr 2006

File. zip da consegnare

ha gia detto che bisogna consegnare uno zip con i 3 files .c e il .h. Ma il nome del .zip sara' Modulo1.zip (come e' scritto nelle specifiche) o modulo.zip(come e' scritto nellla pagina di consegna dei moduli)?

-- FerdinandoAlessi - 02 Apr 2006

Re: File. zip da consegnare

ho appena avuto risposta dal mail di conferma invio

-- FerdinandoAlessi - 02 Apr 2006

POSIX e include

Premesso che ho testato il mio programma sotto linux con il TestM1 generato dal makefile e ho come risultato 100.00, per ottenere ciò ho dovuto includere la libreria unistd.h (che su internet ho letto essere una libreria POSIX contenente la funzione access che ho dovuto usare) e in ogni mio sorgente .c ho incluso l'header LPC_M1_Include.h. Va bene includere così questi headers? Intendo dire, è accettabile usare la unistd.h e includere LPC_M1_Include.h in OGNI sorgente .c (LPC_Common, LPC_CreateDBF e LPC_DeleteDBF)? (PS: il modulo l'ho già consegnato, al massimo farò un aggiornamento correggendo solo quest'ultima cosa)

-- DanieleSchirmo - 02 Apr 2006

Re: POSIX e include

Non capisco molto bene i dubbi. E' chiaro che nei suoi sorgenti deve includere LPC_M1_Include.h, altrimenti non avrebbe le dichiarazioni delle funzioni che usa. Per quanto riguarda la access() ho già chiarito che si può usare, quindi va inserito l'header che la definisce. Così per ogni funzione POSIX. Tutto a posto, quindi.

-- GianniCampanile - 02 Apr 2006

Re: Re: POSIX e include
Mi scusi... più che dubbi erano paranoie big grin Grazie per le risposte

-- DanieleSchirmo - 02 Apr 2006

Re: GESTIONE ERRORI

Scusi Professore, non ho ben capito una cosa... Nelle nostre funzioni quando viene rilevato un errore bisogna chiamare la funzione LPC_Gestione_Errore(), oltre a ritornare il valore corretto?

-- FedericoFranzoni - 02 Apr 2006

consegna

Va consegnato anche LPC_Include.h?


-- AlessandroMarrone - 02 Apr 2006

Re: consegna

NO

-- GianniCampanile - 02 Apr 2006

Re: GESTIONE ERRORI

Si. Non farlo equivale ad un errore, come scritto nelle specifiche. Ci sono gli esempi di come usare la funzione di gestione errore; usarla E' OBBLIGATORIO.

-- GianniCampanile - 02 Apr 2006

Re: gestione errori

certamente, sono d'accordo con la sua risposta dello stack, ma cosa succede se la Verifica_Nome viene chiamata anche dalla Delete? succede che se gestisco l'errore in Verifica_Nome, da li non sono in grado di dire se a chiamarla è stata la Create o la Delete... quindi indirettamente lei mi sta dicendo di gestire tutto dal chiamante???? grazie

-- MarcoLaVecchia - 03 Apr 2006

Re: Re: gestione errori
e se la Verifica_Nome viene usata sia per verificare il nome del database sia per i nomi dei campi? In questo caso gli errori che deve tornare sono diversi, quindi non sarebbe meglio far chiamare la GestioneErrore solo alle funzioni chiamanti?

-- MatteoNati - 03 Apr 2006

Nome del file .zip da consegnare

Salve professore, volevo soltanto sapere se c'era un nome particolare da dare al file .zip che invieremo come soluzione, oppure se si può scegliere arbitrariamente. Grazie mille.

-- AndreaCosentino - 03 Apr 2006

Re: Re: Re: gestione errori
La funzione VerificaNome non ha nessun bisogno di sapere chi l'ha chiamata. Lei stampa il suo bell'errore con il suo bel nome e basta. Il chiamante della VerificaNome stamperà a sua volta un bell'errore,perché la VerificaNome ha ritornato un codice di errore. Se il chiamante è la Create allora nel parametro Func passerà il nome "CreateDatabaseFile", se il chiamante è la Delete passerà "DeleteDatabaseFile". Sull'output ci sarà qualcosa tipo: Errore [-3] in [!VerificaNome] --> [Nome nullo] Errore [-3] in [!CreateDatabaseFile] --> [Errore -3 nella chiamata alla VerificaNome]


-- GianniCampanile - 03 Apr 2006

Re: Re: Re: gestione errori

...Se il chiamante è la Create allora nel parametro Func passerà il nome "CreateDatabaseFile", se il chiamante è la Delete passerà "DeleteDatabaseFile"... il punto è proprio questo, per sapere chi è che sta chiamando quella funzione dovrei usare un flag o qualcosa di simile... ma allora finisce lo scopo di gestire l'errore fuori dal chiamante. Cmq ormai ho risolto diversamente... grazie

-- MarcoLaVecchia - 03 Apr 2006

Ordine controlli esistenza file in DeleteDBF

salve.ho testato il mio codice,mi sono accorto che quando la mia deleteDBF deve tornare errore perchè trova un file aperto(10205),torna come un errore perchè non trova nessun file .dbf,inquanto controlla prima se il file esiste e poi se è aperto.è corretto invertire i controlli? grazie

-- StefanoGuglielmi - 03 Apr 2006
No such template def TMPL:DEF{PROMPT:thread}
  • Se usate dei titoli comprensibili ci capiamo tutti un po' meglio
  • Ricordatevi di chiudere i tag che inserite nei post.
  • Non parite con i flame, c'è una pagina apposta per gli OffTopic.

-- AndreaSterbini - 11 Mar 2006

Edit | Attach | Watch | Print version | History: r280 < r279 < r278 < r277 < r276 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r280 - 2007-03-15 - StefanoGuerrini






 
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback