Domande (e risposte) sul Modulo 1
In questa pagina potete
porre domande sul
ModuloUno.
Vi prego di inserire un titolo che chiarisca che tipo di domanda state ponendo.
PARAMETRO: 2 FUNZIONE: int leggiFile(...)
Nelle specifiche del modulo, non vi è scritto nulla a proposito dell'argomento "dimensione"; la mia domanda è: la grandezza del buffer espressa appunto da "dimensione" è a nostra scelta o dobbiamo tener presente un range minimo prefissato?
-- Comment added by
DavidBenedetti on 20 Mar 2005
PARAMETRO: 2 FUNZIONE: int leggiFile(...)
Se ho capito bene, essendo "dimensione" la grandezza dell'email che stiamo tokenizzando, andrebbe calcolata nel main e poi passata alla funzione. Sempre se ho capito bene si intende
-- Comment added by
RiccardoVona on 21 Mar 2005
RiccardoVona - parametro 2
Giusto, ma il main non dobbiamo consegnarlo, quindi non è importante da dove esce fuori dim. noi possiamo anche inventarla e la funzione si deve preoccupare di gestire il caso in cui sia troppo piccola. Come viene calcolata credo sia un problema di sterbini...
-- Comment added by
GabrieleTarantino on 21 Mar 2005
RE: il parametro dimensione ... in tutte le funzioni
Per questo modulo ho scelto di evitare di farvi lavorare sulle variabili passate per riferimento, per cui l'allocazione della memoria necessaria ai buffer che comunicano le stringhe viene fatta fuori dalle funzioni, e alle funzioni si passa il buffer e le sue dimensioni in modo da non effettuare accessi alla memoria fuori dal buffer. Le funzioni alla peggio comunicano che il buffer è troppo piccolo per i dati che ci debbono copiare.
Come il buffer viene allocato e di quale dimensione sia non è un problema solo mio ... dovete implementare anche le funzioni di test e lì il buffer lo dovete allocare voi ...
-- Comment added by
AndreaSterbini on 21 Mar 2005
Q: Come trovo il secondo header (e i successivi)?
Quando sapete di che dimensioni è il primo header è facile trovare dove inizia il secondo ...
-- Comment added by
AndreaSterbini on 21 Mar 2005
cosa consegnare?
professore, ma ho capito bene? di ogni modulo noi dobbiamo consegnare SOLAMENTE i files moduloN.c e testModuloN.c, giusto? (ovviamente N è il numero del modulo)
la main è implementata da lei, giusto?
PS: che io sappia cmq i parametri non si possono passare by reference nell'ANSI C...
-- Comment added by
AlbertoLaRocca on 21 Mar 2005
dimensione del buffer
1 altra cosa :P
nella funzione leggiFile il parametro dimensione indica la dimensione
complessiva del buffer, incluso quindi anche lo spazio per il terminatore NULL, oppure la dimensione effettiva meno 1?
grazie
-- Comment added by
AlbertoLaRocca on 21 Mar 2005
Allocazione memoria
Per quanto riguarda i puntatori di memoria, come il parametro testo della leggiFile, li dobbiamo allocare noi o lo fà lei nel main??
-- Comment added by
TizianoFranchi on 21 Mar 2005
definizione codici di errore
sto facendo il mio modulo, ma lavorando mi sono accorto che in certi casi possono verificarsi anche più di un errore; in tal caso io sto definendo un ordine di priorità dei codici di errore dettato più che altro da buon senso, ma trovo che sarebbe meglio ridefinire i codici di errore come flag in modo tale da poterne settare più d'uno in una maschera, in questo modo:
#define RESULT_OK 0
#define UNKNOWN_ERROR 1
#define NULL_POINTER 2
#define EMPTY_STRING 4
#define FILE_MISSING 8
#define FILE_UNREADABLE 16
#define FILE_UNWRITABLE 32
#define FILE_EMPTY 64
#define BUFFER_TOO_SMALL 128
#define HEADER_NOT_FOUND 256
#define BODY_NOT_FOUND 512
#define BAD_HEADER 1024
#define MEM_ALLOC_ERROR 2048
#define LAST_CODE 4096
in tal modo si hanno a disposizione al massimo 32 codici di errore (se non penso che lei compili su un processore a 16 bit), che vanno più che bene dal momento che ne usiamo dolo 14 (quindi andrebbe bene anche se si compilasse a 16 bit :P )
-- Comment added by
AlbertoLaRocca on 21 Mar 2005
...
mi correggo: se consideriamo una maschera nulla come un RESULT_OK (come ho fatto sopra) ne usiamo solo 13
-- Comment added by
AlbertoLaRocca on 21 Mar 2005
RE: Dimensione del buffer da allocare
La dimensione è esattamente il numero di caratteri del buffer passato.
Quindi potete copiarvi (dimensione -1) caratteri visto che dovete sempre terminare il testo con '\0'
L'allocazione la faccio io nei miei test oppure voi nei vostri test.
-- Comment added by
AndreaSterbini on 21 Mar 2005
RE: Cosa consegnare?
La form di consegna vi permetterà di consegnare solo il testo di 2 files:
modulo1.c e
testModulo1.c, quindi:
- non modificate i file modulo1.h e testModulo1.h
-- Comment added by
AndreaSterbini on 21 Mar 2005
RE: definizione codici di errore
Preferisco non cambiare la definizione in corsa altrimenti nascono discussioni.
Propongo, in caso di errori multipli, di eseguire i tests NELL'ORDINE DATO DAI CODICI.
-- Comment added by
AndreaSterbini on 21 Mar 2005
STRINGA VUOTA
Mi scusi professore, potrebbe definire cosa intende per stringa vuota?
Mi spiego. Una stringa vuota, per come la intendo io, è una stringa di lunghezza pari a 0: ma lei intende stringa vuota anche una stringa, per esempio, contenente solo spazi e tabulazioni e senza ALCUN CARATTERE ALFANUMERICO???? GRAZIE!
-- Comment added by
DavidBenedetti on 21 Mar 2005
Linee di headers che non rispettano la giusta sintassi...
In quale caso, professore, una linea di un header non rispetta la giusta sintassi? Leggendo le specifiche mi sembra di aver capito che, se uno header si sviluppa su più linee, queste, dopo la prima, possono iniziare O con UNO SPAZIO oppure con UNA TABULAZIONE. Quando controllo che questa sintassi sia rispettata da ognuna di esse (se presenti), dovrò controllare che vi siano SOLTANTO ERRORI DI ECCESSO (spazi > 1 e/o tabulazioni > 1) oppure anche in difetto (spazi = 0 e/o tabulazioni = 0)? Per quanto riguarda quest'ultimo caso, tenderei a considerare una linea che inizia con un carattere (o una sequenza di essi) come l'inizio di un successivo header, ma se erro mi corregga! GRAZIE!
-- Comment added by
DavidBenedetti on 21 Mar 2005
Stringa vuota
Credo che "stringa vuota" intenda una stringa (""). Lo spazio e la tabulazione dovrebbero essere comunque considerati dei caratteri, quindi trattati normalmente. In fondo, posso anche scrivere una email dove nello header OBJECT ci metto 10 spazi ed una tabulazione.
Almeno questo è ciò che credo, se sbaglio smentitemi
-- Comment added by
RiccardoVona on 22 Mar 2005
Sempre sulla gestione degli errori : Apertura del File e relativi errori
Come appunto detto da
AlbertoLaRocca, durante l'apertura dei file si possono verificare più tipi di errori. Spulciando sul Deitel&Deitel e su internet, cercando sempre come argomento l'apertura di un file, ho trovato scritto che se ad esempio eseguiamo una
fopen in modo
r di un file, il puntatore ci tornerà NULL se il file non è leggibile OPPURE se è inesistente. Ed ecco il problema: visto che gli errori relativi ai file sono di 5 tipi trattati separatamente, come ci comportiamo di fronte all'esempio che ho riportato? Come facciamo a stabilire se il file non esista oppure se non è leggibile? Che tipo di errore facciamo ritornare?
-- Comment added by
RiccardoVona on 22 Mar 2005
Sempre sulla gestione degli errori : Apertura del File e relativi errori
Ops dimenticavo la risposta del professore, quindi aggiungo un altra domanda

: sempre nel caso specifico della fopen, secondo la sua risposta dovremmo far ritornare FILE_MISSING, anche se il file esiste ma non è scrivibile, giusto?
-- Comment added by
RiccardoVona on 22 Mar 2005
sempre sulla gestione degli errori: .......
il prof ha detto che se troviamo errori multipli gestiamo il primo nell'ordine in cui li ha dati lui. però in questo caso il problema è diverso,se è vero che il sistema operativo risponde nello stesso modo sia se non c'è il file sia se non può aprirlo, allora come faccio io a gestire due codici diversi?
la prego prof faccia luce su tutto questo...
-- Comment added by
GabrieleTarantino on 22 Mar 2005
RE: sempre sulla gestione degli errori: ......
Forse dovreste cercare di distinguere tra questi due tipi di problema:
- come distinguo i due errori della open?
- come controllo se il file esiste?
Ricordate che io vi ho chiesto di controllare i tipi di errore nell'ordine dato, e non di comunicare i vostri errori con i miei codici
RE: Stringa vuota
La stringa vuota si scrive "" ed è un puntatore ad un singolo carattere '\0'
-- Comment added by
AndreaSterbini on 22 Mar 2005
apertura files
a parte il fatto che il mio discorso degli errori era totalmente diverso, cmq ho spulciato un po' le librerie standard e da quanto mi risulta (potrei sbagliarmi) l'eventualità che il file non sia leggibile al momento dell'apertura non è contemplata: per questo motivo io avevo interpretato il significato dell'errore FILE_UNREADABLE in maniera leggermente diversa: il file è "illeggibile" quando è sintatticamente errato, non quando un'altra applicazione lo usa senza condividerlo; a giudicare dalla risposta del prof. però evidentemente mi sbagliavo, e suppongo che l'unica maniera per distinguere i due casi sia di riaprire il file senza richiedere nessun tipo di accesso: se anche la seconda chiamata a fopen fallisce, il file dovrebbe essere inesistente.
-- Comment added by
AlbertoLaRocca on 22 Mar 2005
per chi programma su Windows
ho provato (Windows 2000 Pro) a bloccare il file e ad aprirlo con fopen senza specificare nessuna modalità d'accesso, il tutto con il CRT di VC---++: a parte l'asserzione, fopen fallisce: non apre il file e ritorna NULL, quindi è impossibile determinare la causa dell'errore (usando le STL); non ne sono sicuro al 100%, ma il CRT di VC++ dovrebbe far parte del PSDK, e quindi la stessa implementazione dovrebbe trovarsi anche in Dev-C++ (è ANSI C, quindi può essere compilata anche dal
MinGW). non posso fare lo stesso esperimento su linux perché non so come si fa a bloccare un file; professore, non potrebbe dirci lei che funzione usare per trovare la causa dell'errore in apertura? grazie
-- Comment added by
AlbertoLaRocca on 22 Mar 2005
ah! sempre per chi programma su Windows...
è bene comunque che alla fine facciate sempre una prova su Linux
-- Comment added by
AlbertoLaRocca on 22 Mar 2005
Linee di headers che non rispettano la giusta sintassi...
In quale caso, professore, una linea di un header non rispetta la giusta sintassi? Leggendo le specifiche mi sembra di aver capito che, se uno header si sviluppa su più linee, queste, dopo la prima, possono iniziare O con UNO SPAZIO oppure con UNA TABULAZIONE. Quando controllo che questa sintassi sia rispettata da ognuna di esse (se presenti), dovrò controllare che vi siano SOLTANTO ERRORI DI ECCESSO (spazi > 1 e/o tabulazioni > 1) oppure anche in difetto (spazi = 0 e/o tabulazioni = 0)? Per quanto riguarda quest'ultimo caso, tenderei a considerare una linea che inizia con un carattere (o una sequenza di essi) come l'inizio di un successivo header, ma se erro mi corregga! GRAZIE!
-- Comment added by
DavidBenedetti on 22 Mar 2005
HEADERS FISSATI?
Nell'intestazione di un'email, professore, è SICURO il fatto che possiamo trovare i tre headers "From:" "To:" e "Subject:", oppure potremmo trovare anche header del tipo "Pippo:" "Pluto" e "Paperino" ???????????
-- Comment added by
DavidBenedetti on 22 Mar 2005
headers fissati o fissato con gli headers???
david, con quello che ti ho detto stamattina intendevo che IMHO non devi minimamente preoccuparti di quello che c'è scritto all'inizio dell'header e che devi riscrivere nella stringa "tipo": è ovvio che non ti arriverà mai una email con un header di tipo "pippo:", e anche se ti arrivasse tu come tipo devi scrivere "pippo:"! capito? :P cya'
PS: ma la domanda della sintassi degli headers non l'avevo già sentita...?!?
-- Comment added by
AlbertoLaRocca on 22 Mar 2005
...
dimenticavo: ovviamente secondo me devi fare così perché altrimenti dovresti fare
TROPPI controlli sulla sintassi dell'email, e non credo sia lo scopo del nostro lavoro, ne' di chi per lavoro debba realmente creare un filtro bayesiano: a noi interessa fondamentalmente calcolare la probabilità che un'email sia SPAM o HAM.
-- Comment added by
AlbertoLaRocca on 22 Mar 2005
...
un po' di buon senso insomma, David!!! :P
-- Comment added by
AlbertoLaRocca on 22 Mar 2005
OK, MA......
Ok, fin lì l'avevo capito (a parte IMHO ke devo ankora capire ke vuol dire), il fatto è ke, siccome esiste anke l'errore HEADER_NOT_FOUND pensavo di dover controllare anke ke ci fossero i 3 headers (o meglio, i loro "tipi" fondamentali) di una normale e-mail (e cioè "From:" "To:" e "Subject:")....penso ancora ke sia così...poi nn so.....
-- Comment added by
DavidBenedetti on 22 Mar 2005
RE: Sintassi degli headers
Come giudicate uno header come quello che segue?
: pippo
-- Comment added by
AndreaSterbini on 22 Mar 2005
RE: Controllo degli errori
Non è detto che tutti i codici di errore da me elencati siano sensati
-- Comment added by
AndreaSterbini on 22 Mar 2005
sintassi headers
david, IMHO è una sigla "internettese" che sta per "In My Humble Opinion", cioè vuol dire "secondo me" :P
prof. quel caso è uno dei pochi che il mio programma riconosce come sintatticamente errato perché manca la parte che precede i due punti.
-- Comment added by
AlbertoLaRocca on 23 Mar 2005
controllo degli errori
ma allora prof. noi che facciamo se non riusciamo ad aprire il file? restituiamo sempre FILE_MISSING? oppure FILE_UNREADABLE? stando all'ordine in cui i codici sono definiti dovremmo restituire sempre FILE_MISSING, no? e di FILE_UNREADABLE che ci facciamo? lo ritorniamo quando l'intero messaggio è sintatticamente illeggibile (come avevo inizialmente interpretato io)?
grazie.
-- Comment added by
AlbertoLaRocca on 23 Mar 2005
header ": pippo"
mi corrego: il mio programma considera valido l'header ": pippo"
il codice che ho scritto io infatti non fa altro che:
1) verificare la validità di tutti i parametri (come al solito)
2) cercare i due punti (":") all'interno della stringa
3) se i due punti non si trovano restituisce BAD_HEADER
4) se i due punti ci stanno, divide la stringa: tutto quello che c'è prima (compresi i due punti) viene copiato nella stringa "tipo"
5) la parte che segue i due punti viene ricopiata nella stringa "valore", ma prima viene opportunamente rielaborata: vengono tagliati tutti i leading/trailing blanks, cioè tutti gli spazi/tabulazioni/newlines che stanno subito dopo i due punti oppure alla fine.
ovviamente se il buffer tipo o il buffer valore sono troppo piccoli, il risultato è BUFFER_TOO_SMALL, altrimenti è RESULT_OK.
quindi nel caso dell'header ": pippo", il buffer tipo conterrà ":" e valore conterrà "pippo" (lo spazio che sta tra i due punti e la parola pippo viene tagliato).
-- Comment added by
AlbertoLaRocca on 23 Mar 2005
errori...
è possibile includere errno.h?
-- Comment added by
MarcelloLagana on 23 Mar 2005
Funzione estraiHeaders
Nella funzione estraiHeaders appare il parametro char* email
Questo parametro e' lo stesso che viene scritto (nella funzione leggiFile) in char* testo?
In altre parole i due parametri passati alle due funzioni char* testo e char* email sono la stessa cosa o si riferiscono a due cose diverse?
-- Comment added by
StefanoGiachetti on 23 Mar 2005
RE: controllo degli errori
E' possibile che un file esista ma non sia leggibile.
In tal caso si torna FILE_UNREADABLE.
-- Comment added by
AndreaSterbini on 23 Mar 2005
RE: header ": pippo"
Il progamma si comporta male: i duepunti sono OPZIONALI
Esiste un altro tipo di header sbagliato, che si può presentare se l'email inizia con uno spazio o un tab.
-- Comment added by
AndreaSterbini on 23 Mar 2005
RE: Files da includere e librerie da linkare
Potete includere qualsiasi file .h che volete, ma lo potete fare solo nel file "modulo1.c" o "testModulo1.c" e non nei corrispondenti .h
Se linkate librerie impreviste fatemelo sapere che ci penso.
-- Comment added by
AndreaSterbini on 23 Mar 2005
header ": pippo"
capisco; quindi per correggere il mio algoritmo è sufficiente modificare il passo 2: il prog. deve uscire dal ciclo quando trova i due punti oppure un blank, cioè uno spazio o una tabulazione; giusto? se la risposta fosse affermativa, secondo lei il ciclo dovrebbe terminare anche se incontrasse un newline?
grazie ancora.
-- Comment added by
AlbertoLaRocca on 23 Mar 2005
controllo degli errori
d'accordo, fin qua ci siamo, ma una volta che fopen mi ha restituito NULL, come faccio a capire se il file non esiste per niente, o se è semplicemente illeggibile al momento? le ripeto che ho cercato parecchio in varie documentazioni sulla STL che ho trovato in Internet, ma non riesco a trovare il modo (sarò scemo io...

)
-- Comment added by
AlbertoLaRocca on 23 Mar 2005
controllo degli errori
http://wwwwbs.cs.tu-berlin.de/user-taipan/kraxel/gnuinfo/libc/Reading_Attributes.html
Se ne parlava oggi a lezione
-- Comment added by
RiccardoVona on 23 Mar 2005
controllo degli errori
http://lgl.epfl.ch/w3lgl/cgi-bin/adaspec/sys_stat_h_.a:sys/stat.h:C_POSIX
Altre informazioni...chi vuole intendere intenda
-- Comment added by
RiccardoVona on 23 Mar 2005
controllo degli errori
PS: il secondo link è solo per avere una vaga idea di come è fatta la struct stat
-- Comment added by
RiccardoVona on 23 Mar 2005
Funzioni test: input su cui effettuare i test
Domandina (che mi sovviene solo ora che sto scrivendo il codice per le funzioni dei test).
Se ho capito bene, nelle nostre funzioni i parametri che vogliamo testare li "imponiamo" noi. Mettiamo il caso della funzione
test_leggiFile, con tipo_di_test uguale a RESULT_OK e argomento uguale a 0, dove noi siamo obbligati a passare alla funzione
leggiFile i tre paramentri corretti. Dobbiamo prendere come riferimento la sua mail? Oppure dobbiamo inserire i parametri tramite prompt? Mi spiego meglio: nel caso sopracitato io inizializzo i parametri in questo modo:
tnomefile = "email1.txt"
tdimensione = 351
ttesto = calloc(351, sizeof(char))
Se testiamo la funzione su Email1.txt nello specifico, tutti e tre i paramentri sono "corretti" quindi mi aspetto esito positivo dal test, ma se disgraziatamente non c'è nessun file Email1.txt il test da esito negativo...
Spero di essermi spiegato
-- Comment added by
RiccardoVona on 23 Mar 2005
Funzioni test: input su cui effettuare i test
Altra domandina sempre relativa alle problematiche delle funzioni test. Sto provando a bloccare l'accesso in lettura di un file (per la parte relativa al caso FILE_UNREADABLE), e purtroppo trovo delle difficoltà a capire il il meccanismo dei parametri st_mode della funzione chmod (include: sys/stats.h). Non è che qualche buon sammaritano può spiegarmi come fare? Grazie ^^
-- Comment added by
RiccardoVona on 23 Mar 2005
Funzione tokenizzaEmail
La funzione tokenizzaEmail dovrebbe inserire in un vettore di strutture Token i token ricavati dal buffer email. Siccome si dovrebbero utilizzare, per questo compito, le altre funzioni scritte precedentemente (che utilizzano parametri come dim, dimt, dimh) che valori passiamo per chiamarle dalla funzione tokenizzaEmail?
-- Comment added by
MassimilianoNatale on 23 Mar 2005
controllo degli errori sul file
Oggi a lezione è uscita fuori la funzione fstar(...), qualcuno è in grado di dirmi la sintassi (corretta)???che da quanto ho capito servirebbe per verificare se un file è leggibile, ect..!perchè non sono riuscito a trovarla ne sui manuali ne su internet..GRAZIE
-- Comment added by
TizianoFranchi on 23 Mar 2005
fstat
Dopo la discussione di oggi sull'utilizzo di fstat, posto come d'accordo la sintassi
int fstat(int fd, struct stat *buf), dove fd è il descrittore del file e *buf punta a struct stat che è così composta:
struct stat {
dev_t st_dev; /* device */
ino_t st_ino; /* inode */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device type (if inode device) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
bisognerà includere quindi le giuste librerie:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
-- Comment added by
AndreaFerraresi on 23 Mar 2005
fstat
Scusate la formattazione sono abituato a postare su forums php...
-- Comment added by
AndreaFerraresi on 23 Mar 2005
Sempre io..
Scusa se insisto..Da quello che ho capito per verificare se il file può essere letto basta vedere il valore di: buf->st_mode & S_IRUSR
Se è 0 tutto ok, altrimenti c'è l'errore, giusto??
-- Comment added by
TizianoFranchi on 23 Mar 2005
Errori
Gli errori rilevati dalle funzioni chiamate dalla tokenizzaEmail(...); rimangono interni a tale funzione e quindi li gestiamo noi oppure questa funzione li deve passare al main???
-- Comment added by
TizianoFranchi on 24 Mar 2005
fstat
siete sicuri che si chiami così? non è che tante volte si chiama "_fstat", cioè con un underscore iniziale? io non la trovavo perché ho cercato delle funzioni che iniziassero con la F...
-- Comment added by
AlbertoLaRocca on 24 Mar 2005
...
prof., ma per usare fstat bisogna includere l'header "sys/stat.h", che non compare nell'elenco delle librerie da lei specificato...
-- Comment added by
AlbertoLaRocca on 24 Mar 2005
...
un momento, ma è "stat", non "fstat"; sono due cose diverse, la seconda restituisce informazioni su files aperti, noi si suppone che la usiamo quando
non riusciamo ad aprire il file.
scusate la niubbaggine, ma 1) oggi a lezione non c'ero :P 2) conosco poco le STL :P
-- Comment added by
AlbertoLaRocca on 24 Mar 2005
...
un'altra cosa: quando dobbiamo riempire un Token (funzione "tokenizzaEmail"), chi è che alloca la memoria a cui puntano i due campi della struttura Token?
-- Comment added by
AlbertoLaRocca on 24 Mar 2005
funzione fstat
Per poter utilizzare la funzione fstat bisogna passargli, oltre ad un puntatore ad una struttura di tipo stat, il file descriptor restituito dalla funzione open (che restituisce -1 in caso di errore).
Nel caso che ci interessa, ossia il caso in cui l'apertura del file non vada a termine, la variabile errno viene settata ad hoc a seconda del tipo di errore generato. Gli errori che potrebbero interessarci:
EEXIST - Si è cercato di creare un file già esistente
EISDIR - Si è tentato l'accesso in scrittura su una directory.
Penso comunque che sarebbe preferibile una soluzione meno complicata di quella che usa le chiamate di sistema. Anche perchè si era detto che è possibile comunque programmare anche su altre piattaforme che non siano Linux.
Ps: Esiste anche una Macro grazie alla quale è possibile capire se si tratta di un file regolare ed un FLAG che ci permette di sapere se è un dispositivo a caratteri. La macro è S_ISREG(m), il flag S_IFCHR
-- Comment added by
MassimilianoNatale on 24 Mar 2005
Header...
Tra le posibilita' di header c'e' anche quella abbastanza "strano" con gli indirizzi ip. In quel caso come va trattato l'header (soprattutto in fase di stampa)? Esempio. Header: From Sterbini.di.uniroma1.it 151.100.400.23
Quando stampiamo dobbiamo stampare cosi': From:*From From:*Sterbini From:*di From:*uniroma1 From:*it From:*151 From:*100 From:*400 From:*23
E' giusta questa mia interpretazione?
-- Comment added by
StefanoGiachetti on 24 Mar 2005
Funzione tokenizzaEmail...
La funzione tokenizza e-mail contiene un parametro char* email.
Questo parametro cos'e'?
E' una stringa di 8 caratteri passatagli dal chiamante contenente il nome del file da aprire o e' una stringa di n caratteri contenente il testo della e-mail?
In questo secondo caso, cio' vuol dire che il parametro char* testo della leggiFile e' lo stesso della char* email e quindi la leggiFile deve essere chiamata dal main prima della tokenizzaEmail. E' tutto giusto cio' che dico?
-- Comment added by
StefanoGiachetti on 24 Mar 2005
fstat
ma a quali "chiamate di sistema" ti riferisci? fstat c'è anche nel CRT di VC---++ e non è una "chiamata di sistema"; inoltre fstat non la possiamo usare per capire il motivo per cui non riusciamo ad aprire un file perché fstat restituisce informazioni su un file
aperto... dobbiamo usare (da quanto ho capito) la funzione
stat, non
fstat.
-- Comment added by
AlbertoLaRocca on 24 Mar 2005
funzione tokenizzaEmail
-_-'
è perfettamente ovvio che il primo parametro punta al contenuto dell'email, non al nome del file...
PS: direi che prima di postare su questo forum bisognerebbe essere sicuri di non sapere la risposta a quello che si sta scrivendo, altrimenti si finisce per scrivere una marea di domande inutili alle quali il prof. dovrà rispondere per l'ennesima volta, mancando così di rispondere alle domande utili e costringendo gli utenti che le fanno a rifarle finché non capita che per caso le loro domande non siano state sommerse da spam (tanto per rimanere in tema, solo che purtroppo non possiamo applicare il filtro bayesiano al testo di questo forum...)
ribadisco la mia domanda, che ritengo utile perché dopo aver letto tutto il pdf del Modulo1, ancora non vi ho trovato risposta:
prof., chi è che alloca la memoria a cui puntano i due buffers della struttura Token? e chi la libera? se la alloca lei (o noi nei nostri test), come facciamo a conoscerne la dimensione?
grazie.
-- Comment added by
AlbertoLaRocca on 24 Mar 2005
funzione tokenizzaEmail
Mi dispiace di aver intasato questa sezione con delle domande inutili e ovvie, ma evidentemente per me non lo erano per niente, altrimenti non l'avrei messa. Per char* email poteva essere inteso anche il nome del file che contiene l'email e non solo la stringa contenente i caratteri prelevati dal file stesso e come e' evidente l'interpretazione in un modo o nell'altro varia un po' la sostanza delle cose soprattutto nell'utilizzo delle varie funzioni. Ora che cio' che e' ovvio e' stato chiarito posso passare a fare il programma.
Per i Token, credo che sia la funzione (main o altra) che chiama la Tokenizza e-mail che si occupa di allocare la memoria in quanto la tokenizzaEmail riceve l'array gia' creato.
-- Comment added by
StefanoGiachetti on 24 Mar 2005
funzione tokenizzaEmail
... ora si scopre che il parametro email conteneva il nome del file...

vabbè
ma scusa, se è il caller ad allocare memoria per i due campi della structtura Token, come facciamo noi a conoscerne la dimensione? la ignoriamo sperando di non incorrere in overflow e overrun sicuri?
-- Comment added by
AlbertoLaRocca on 24 Mar 2005
parseHeader(...,...,...);
volevo sapere, il parametro header di questa funzione è il parametro primo_header della funzione primoHreader()???
-- Comment added by
TizianoFranchi on 24 Mar 2005
funzione primaParola
il parametro testo di questa funzione lo calcoliamo noi nella tokanizzaEmail giusto????
-- Comment added by
TizianoFranchi on 24 Mar 2005
Senza titolo?
a lezione il prof ha detto che possiamo usare quella funzione in quanto dovremmo fare troppe prove per vedere se il file è scrivibileo meno etc....ergo ho deciso di postarne il funzionamento che cmq è adatto a quello che volgiamo fare non capisco cosa manchi che vorresti fare con stat......per quanto riguarda il problema della sintassi di fstat e di tutte le altre funzioni di solito le distro linux hanno le manpages quindi basta fare man funzione_desiderata se usate win beh.....adeguatevi!!!cmq grazie a riccardo vona per il post esauriente e scusate se il mio non lo è stato altrettanto ma ieri sera stavo lavorando e non ci ho perso molto tempo pardon
-- Comment added by
AndreaFerraresi on 24 Mar 2005
per quanto riguarda i test
io per i test avevo pensato di usare la funzione open con la flag O_CREAT per creare un file che abbia i permessi che dico io per poterlo testare......si può usare prof?
-- Comment added by
AndreaFerraresi on 24 Mar 2005
Sempre a riguardo di fstat
alberto...cmq fstat ti dice anche i permessi del file(gid e uid) e puoi ricavartelo da lì il motivo per il quale non te lo apre cmq l'fd si tira fuori dalla funzione open (pè capisse :-))
-- Comment added by
AndreaFerraresi on 24 Mar 2005
VARIABILI GLOBALI
Mi scusi professore, è possibile dichiarare variabili globali nei nostri files "modulo1.c"??? O è possbile che il suo sistema generi degli errori per questo? GRAZIE!
-- Comment added by
DavidBenedetti on 24 Mar 2005
Headers??????
per favore qualcuno mi dica come faccio esattamente a riconoscere un header non posso immaginare che sia una qualsiasi sequenza di caratteri prima del corpo dell'email!!!!
-- Comment added by
AndreaFerraresi on 24 Mar 2005
funzioni
volevo sapere se potevamo usare qualsiasi funzione o ci sono alcune ke non possiamno utilizzare?
-- Comment added by
DanielMba on 24 Mar 2005
Headers
Il blocco degli headers è separato dal testo da una linea bianca..ovvero che contiene solo il carattere '\n'..quindi basta che leggi l'email fino a quando non trovi due di questi caratteri uno dopo l'altro!!!la prima occorenza di questa seguenza delimita gli headers
-- Comment added by
TizianoFranchi on 24 Mar 2005
Funzioni di sistema
Si posoono usare funzioni di sistema come la fstat(o stat),cioè sostanzialmente,posso includere
librerie come unistd, sys/stat,sys/types ?
-- Comment added by
FabioFossati on 24 Mar 2005
Per il prof...
Senta se nella funzione tokenizzaEmail la dimensione dimT dell'array (Token) se non è sufficiente bisogna solo restituire BUFFER_TOO_SMALL o dobbiamo anche stampare gli elementi che fin'ora sono entrati?????
-- Comment added by
TizianoFranchi on 24 Mar 2005
test_leggiFile
Per testare la leggiFile quale nome di file dobbiamo passargli? Ho pensato che forse dovremmo far creare a test_leggiFile un file opportuno in base al tipo di test che dobbiamo eseguire. Ciò però creerebbe un po' di 'mondezza' quando eseguiamo il test. Cosa ne pensate?
-- Comment added by
GiovanniColombi on 24 Mar 2005
RE: il file esiste? (era: controllo degli errori)
Per controllare se il file esiste si usa
fstat (fate
man fstat e avrete il manuale).
-- Comment added by
AndreaSterbini on 24 Mar 2005
Risposte varie
RE: Header...
- lo header: From Sterbini.di.uniroma1.it 151.100.400.23 diventa:
From*Sterbini
From*di
From*uniroma1
From*it
From*151
From*100
From*400
From*23
RE: parseHeader
- ovviamente header può essere ricavato dal blocco di headers con la funzione primoHeader
- email contiene il testo letto dalla email
RE: chi alloca la memoria? e di che dimensione?
- la memoria viene allocata (e liberata) dalle funzioni di test
- che dimensione dare? immagino due soluzioni
- si alloca un blocco sensato e poi lo si allarga se si riceve l'errore BUFFER_TOO_SMALL
- oppure si alloca un blocco ragionevolmente grande (visto che sappiamo la dimensione della email)
RE: VARIABILI GLOBALI
- chi dichiara variabili globali lo boccio
RE: Funzioni di sistema
- usate le funzioni di sistema che volete
- gli #include metteteli nei files modulo1.c e testModulo1.c
- fatemi sapere che librerie devo linkare
ATTENZIONE: Gestione errori
- Quando una funzione incontra un errore questo viene tornato immediatamente
- lo stato dei buffer è indefinito
- una funzione che ne chiama un'altra e che riceve un codice di errore lo ritorna ed esce immediatamente
- anche in questo caso lo stato dei buffer è indefinito
RE: test_leggiFile
Qui sono possibili due metodi:
- diamo un nome standard al file (ma poi che contenuto ci mettiamo?)
- in questo caso suggerisco di usare la email di esempio allegata alla pagina ModuloUno
- oppure la test_leggiFile crea un suo file con contenuto e nome deciso da te così il test funziona ok
-- Comment added by
AndreaSterbini on 24 Mar 2005
RE: Altre risposte
RE: Funzioni test: input su cui effettuare i test
- Assumete che il file Mail1.txt che ho allegato ESISTA
- se volete createne altri (da programma) in modo da usarli nei test
ATTENZIONE: dimensioni minime di una parola
Mi deve essere sfuggito, comunque è meglio che lo specifico bene:
- una parola è composta da ALMENO 2 caratteri
-- Comment added by
AndreaSterbini on 25 Mar 2005
RE: chi alloca le stringhe dei Token?
Direi la funzione
tokenizzaEmail.
-- Comment added by
AndreaSterbini on 25 Mar 2005
O_______O'
ehm... due cose:
1) come fa la funzione tokenizzaEmail a conoscere la dimensione massima dei buffers puntati dai due campi di ogni struttura Token?
2)
non si possono usare variabili globali??? O_O perché??? cioè, io non le ho usate, ma se ne avessi avuto bisogno??? e posso definire delle macro (sempre in modulo1.c)? ho definito queste due macro:
#define MIN(a, b) (((a) <= (b)) ? (a) : (b))
#define MAX(a, b) (((a) >= (b)) ? (a) : (b))
-- Comment added by
AlbertoLaRocca on 25 Mar 2005
buffer dei Token
ah ecco, ho fatto la domanda proprio mentre lei rispondeva

:P
-- Comment added by
AlbertoLaRocca on 25 Mar 2005
e x quanto riguarda le macro? (mi scusi l'errore di formattazione, quel
"<br>"
in mezzo alle due macro voleva essere un'andatura a capo :P
-- Comment added by
AlbertoLaRocca on 25 Mar 2005
DOH! -_-'
ecco, adesso è un'andatura a capo...
-- Comment added by
AlbertoLaRocca on 25 Mar 2005
RE: Macro
Non ho problemi con le macro, però mettile nel file in cui le usi e incrocia le dita che io non abbia definito macro con lo stesso nome

.
-- Comment added by
AndreaSterbini on 25 Mar 2005
Spezzettamento Header...
Da quello che capisco, la funzione parseHeader identifica il tipo della riga header a lui passata, dopo che la funzione primoHeader ha preso tutto l'header e l'ha suddiviso appunto in righe.
Ma quale funzione si occupa di spezzettare la riga in ogni singolo pezzetto dell'header assegnandogli un tipo?
-- Comment added by
StefanoGiachetti on 25 Mar 2005
Spezzettamento Header...
Mi rispondo da solo...
La parse header riceve una riga di un header e la identifica restituendo il tipo e i caratteri di tutta la riga dello header. Lo spezzettamento viene fatto all'interno della tokenizzaEmail. E' giusto cosi', o sto prendendo una cantonata...?
-- Comment added by
StefanoGiachetti on 25 Mar 2005
Codici di Controllo...
E' possibile utilizzare i codici di errore anche come codici di controllo, per indicare cioe' al programma di fare una determinata operazione?
Il problema che si presenta e' il seguente: bisogna analizzare il corpo del messaggio e tramite la funzione primaParola inizio a scansire tutto il blocco di testo. Trovo la prima parola, e aggiorno il puntatore, trovo la seconda e aggiorno, trovo la terza e aggiorno, etc. etc. etc. Arrivo cosi' alla fine del blocco di testo. Questa fine e'indicata dal carattere di terminazione '\0'. Caso vuole che dopo l'ultima parola valida ci sia solo il '\0' e nessun carattere impuro. Quindi la funzione primaParola() riceve un puntatore al solo carattere '\0' e interpreta tutto cio' come stringa vuota restituendo il corrispettivo codice di errore. Che in questo caso indica la fine dell'elaborazione e non un errore vero e proprio visto che il corpo del testo e' stato processato e scomposto. Posso quindi utilizzare il codice di errore come codice di controllo ad indicare che e' finito questo passo dell'elaborazione?
Secondo una delle specifiche inserite piu' sopra c'e' scritto che appena si verifica un errore (qualsiasi sia) bisogna tornarlo subito al main(), ma allora come si fa a comunicare al chiamante (in questo caso la tokenizzaEmail) che il testo da analizzare e' stato scansito fino in fondo?
-- Comment added by
StefanoGiachetti on 25 Mar 2005
ancora macro
be', allora mi dica lei

ha per caso definito macro col nome "MIN" e "MAX" (tutto maiuscolo)? :P
PS: ma perché non si possono usare variabili globali? si tratta solo di cattiva pratica di programmazione o c'è anche qualche altro motivo specifico?
-- Comment added by
AlbertoLaRocca on 25 Mar 2005
test su RESULT_OK
Bisogna prevedere nelle funzioni di test un test su RESULT_OK? Se così è allora bisogna controllare anche che la funzione, oltre ad aver tornato RESULT_OK, abbia fatto bene il suo lavoro, cioè che nel buffer ci sia effettivamente ciò che ci aspettiamo. Giusto?
-- Comment added by
GiovanniColombi on 25 Mar 2005
Lezioni MS
Domanda per il Prof.
Per quale giorno sono fissate le lezioni sul microcodice Lego? Non dovremo mica aspettare il prossimo natale!?
-- Comment added by
FabioFossati on 25 Mar 2005
lezioni microcodice lego
aaaaahhhh, bene! questa ca##@ta mi ci voleva proprio!!!
-- Comment added by
AlbertoLaRocca on 25 Mar 2005
.c .h
Per il prof: da quanto ho capito(forse male)il main lo fa lei e verifica il nostro lavoro includendo nel suo main i nostri modulo1.h e testsModulo1.h; Se è così perchè dobbiamo consegnare i file .c non dovremmo consegnare i .h?
Scusate la banalità della domanda ma io sto agli inizi e queste cose non me le ha dette nessuno..
-- Comment added by
GianfrancoFonzini on 25 Mar 2005
.c .h
Ti spiego in maniera semplice (terra terra, usando anche terminologia scorretta)come funziona la cosa
I file .h sono chiamati Header, e contengono prototipi di funzione, definizione, e tutto quello che riguarda la parte dichiarativa di un programma C. Nel caso del progetto che stiamo facendo, questi file.h ce li ha passati il professore, e rappresentano una "base" da cui partire per fare i vari moduli, e non vanno modificati

Il lavoro che devi svolgere è scrivere i file .c, in cui includerai i file .h passati dal professore, ed è li che avrà forma il tuo programma.
Il professore non è che include i
nostri .h, perchè sono uguali per tutti :D, quello che in realtà farà è
linkare i nostri modulo1.c e testModulo1.c con il suo main.
In pratica un programma C può venire spezzettato in più file C, che alla fine verranno "uniti" in un file eseguibile. Ad esempio ho il mio programma che si chiama
StampaLettereAlfabeto.exe, il codice sorgente è raggruppato nei seguenti file:
- MainAlfabeto.c
- stampaA.c
- stampaB.c
- stampaC.c
- stampaD.c
...
...
- stampaZ.c
Capito?
-- Comment added by
RiccardoVona on 25 Mar 2005
...
Allora non è come dicevo io, e' assurdo ma non ho capito come si evolve questo progetto .. e' dato tutto per scontato..
Mi chiedo, sono io che devo sviluppare le funzioni sia di modulo1.c che delle funzioni di test a che mi servono i .h del prof?
-- Comment added by
GianfrancoFonzini on 25 Mar 2005
...
Annullo messaggio precedente ho capito!
-- Comment added by
GianfrancoFonzini on 25 Mar 2005
RE: altre risposte
RE: Spezzettamento Header...
la parseHeader esamina uno header (ottenuto con primoHeader) e torna tipo e valore.
Poi si usarà ripetutamente primaParola per tokenizzare il valore.
RE: Codici di Controllo...
Mi pare che quello che proponi renderebbe difficile distinguere errori dal funzionamento.
Suggerisco di far controllare le chiamate di livello più interno da parte delle funzioni di livello esterno (ad esempio tokenizzaEmail chiama ripetutamente primoHeader e smette quando vede che non avanzano headers da parsare)
RE: variabili globali
Ritengo che vadano usate solo ed esclusivamente per tabelle di dati o di tabelle di puntatori a funzioni.
Però creano spesso tanti di quei casini che non hai un'idea, per cui le si usa solo se strettamente necessario (ad esempio una callback che deve comunicare qualcosa all'applicazione ma che non ha nessun puntatore per farlo)
RE: test su RESULT_OK
Esatto
RE: lezioni microcodice lego
Se me lo regalate vi ci faccio il corso di architetture 2 l'anno prossimo
RE: funzionamento del progetto (era .h e .c)
Scusate se non vi ho fatto una lezione sulla costruzione di un progetto C formato da più files, volevo lanciare il primo modulo il prima possibile per darvi più tempo a disposizione.
Un progetto C può essere formato da tanti file, compilati separatamente e poi linkati assieme e con le librerie di sistema.
I files .h sono usati per dichiarare le funzioni, tipi e costanti da usarre nei diversi files .c
Io vi ho dato i files .h che definiscono esattamente quali funzioni dovete implementare e quali costanti vanno usate per i codici di ritorno.
Voi implementate le funzioni nei files .c ed io ne verifico il funzionamento corretto compilandoli e linkandoli con i miei test.
Inoltre farò un torneo in cui i vostri (e miei) test lavorano sul mio codice e sui codice degli altri studenti.
-- Comment added by
AndreaSterbini on 26 Mar 2005
ERRORI DIMENSIONI
Professore, io ho pensato di effettuare anche un controllo sui parametri di dimensione che entrano nelle funzioni (come 'dimensione', 'dimT', 'dimV', etc.) e mi chiedo quale possa essere il codice di ritorno delle funzioni se rilevano un errore su questi argomenti (come, ad esempio, che il loro valore sia negativo o nullo)...BUFFER_TO_SMALL?????????
-- Comment added by
DavidBenedetti on 26 Mar 2005
errori dimensioni
David, io quando ricevo una dimensione negativa restituisco MEM_ALLOC_ERROR, mentre quando la dimensione è zero non restituisco nessun errore, però è chiaro che la funzione a un certo punto si accorgerà che il buffer è troppo piccolo e restituirà BUFFER_TOO_SMALL; tuttavia prima di controllare il parametro della dimensione controllo sempre che il buffer sia un puntatore non nullo, altrimenti ritorno NULL_POINTER.
spero sia giusto come ho fatto io.
-- Comment added by
AlbertoLaRocca on 26 Mar 2005
variabili globali ok; e funzioni globali???
vabbè quindi diciamo che usare variabili globali in molti casi è una cattiva pratica di programmazione; e si possono usare invece delle
funzioni non definite nell'header, ma solo nei nostri due moduli? questo spero proprio di si, perché io ne ho definite alcune che ad esempio controllano la validità dei parametri; se non potessi definirle il mio codice diventerebbe
molto ridonante...
-- Comment added by
AlbertoLaRocca on 26 Mar 2005
primaParola()
qualcuno mi può dire se il parametro *testo della funzione primaParola() è l'intera email o solo il corpo dell'email.
ovvero se il corpo dell'email lo deve ricavare tokenizzaEmail() oppure se ne occupa primaParola()!!
-- Comment added by
TizianoFranchi on 26 Mar 2005
primoHeader()
la funzione primoHeader deve scrivere nel buffer anche il newline finale che conclude un header?
-- Comment added by
AlbertoLaRocca on 26 Mar 2005
Senza titolo?
no..i new-line e gli altri caratteri che non sono alfanumerici li devi prendere come separatori!!
-- Comment added by
TizianoFranchi on 26 Mar 2005
primaParola()
nella funzione tokenizzaEmail una volta ottenuta la prima parola del corpo dell'email dobbiamo ottenere le successive, ma come si fa a sapere la posizione iniziale della parola successiva?
-- Comment added by
AlbertoLaRocca on 26 Mar 2005
ancora newlines
ok, quindi secondo te primoHeader
non deve scrivere il newline finale, però la funzione estraiHeaders invece si! dal momento che esatriHeaders deve necessariamente prendere i newlines che stanno tra un header e l'altro, immagino che debba prendere anche quello finale dell'ultimo header ed escludere al più soltanto il newline della riga vuota che separa gli headers dal corpo, dico bene? io ho fatto così...
-- Comment added by
AlbertoLaRocca on 26 Mar 2005
new-line
esattamente..
-- Comment added by
TizianoFranchi on 26 Mar 2005
primaParola()
la posizione della seconda parola la trovi facilmente perchè nella funzione tokenizzaEmail() hai la dimensione della prima..io ho risolto togliendo dal testo la prima parola e passandogli alla funzione il testo - prima parola!!
-- Comment added by
TizianoFranchi on 26 Mar 2005
Robustezza
Quando una funzione incontra un errore questo viene tornato immediatamente. Ciò si riferisce ai codici di errore presenti in modulo1.h? Ovvero se qualche funzione di libreria fallisce (es. fclose() o stat()) basta tornare UNKNOWN_ERROR, giusto? Che grado di robustezza è richiesto? Si devono fare controlli su ogni chiamata, oppure si può assumere che certe funzioni di libreria non falliranno? Se durante i test da lei svolti una funzione di libreria fallisce (e quindi la mia funzione torna UNKNOWN_ERROR) il test è considerato fallito? Ho un certo interesse verso la correzione automatica e l'idea del "torneo" di programmi
-- Comment added by
GiovanniColombi on 26 Mar 2005
parametro delle funzioni test
Per il prof: nelle funzioni di test il parametro int n_argomento indica rispetto a quale argomento facciamo il test, partendo da 0 per il primo... ecco la domanda: non mi è chiaro, cosa vuol dire? 0 sta per cosa? Nell'esempio test_XXX se invece di 0 nell'argomento ci fosse stato 1 cosa sarebbe successo? Grazie
-- Comment added by
GianfrancoFonzini on 26 Mar 2005
PARAMETRO FUNZIONI TEST
Se, nell'esempio del professore, il parametro 'n_argomento' fosse stato 1 allora voleva dire che la funzione di test aveva fatto un controllo sul SECONDO argomento della funzione testata!
-- Comment added by
DavidBenedetti on 26 Mar 2005
FUNZIONE TEST
David, vuoi dire che avrebbe fatto un controllo sul SECONDO parametro?
Ad esempio nella funzione leggiFile lo avrebbe fatto sul parametro "dimensione"?
Attendo risposta grazie
-- Comment added by
GianfrancoFonzini on 26 Mar 2005
PARAMETRO FUNZIONI TEST
ESATTAMENTE GIANFRANCO!!!
-- Comment added by
DavidBenedetti on 26 Mar 2005
file.h
Vorrei sapere se i file dati dal prof devono rimanere tali e quali o comunque devono essere puliti da tutte quelle scritte
x*cosa
x*vorrei
x*per
x*natale
x*cosa
x*vorrei
x*per
x*natale
x*cosa
x*vorrei
x*per
x*natale
x*cosa
x*vorrei
x*per
x*natale
x*cosa
x*vorrei
x*per
x*natale
x*cosa
x*vorrei
x*per
x*natale
x*cosa
x*vorrei
x*per
x*natale
x*cosa
x*vorrei
......tipo mille volte!!!! una FIGATA PAZZESCA PRATICAMENTE!
SU LINUX FUNGE TUTTO PERFETTAMENTE!!!!
FATEVI DUE CONTI...
-- Comment added by
GabrieleTarantino on 26 Mar 2005
COMMENTI FILE .H e LIBRERIE SCONOSCIUTE DAL COMPILATORE
Professore, io sapevo che nell'ANSI C i commenti sono marcati dalla sequenza /* all'inizio e
/ alla fine. Lei ha utilizzato tutte sequenze // in modulo1.h, soltanto che il mio compilatore (gcc del Dev-c---++ su Windows XP sp2) mi da errore e non posso proprio compilare nulla. La mia domanda è: posso sostituire tutte le righe d commento da // a / ... */ in modulo1.h ????
Inoltre il mio compilatore (sempre quello!!!) non riconosce le librerie sys.h e stat.h che ho incluso per utilizzare la funzione stat()...come posso fare?
-- Comment added by
DavidBenedetti on 26 Mar 2005
primaParola()
Tiziano, scusa ma ancora non capisco come fare: prendi ad esempio la stringa seguente:
" parola1 parola2"
in questa stringa contenuta tra virgolette (quindi includendo anche i 9 spazi iniziali) la lunghezza di "parola1" è 7, ma la posizione iniziale di "parola2" non è 7... alla posizione 7 in quella stringa ci trovo uno spazio, e se chiamo di nuovo primaParola() passandogli il buffer---+ 7 lui mi restituisce ancora una volta "parola1"! che fo?
-- Comment added by
AlbertoLaRocca on 26 Mar 2005
x Gabriele Tarantino
prima di affermare che un intero sistema operativo (specie uno della mole di windows xp) abbia dei problemi solo perché un
tuo programmetto da un centinaio di righe non ci funziona, io userei un po' di cautela... vorresti mandarmi via email il tuo programma? scommetto che c'è un motivo specifico ben preciso per il quale non ti funziona...
-- Comment added by
AlbertoLaRocca on 26 Mar 2005
consegna
prof., la consegna dei files modulo1.c e testModulo1.c quand'è esattamente, il 6 o l'8 aprile? perché da una parte vedo scritto 6 e da un'altra 8...
-- Comment added by
AlbertoLaRocca on 26 Mar 2005
primaParola()
ehm, nella stringa che ho scritto prima contenente le due parole, i 9 spazi iniziali non sono venuti (mannaggia a TWiki

)
-- Comment added by
AlbertoLaRocca on 26 Mar 2005
i file del prof.
Prof, ho scaricato i file modulo1.h e testmodulo1.h da twiki(quelli in attachment)posso cancellare tutte queste scritte
o no? servono questi#ifndef TEST_MODULO_H e #endif.. grazie a chiunque vorra' rispondere
-- Comment added by
GianfrancoFonzini on 26 Mar 2005
i file del prof.
le uniche cose inutili presenti nei files del prof sono i commenti, il resto serve tutto.
-- Comment added by
AlbertoLaRocca on 26 Mar 2005
anzi,
servono pure i commenti
-- Comment added by
AlbertoLaRocca on 26 Mar 2005
RE; Altre risposte
RE: variabili globali ok; e funzioni globali???
ma certamente, ma non usarle nei tests (lì usa le funzioni definite in modulo1.h).
RE: parametro testo in primaParola()
primaParola serve per tokenizzare sia il corpo del messaggio che i vaslori degli headers
RE: newlines
direi di NON includere i newlines
RE: Robustezza
beh, non vorrei complicare le cose e verbalizzare solo 3 voti a giugno ...
Usate UNKNOWN_ERROR per tutti gli errori non previsti da altri codici
RE: files .h con commenti html
Salvali come testo e non come pagina HTML
RE: printTokens(...)
Hai ragione ... in tokenizzaEmail manca il modo di comunicare il numero di tokens inseriti nel vettore ....
La tua soluzione va bene.
RE: CONSIGLIO PER I WINDOWISTI
Usate Knoppix
RE: COMMENTI FILE .H e LIBRERIE SCONOSCIUTE DAL COMPILATORE
Cambia pure i commenti, io compilo con
gcc per cui mi funzionano
Prova con
http://www.cygwin.com
oppure Knoppix (in edicola)
RE: primaParola()
Mi sembra strano che ti dia di nuovo parola1.
I separatori all'inizio del buffer vanno ignorati ...
RE: consegna
il 6
-- Comment added by
AndreaSterbini on 27 Mar 2005
primaParola()
mi spiego meglio: io ho un buffer contenente la seguente stringa:
" parola1 parola2"
ora chiamo primaParola passandogli il buffer così com'è, e primaParola mi scrive "parola1" in un altro buffer; io ottengo la lunghezza di quest'altro buffer, che sarà 7 (p-a-r-o-l-a-1, escluso il terminatore NULL): a questo punto io voglio ottenere il token successivo, che è "parola2", e per farlo incremento il buffer iniziale di 7, lunghezza del primo token, perché secondo questo ragionamento io dovrei arrivare esattamente alla prima posizione che sta
dopo il primo token, ma questo è sbagliato, perché il numero 7 è la lunghezza dei caratteri alfanumerici del primo token, e quindi esclude i 9 spazi precedenti; se io chiamo nuovamente primaParola passandogli (buffer---+ 7) anziché buffer, lei alla posizione 7 becca uno dei primi nove spazi, e continua a girare finché non trova di nuovo il token parola1.
-- Comment added by
AlbertoLaRocca on 27 Mar 2005
uffaaaaaa
questi 9 spazi iniziali su TWiki non vengono mai
la mia stringa iniziale era:
"<9 spazi>parola1
parola2"
-- Comment added by AlbertoLaRocca on 27 Mar 2005
...
e ovviamente stavolta non è venuto lo "< spazio >" tra le due parole perché TWiki pensava che fosse un tag HTML... -_-'''
-- Comment added by AlbertoLaRocca on 27 Mar 2005
CARO ALBERTO....PRIMAPAROLA( )!
Alberto, il modo per far svolgere egregiamente il suo lavoro a primaParola l'ho trovato.....ed è anke abbastanza intuitivo....basta cmq ke lasci alcuni compiti a tokenizzaEmail, ke è poi la funzione ke la usa maggiormente...non mi dilungo troppo xké non vorrei ke poi il professore pensasse ke copiamo...cmq sai dove trovarmi!!!! CIAO!
-- Comment added by DavidBenedetti on 27 Mar 2005
ci sono tante di quelle primeParole qui che ormai saranno diventate almeno tredicesimeParole...
battuta ignobile
ok, allora il modo l'avrei trovato pure io, e sarebbe quello di far fare alla tokenizzaEmail una parte del lavoro che svolge la primaParola(), molto brutta come soluzione; in alternativa si potrebbe usare una variabile globale per contare il reale avanzamento sul buffer da esaminare, ma è meglio evitare le ire del prof...
-- Comment added by AlbertoLaRocca on 27 Mar 2005
printToken( )
Nonostante sia ragionevolmente sollevato dall'aver potuto contribuire a trovare una soluzione per un piccolo problema, mi sorge un piccolo dubbio professore.
Se, infatti, alloco un vettore di Token di 10000 posizioni e poi, per tokenizzare la mail, ne uso solamente 100, sarebbe una bella spesa computazionale quella che andrei ad affrontare, dovendo assegnare a tutte le restanti posizioni del vettore NULL ad entrambi i campi (anzi, più che altro una spesa inutile direi!)...Avrei pensato perciò ad una piccola variante (se a lei non crea problema): potrei eseguire questa operazione SOLO al token subito successivo all'ultimo utilizzato? O ciò potrebbe creare problemi? GRAZIE!
-- Comment added by DavidBenedetti on 27 Mar 2005
tredicesimeParole( )
Esatto Alberto....e cmq non mi sembra tanto pessima come implementazione, visto le specifiche delle due singole funzioni è anke normale ke sia così!!! CIAO!
-- Comment added by DavidBenedetti on 27 Mar 2005
linkare
Lo so che direte che sono scarso comunque vorrei sapere: io utilizzo un miofile.c esterno per verificare che modulo1.c (che a sua volta include modulol.h) funzioni. Quando vado a "compilare/eseguire"(con red hat) devo o no linkare modulo1.c? Basta solo gcc -g -o miofile miofile.c? Se devo linkare anche modulo1.c qualcuno puo' dirmi come si fa? Mi serve l'istruzione da promt Grazie a tutti e buona Pasqua
-- Comment added by GianfrancoFonzini on 27 Mar 2005
SOLUZIONE PER primaParola
non si possono fare variabili globali, e non si può arrivare alla tredicesima, la soluzione è dietro l'angolo...
il prof ha fatto notare che:
%(&%£$&PIPPO65(&%%/&
in questo testo io posso sapere quanto è grande la parola, ma non quante schifezze c'erano prima.
come fare in modo che la prossima volta che chiamo primaParola PIPPO65 non lo trovi (...o lo ignori)???
...vi faccio notare che il buffer non vi serve più, una volta memorizzata la parola...
-- Comment added by GabrieleTarantino on 27 Mar 2005
tokenizzaMail
nell'implementazione ho utilizzato per semplicità una sola variabile dim, per tutti i buffer. è accettabile una cosa del genere o è il caso che mi preoccupi di gestire la cosa in modo più intelligente?
-- Comment added by GabrieleTarantino on 27 Mar 2005
X Gabriele
No, mi stavo divertendo a vederli usare le variabili globali per fare una cosa cosi...
x tokenizzaEmail forse è il caso che cambi modo...secondo me
-- Comment added by AlessandroGrottoli on 27 Mar 2005
linkare
al compilatore devi passare la lista dei sorgenti, x es.:
gcc -o filtro main.c modulo1.c
dove si suppone che "main.c" sia il file contenente la tua main e "modulo1.c" contenga la tua implementazione del modulo 1; se poi x esempio hai anche un altro sorgente che si chiama "iosonounsorgente.c" allora il comando diventerà:
gcc -o filtro main.c modulo1.c iosonounsorgente.c
-- Comment added by AlbertoLaRocca on 27 Mar 2005
primaParola(), x Gabriele
aaaaaaahhhhhh ma certo!!! ho capito tutto!!! è perfettamente chiaro, collega!!! (effetto Pasqua...)
PS: sto ancora aspettando il tuo programma...
-- Comment added by AlbertoLaRocca on 27 Mar 2005
RE: Risposte
RE: primaParola()
Certamente è necessario che la funzione che chiama primaParola salti i separatori iniziali visto che primaParola non dice quanti sono.
RE: printToken( )
OK, basta azzerare i due campi del solo token che segue l'ultimo (se sono meno del numero di token nel vettore)
RE: tokenizzaMail
E' accettabile.
-- Comment added by AndreaSterbini on 27 Mar 2005
x alberto la rocca
Grazie Alberto LaRocca, il mio file si chiama proprio miofile.c dovrei fare dunque:
gcc -o miofile.c modulo1.c (miofile.c contiene la main)
E per eseguire?
-- Comment added by GianfrancoFonzini on 27 Mar 2005
no aspe'
hai scordato il nome dell'output; devi fare:
gcc -o filtro miofile.c modulo1.c
in questo caso ovviamente l'output si chiama "filtro", ma lo puoi chiamare come ti pare.
-- Comment added by AlbertoLaRocca on 27 Mar 2005
e x eseguire...
dalla shell scrivi: ./filtro
-- Comment added by AlbertoLaRocca on 27 Mar 2005
per alberto
Grazie per i suggerimenti, io mi sono affacciato da poco alla programmazione
e mi dispiace non poter ricambiare.
Ma come si fanno a sapere tutte queste cose? Non avremmo dovuto saperle da
programmazione 1? (forse non ero attento) ciao
quindi mi dispiace non poter ricambiare.
arrivo con questo progetto
-- Comment added by GianfrancoFonzini on 27 Mar 2005
in teoria si, dovevano insegnarvele a programmazione 1... cmq figurati, rispondo alle domande su TWiki in parte per fare un favore, ma in parte anche nel mio interesse, perché altrimenti le mie domande vengono sommerse da altre domande senza risposta e il prof. x rispondere a quelle non risponde alle mie... :P invece se aiuto il prof smaltisco 1 po' il traffico. :P
-- Comment added by AlbertoLaRocca on 27 Mar 2005
printToken( )
Grazie Professore!
-- Comment added by DavidBenedetti on 28 Mar 2005
Come verifica le funzioni
Prof, mi scusi vorrei sapere, lei testerà sia le funzioni di modulo1.c che quelle di testModulo1.c?
Penso di si.
Quindi praticamente Lei da promt inserisce il nome della funzione seguito dai parametri
di ingresso per quella funzione e attende l'output giusto?
Ovviamente tocca a noi verificare che l'input sia corretto.
Vorrei avere una conferma di quanto detto per simulare il funzionamento
del mio progetto.Grazie 1000
-- Comment added by GianfrancoFonzini on 28 Mar 2005
STRINGHE VUOTE....
Nell'implementare le funzioni di test professore, mi è sorto un dubbio.
Quando controllo che i 'controlli' sui buffer dove andranno copiati i dati elaborati dalle funzioni siano corretti,
considero di fatto anche il possibile errore EMPTY_STRING (la domanda vale anche per i controlli da effettuare DENTRO
le funzioni del modulo)?
Nel senso: sono d'accordo con il fatto che una funzione NON PUO' ricevere una stringa vuota come parametro da analizzare,
ma perché non potrebbe ricevere una stringa vuota sul buffer dove i dati andranno immessi?
D'altronde quella stringa si amplierebbe durante l'esecuzione della funzione, e tutto andrebbe bene
(a meno di un errore!)! GRAZIE!
-- Comment added by DavidBenedetti on 28 Mar 2005
STRINGHE VUOTE....
Il controllo sul buffer in cui scrivere non lo devi fare. Le zone di memoria cmq non si "ampliano". Bisogna distinguere le dimensioni di un vettore dal suo contenuto. Il vettore una volta allocato ha la dimensione che è stata appunto allocata. Una stringa vuota è semplicemente un vettore di char (grande x byte) che inizia con '\0'. A te non interessa cosa contiene il buffer, ma la sua dimensione.
-- Comment added by GiovanniColombi on 28 Mar 2005
Come verifica le funzioni
Ti conviene scriverti un main() che fa proprio questo.
-- Comment added by GiovanniColombi on 28 Mar 2005
DUNQUE.....
Grazie Giovanni per le tue precisazioni, ma intendevo proprio quello ke
tu hai eloquentemente esposto con l'espressione "ampliare le stringhe".
-- Comment added by DavidBenedetti on 28 Mar 2005
: pippo
Professore non ho ben capito, rileggendo le sue risposte, come considerare questo tipo di header:
penso sia errato (da quello che leggo nelle sue rispote), ma allora mi domando: dobbiamo anche
controllare che il TIPO di uno header abbia ALMENO un numero minimo di caratteri alfanumerici? GRAZIE!
-- Comment added by DavidBenedetti on 28 Mar 2005
NEWLINES O NON NEWLINES?????
Rileggendo sempre le sue risposte professore, mi è sorto un dubbio (come se ne avessi pochi
)...
La funzione estraiHeaders(...) copia NECESSARIAMENTE i caratteri di newline nel buffer...OK!
La funzione primoHeader(...) (da quello che leggo) NON deve copiare il carattere di newline...ma se
PER CASO un "modulo1" QUALUNQUE (ogni riferimento a fatti e persone realmente esistenti è PURAMENTE CASUALE!)
considerasse, in primoHeader(...), anche il carattere di newline finale di uno header (o NEWLINES finali di
ogni riga, ove questo si sviluppasse su più linee) elaborando COMUNQUE i dati in modo corretto, lei considererà
questo un errore, oppure no? GRAZIE!
-- Comment added by DavidBenedetti on 28 Mar 2005
RE: altre risposte
RE: Come verifica le funzioni
Penso di fare così (sto sviluppando il codice
):
- Compilo il vostro modulo1.c col mio testModulo1.c ed il mio main.c che provano tutte le combinazioni di:
- funzione, argomento, codice di errore
- memorizzo i risultati
- ricompilo con i test di un altro studente
- memorizzo i risultati dei test
- confronto i vostri risultati coi miei
- confronto anche i vostri test sulle mie implementazioni delle funzioni
Sarà una bolgia di dati da analizzare!!!
RE: STRINGHE VUOTE....
Il controllo EMPTY_STRING ha senso sui parametri in input,
mentre sui parametri in output ha più senso BUFFER_TOO_SMALL.
RE: ": pippo"
Questo header è di difficile interpretazione, potrebbe essere:
- un tipo vuoto seguito da duepunti (sintassi errata)
- un tipo formato solo dal duepunti
Anche nel secondo caso direi di considerare lo header errato
RE: NEWLINES O NON NEWLINES?????
Penso che considererò un errore il newline ALLA FINE DI UN HEADER tornato da primoHeader.
(i newline all'interno di uno header formato da linee multiple invece sono corretti)
-- Comment added by AndreaSterbini on 28 Mar 2005
NEWLINES (MI SCUSI!)
Ma se anche uno header è composto da più linee il newline finale non ci deve essere, giusto?
-- Comment added by DavidBenedetti on 28 Mar 2005
New Lines
Il buffer Headers deve terminare con "\n\0" mentre ogni header deve terminare con "\0" (a prescindere dal fatto che sia su una o più linee)...Giusto?
-- Comment added by AlessandroGrottoli on 28 Mar 2005
EH....INFATTI...
Mi stavo testé domandando codesto fatto Alessandro....ma penso che abbiamo capito bene (altrimenti mi sparo!)
-- Comment added by DavidBenedetti on 28 Mar 2005
Headers & newlines
Mi sembra di capire che un blocco di headers che inizia con spazio o tab sia irregolare. Se inizia con un newline? Se inizia con 2 (o---+) newlines? Una email del genere dovrebbe essere inaccettabile in quanto gli headers non possono essere identificati dalla prima occorrenza di 2 newlines. Il mio programma ritorna errore se l'email non contiene caratteri diversi da spazio o tab prima di 2 newlines (ammette quindi email che iniziano con un singolo newline). Va bene così?
-- Comment added by GiovanniColombi on 29 Mar 2005
HEADERS & NEWLINES
Mi sembra di aver capito di no Giovanni...
-- Comment added by DavidBenedetti on 29 Mar 2005
se l'email inizia con un newline vuol dire che gli headers non ci sono perché in un certo senso hai incontrato subito la riga vuota che dovrebbe separare gli headers dal corpo; quindi IMHO in tal caso devi restituire HEADER_NOT_FOUND
-- Comment added by AlbertoLaRocca on 29 Mar 2005
VALORE DEGLI HEADERS
Non ricordo se è stato discusso questo caso professore, ma se si dovesse avere uno header con tipo ma senza valore (per "senza valore" intendo alcun carattere alfanumerico presente dopo lo spazio del tipo) dobbiamo considerare quello header errato? GRAZIE!
-- Comment added by DavidBenedetti on 29 Mar 2005
Headers e newline
come al solito vediamo cosa dice il prof a riguardo ma per come ho fatto io i new line non ci sono mai! ne in headers o primo_header...
e non capisco quale sia il problema!
è chiaro che se un header è
From: andrea sterbini\n
SPAZIO 151.32.253.45\n
SPAZIO bla bla bla
il new line dopo l'indirizzo mail e l'ip viene preso, quello dopo bla bla bla no!
ma tanto poi gli a capo presi li toglierà prima parola!
le specifiche dovrebbero essere: un header comincia per forza con un carattere altrimenti è bad. sia con i due punti sia con lo spazio sia con a capo sia con quello che vi pare NON VA BENE!
e finisce quando trova una linea vuota.
invece la funz primo header esce quando trova un a capo sequito da un carattere.
e non prende \n.
x il prof la def di FILE_EMPTY è la stessa della stringa? cioè il primo carattere del file è EOF?
-- Comment added by GabrieleTarantino on 29 Mar 2005
HEADERS E NEWLINE
Si, Gabriele, dovrebbe essere così la definizione di FILE_EMPTY....o perlomeno io l'ho interpretata così!
-- Comment added by DavidBenedetti on 29 Mar 2005
ISALNUM(...)
Professore, è possibile che la funzione isalnum(...) riconosca il carattere "£" come il carattere "ù" ???
Glielo chiedo perché stavo facendo i test sulla funzione primaParola(...) (dove ho usato appunto questa
funzione) e ho scoperto che passandogli la stringa "%&%&£)$$£untestperprovareprimaProla12071983ght &/%(()"
mi copia nel buffer parola[] solamente la stringa "ù". Se però cancello il carattere "£" in tutte le sue occorrenze
prima dell'inizio della parola vera e propria, la copia avviene correttamente...
ora mi domando: può dare sempre questi problemi questa funzione? E dipende dai SO usati?
-- Comment added by DavidBenedetti on 29 Mar 2005
LETTERE ACCENTATE
Per CARATTERE ALFANUMERICO si intende anche un carattere accentato professore? Ad esempio: à, è, ì, ù devono essere intesi come separatori oppure no?
-- Comment added by DavidBenedetti on 29 Mar 2005
test_printTokens(...)
Professore, per effettuare i test su printTokens(...) come possiamo fare per verificare che, se si riceve un codice RESULT_OK, la funzione svolga carrettamente il suo lavoro?
D'altronde quello che fa la funzione è di stampare su stdout ciò che è stato precedentemente memorizzato in tokenArray[], e non possiamo avere alcun riscontro sulle operazioni
effettuate dalla funzione (a parte, appunto, il suo codice di ritorno). (Spero di essermi spiegato decentemente, perché comincio a non ricordarmi nemmeno più come mi kiamo
)GRAZIE!
-- Comment added by DavidBenedetti on 29 Mar 2005
[OT] impaginazione
scusi prof. lei che può editare direttamente questa pagina, non è che può fare in modo che la pagina del forum entri orizzontalmente in una sola schermata del browser (uso firefox su win2k)? non ce la faccio più a dover muovere la barra di scorrimento orizzontale ogni volta che leggo un messaggio...
-- Comment added by AlbertoLaRocca on 29 Mar 2005
impaginazione
mi associo...
-- Comment added by GabrieleTarantino on 30 Mar 2005
ancora sui codici di errore...
non credo di aver afferrato la differenza tra BAD_HEADER e HEADER_NOT_FOUND.
se il file comincia con SPAZIO o con qualcosa che non è un carattere quale errore è?
e poi BODY_NOT_FOUND è quando non trova parole valide, o quando dopo l'header c'è subito 'EOF', o magari nessuna delle 2?
-- Comment added by GabrieleTarantino on 30 Mar 2005
Senza titolo?
ditemi se è giusto: le funzioni di test ricevono il num del errore, e il num dell'argomento.
se un codice d'errore non ha senso con una funz es. FILE_UNREADABLE
in estraiHeaders, devo ritornare not valid per tutti gli argomenti.
se il codice d'errore ha a che fare con la funz ma non con l'argomento, idem con patate,
se aveva senso ma non avevo voglia di gestirlo, riporto NOT_IMPLEMENTED. è corretto?
ma se il codice centra con la funz, ma non è legato agli argomenti???
es. FILE_UNWRITABLE non è un errore che dipende dagli argomenti.
nelle specifiche il prof scrive che il codice d'errore ci indica come passare gli argomenti alla funz per fare il test,
ma in questo caso come faccio? Ammettiamo pure che io abbia la più pallida idea
di come creare un file non leggibile su LINUX (e non è così)
dovrei eseguire questo test ignorando il num dell'argomento??
lo stesso discorso vale se si considera RESULT_OK, va gestito con tutti gli argomenti?
quanti dubbi... AIUTO
ancora una cosa, ARG_MISSING serve solo se passo un num più alto del num di argomenti giusto?
in modo da poter usare due for nel main che fanno tutto?
-- Comment added by GabrieleTarantino on 30 Mar 2005
Possimo inserire librerie a piacere?
Volevo svolgere il progetto usando funzioni a basso livello, open, read, write, etc.
Poi per la gestione degli errori: pensavo al controllo sulla variabile errno, ma è inclusa in errno.h...
Insomma possiamo includere a piacere insomma?
Grazie
LucaLollobrigida
-- Comment added by LucaLollobrigida on 30 Mar 2005
Possimo inserire librerie a piacere?
Sorry per la sintassi: evidentemente ho scritto un po' troppo di fretta
Luca Lollobrigida
-- Comment added by LucaLollobrigida on 30 Mar 2005
RE: risposte
RE: ma devo usare fstat o stat?
fstat si usa su un file aperto, mentre stat no. Quindi e' meglio usare stat
RE: VALORE DEGLI HEADERS
Se lo header non ha valore allora tornate BAD_HEADER
RE: ISALNUM(...)
Potrebbe dipendere dal settaggio della lingua, prova a chiamare il programma scrivendo
LANG=C ./modulo1
oppure prova ad usare la funzione char *setlocale(int category, const char *locale)
per settare la lingua a "C"
RE: LETTERE ACCENTATE
Per semplicita' le lettere accentate le considero NON ALFANUMERICHE
RE: test_printTokens(...)
Io penso che ridirigerei stdout in un file o in un buffer per poi esaminare l'output contenuto nel file o nel buffer
RE: ancora sui codici di errore...
BAD_HEADER = la sintassi del singolo header e' sbagliata (p.es. tipo o valore mancanti)
HEADER_NOT_FOUND = il file inizia con una linea vuota
BODY_NOT_FOUND = dopo la linea vuota che separa headers dal body c'e' EOF
RE: errori non associati ad argomenti?
L'esempio che fai di FILE_UNWRITABLE io lo assocerei all'argomento nome di file.
RE: Possimo inserire librerie a piacere?
Potete inserire qualsiasi include che faccia parte delle librerie libc e libm.
Se avete bisogno di altre librerie me lo dovete far sapere.
-- Comment added by AndreaSterbini on 30 Mar 2005
Riguardo gli errori sulla "dimensione"
Se la "dimensione" in leggiFile o estraiHeaders non e' un intero positivo che errore devo riportare?
#define UNKNOWN_ERROR 1 // errore sconosciuto
#define EMPTY_STRING 3 // uno degli argomenti era una stringa vuota
#define BUFFER_TOO_SMALL 8 // il blocco di memoria non è sufficiente a contenere i dati
Grazie, buon lavoro a tutti
LucaLollobrigida
-- Comment added by LucaLollobrigida on 30 Mar 2005
Riguardo gli errori sulla "dimensione"
Direi BUFFER_TOO_SMALL
-- Comment added by AndreaSterbini on 30 Mar 2005
Come faccio i test di stampaHeaders?
Per mandare l'output di stdout an un file si può usare la funzione
FILE * freopen(char *path, char *mode, FILE *stream);
The freopen() function opens the file whose name is the string pointed to
by path and associates the stream pointed to by stream with it. The
original stream (if it exists) is always closed, even if freopen() fails.
The mode argument is used just as in the fopen function. The primary use
of the freopen() function is to change the file associated with a stan-
dard text stream (stderr, stdin, or stdout).
-- Comment added by AndreaSterbini on 30 Mar 2005
RE: [OT] impaginazione
L'impaginazione si allarga se ci sono righe troppo lunghe che il browser non può mandare a capo (ad esempio dentro un <pre> o un <verbatim>)
Quando usate <verbatim> dovete stare attenti a non incollare testo con righe troppo lunghe e con troppi tab (3 spazi valgono come un tab).
-- Comment added by AndreaSterbini on 30 Mar 2005
Fine Buffer Headers
Riguardo a quello di cui abbiamo parlato oggi in aula, possiamo
considerare che il buffer headers, contenente tutti header validi,
possa terminare con "\n\0" quindi \n indica la fine dell'ultimo
header e \0 indica la fine del buffer headers
-- Comment added by AlessandroGrottoli on 30 Mar 2005
ancora stat
per favore qualcuno mi risponda in maniera chiara perchè sta funzione m'ha rotto!!
allora una volta incluso le #include <...> e chiamato la funzione stat(...) sul file che m'interessa come faccio ad esempio a vedere se il file esiste??
-- Comment added by TizianoFranchi on 30 Mar 2005
STAT
DUNQUE! Per utilizzare la funzione STAT devi:
- includere la libreria stat.h
- dichiararti un'istanza della struttra 'struct stat' (ad esempio 'struct stat statusfile') all'interno della funzione leggiFile(...)
- chiamare la funzione in questo modo: stat(nomeFile, &statusfile)
- per verificare se il file esiste o meno basta che controlli il valore di ritorno (intero) della funzione: se è 0 il file C'E', altrimenti non esiste!!!
-- Comment added by DavidBenedetti on 30 Mar 2005
ancora stat
stat inserisce le informazioni sugli attributi del file in struct stat* buf. Se il file non esiste setta la variabile errno a ENOENT.
Cmq sta tutto in man fstat (compresa la define di struct stat).
-- Comment added by GiovanniColombi on 30 Mar 2005
AAAAHHHHHH........
Ma ti pare che su un mare di problemi che mi potevano capitare me ne ha dati la maggior parte quella maledetta di ISALNUM(...) ????!!!!
-- Comment added by DavidBenedetti on 30 Mar 2005
STAT
Leggo solo dopo aver già risposto.
Una sola precisazione: se stat torna -1 sai solo che ha fallito, non puoi essere sicuro che lo ha fatto perchè il file non esiste.
-- Comment added by GiovanniColombi on 30 Mar 2005
STAT: Ah, si è vero...
Cmq, anke se ha fallito senza sapere con precisione se il file esista o meno, se controllo la variabile errno che sia uguale a ENOENT che risolvo? A q
-- Comment added by DavidBenedetti on 30 Mar 2005
STAT: Ah, si è vero...
Cmq, anke se ha fallito senza sapere con precisione se il file esista o meno, se controllo la variabile errno che sia uguale a ENOENT che risolvo? Nel senso: se non è uguale a ENOENT che faccio? Che errore ritorno? A questo punto tanto vale che controllo solo il valore di ritorno della funzione e lo interpreto come dicevo, no?
-- Comment added by DavidBenedetti on 30 Mar 2005
AVVISI MULTIPLI DELLE FUNZIONI DI TEST???
Professore, quando eseguiamo i test su un argomento per RESULT_OK, lei ha detto che i test da effettuare sarebbero 2: per parametri il cui risultato E' RESULT_OK e per parametri il cui risultato NON E' RESULT_OK...Ora, nel caso peggiore che una funzione fallisca entrambi questi due test per RESULT_OK, la funzione di test corrispondente dovrà stampare ENTRAMBI gli avvisi di questi test, oppure solo quello del primo test che non va a buon fine? GRAZIE!!!
-- Comment added by DavidBenedetti on 30 Mar 2005
STAT: Ah, si è vero...
se(stat(...) != 0){
se errno == ENOENT torni FILE_MISSING
altrimenti torni UNKNOWN_ERROR
}
è abbastanza intuitivo
-- Comment added by GiovanniColombi on 30 Mar 2005
STAT: OK
Ok, grazie!
-- Comment added by DavidBenedetti on 30 Mar 2005
HEADERS_NOT_FOUND
quando si torna questo errore...?? da quello che ho capito se l'email inizia con uno spazio ' ' o con un '\n' bisogna restituire BAD_HEADER giusto??
-- Comment added by TizianoFranchi on 30 Mar 2005
1 chiarimento, sempre su Token
allora, abbiamo detto che è la funzione tokenizzaEmail ad allocare spazio per i campi contesto e parola della struttura Token, però sono le funzioni di test a liberarla, o cmq il caller di tokenizzaEmail, qualunque sia; ma il caller libera separatamente ciascun campo "contesto" di ciascuna struttura Token, quindi anche se noi ci accorgiamo che due tokens di un header hanno lo stesso contesto, non possiamo assolutamente far puntare il "contesto" di uno allo stesso buffer dell'altro, dobbiamo riallocare separatamente e ricopiare con strcpy, giusto? grazie.
-- Comment added by AlbertoLaRocca on 30 Mar 2005
Lettere accentate
questo tipo di carattere come lo devo interpretare...??? come un separatore o lo devo semplicemente togliere dal testo???
-- Comment added by TizianoFranchi on 30 Mar 2005
HEADERS_NOT_FOUND
se il file comincia con una riga vuota (1 singolo \n).
-- Comment added by GiovanniColombi on 30 Mar 2005
HEADER_NOT_FOUND
Se l'email inizia con un carattere di accapo devi restituire questo errore, e non BAD_HEADER poiché trovare un newline senza ALCUN carattere alfanumerico significa trovare ina stringa vuota, che è esattamente il separatore HEADER - BODY nella email.....se quindi trovi una riga all'inizio della email composta SOLO dal carattere di newline vuol dire che l'header nella email semplicemente non c'è!
-- Comment added by DavidBenedetti on 30 Mar 2005
Lettere accentate
non fanno parte delle parole, poichè NON sono alfanumeriche.
-- Comment added by GiovanniColombi on 30 Mar 2005
LETTERE ACCENTATE
Bisogna semplicemente interpretarle come separatori!
-- Comment added by DavidBenedetti on 30 Mar 2005
TOKEN
Io ho fatto così Alberto...poi nn so...!
-- Comment added by DavidBenedetti on 30 Mar 2005
dubbio sugli headers
non so se è stato già detto, forse mi ripeto, se è così me ne scuso :P
quello che volevo sapere è come dobbiamo considerare un header di questo tipo:
tipo<monnezza_strana>valore
cioè in pratica il tipo, seguito da qualche separatore che non siano i due punti, lo spazio o la tabulazione, ed infine il valore; per esempio:
Fromò}èò~à{òèÖòàà/&%/&$&%atomino85@gmailNOSPAM.com
è un header valido?
-- Comment added by AlbertoLaRocca on 30 Mar 2005
se la risposta è si, suppongo che tipo debba contenere "From" e valore "atomino85@gmailNOSPAM.com" giusto?
grazie.
-- Comment added by AlbertoLaRocca on 30 Mar 2005
DUBBIO SUGLI HEADERS
A quanto ne ho capito (e a quanto posso dedurre....e SPERARE!) non è uno header valido quello ke dici tu Alberto, anke xké è una sequenza di caratteri senza uno spazio, perciò il tipo sarebbe "Fromò}èò~à{òèÖòàà/&%/&$&%atomino85@gmailNOSPAM.com " e il valore vuoto....ecco lì ke ti esce l'errore BAD_HEADER......ehm.....GIUSTO PROFESSORE????????? (dica di si, la prego...!)
-- Comment added by DavidBenedetti on 30 Mar 2005
DU
-- Comment added by DavidBenedetti on 30 Mar 2005
DUBBIO SUGLI HEADERS
D'OH! Ho sbagliato....Cmq...se leggi le specifiche tra l'altro c'è scritto ke uno header inizia con una "sequenza di caratteri"....non specifica alfanumerici o meno!
-- Comment added by DavidBenedetti on 30 Mar 2005
Senza titolo?
RE: AVVISI MULTIPLI DELLE FUNZIONI DI TEST???
[ma perchè dovete strillare? credete che strillando vi sento meglio
]
Le funzioni di test che trovano un errore debbono tornare TEST_FAILED, stampare il messaggio di errore ed USCIRE immediatamente. Quindi di messaggi di spiegazione al massimo ne stampano uno solo.
RE: HEADERS_NOT_FOUND
L'errore esce ad esempio se l'email inizia con un accapo (ovvero con una riga vuota) per cui gli headers sono vuoti e c'e' solo il body.
RE: DUBBIO SUGLI HEADERS
Il separatore tra tipo e valore è lo spazio o il tab. L'esempio che hai fatto ha tipo uguale a tutta la monnezza e valore vuoto, per cui va tornato BAD_HEADER.
-- Comment added by AndreaSterbini on 30 Mar 2005
RE: 1 chiarimento, sempre su Token
Per favore NON copiate lo stesso puntatore nei campi contesto di più tokens, altrimenti diventa un casino deallocare il vettore di tokens.
Usate una copia nuova della stringa per ogni token.
-- Comment added by AndreaSterbini on 30 Mar 2005
OT
è David che strilla sempre, perché lui fa karate! pure quando parla, ogni tanto gli esce qualche YATTA' YAAAA DA-DA-DA-DA-DA-DA!!!!!
(veda la sua foto nella sua pagina personale :D)
-- Comment added by AlbertoLaRocca on 30 Mar 2005
Ehm...scusa...
Alberto, credo ke tu non abbia colto precisamente il senso di quello ke pratico con molta deidizione e impegno.....Non mi sembra di aver mai ridicolizzato ripetutamente ciò ke fai, o non fai...e tantomeno abbia mai sbandierato ai quattro venti cose ke ti riguardano...se cercassi di capire che come io rispetto te, mi aspetto lo stesso tuo comportamento nei miei confronti, mi faresti un grande piacere...GRAZIE!!!
-- Comment added by DavidBenedetti on 30 Mar 2005
[OT] David, imploro perdono
ma non te la sarai presa!!! stavo scherzando, non era mia intenzione ridicolizzarti!
magari la mia non è stata una bella trovata, ma mi fa ridere il fatto che usi sempre il caps lock e il prof. lo interpreta come delle strilla... :P
ma pensavo che ormai avessi capito dopo mesi di mie battutine che non è mia reale intenzione denigrare la nobile arte! :P
sappi che, nonostante quella che certe volte potrebbe essere l'apparenza, il mio rispetto per te rimane sempre pari al tuo per me (sono altre le persone che non ritengo degne del mio rispetto (quindi pensa a loro cosa faccio...
))
PS: ma perché usi sempre il caps lock? :P
-- Comment added by AlbertoLaRocca on 30 Mar 2005
OK!
Perché il titolo risalta di più! E se lo uso in un messaggio (oltre che nel suo header!) è per far risaltare alcune parole!
-- Comment added by DavidBenedetti on 31 Mar 2005
[OT] Belle le liti su TWIKI
NOOOOOO non dovete fare così...su siamo tutti colleg...hem..rivali in questo
esame non odiamoci!!!
X David...io ho iniziato ora a fare le funzioni di test "BASTARDE" ^_^ tanto
alla fine lo so che il mio modulo sarà l'unico a non passarle
-- Comment added by AlessandroGrottoli on 31 Mar 2005
associazione errori - argomenti
ah, io non capisco...
gli errori di FILE_MISSING FILE_UNWR FILE_UNREA FILE_EMPTY li devo associare al nome del file
il test su RESULT_OK o su UNKNOW_ERROR cosa centra con l'argomento? a quale arg li associo???
ma non sarebbe più facile se quando l'errore non riguarda uno degli argomenti si ignorasse ?
-- Comment added by GabrieleTarantino on 31 Mar 2005
X ALESSANDRO!
Ale, stavo pensando al discorso ke mi stavi facendo oggi riguardo ai test BASTARDI, come li hai kiamati (giustamente!) tu...ora, mi kiedo, come gestisci l'errore per il nome di un file superiore a MAX_NAME_LEN (o ki per lei)?...E cioè: come fai a stabilire se la funzione ke hai appena testato ha effettivamente fatto il controllo sulla lughezza del nome del file??? Pensaci!
-- Comment added by DavidBenedetti on 31 Mar 2005
[OT] X Alessandro...
Ma se ti dicessi come faccio che gusto ci sarebbe? Comunque non mi ha dato la
soddisfazione che credevo...c'è stat() che para il c#lo...quindi...però mi stò
divertendo troppo!!!!opz sono quasi le 2...meglio continuare a fare tests!!!
anche se il procio sotto overclock inizia a dare i numeri...non mi fà partire
più nemmeno "Ciao Mondo" perchè non vuole saperne più di C...bhe buona notte...
-- Comment added by AlessandroGrottoli on 31 Mar 2005
la funzione dim
vorrei sapere se la dimensione ce la da lei o dobbiamo calcolarla noi?
-- Comment added by DanielMba on 31 Mar 2005
Dimensioni buffer all'interno di altre funzioni
Quando una funzione (vedi tokenizzaMail) chiama altre funzioni che hanno come parametro anche la dimensione, cosa dobbiamo passare come dimensione di queste funzioni? (scusate le ripetizioni ma è il modo più semplice per farmi capire)
-- Comment added by MassimilianoNatale on 31 Mar 2005
Funzioni di test
Ma se in una funzione di test c'è un errore (esempio non può allocare memoria)
o altri errori vari cosa deve tornare?
-- Comment added by AlessandroGrottoli on 01 Apr 2005
RE: gli OT
Ma la smettete? siete simpatici ma occupate banda. Scusate ma
qua si fanno solo domande sul modulo 1
RE: associazione errori - argomenti
è importante sapere a quale argomento associare un errore perchè (abbiamo detto) i test vengono fatti in un certo ordine, e quindi per soddisfare il macchinario di test alcuni errori vanno testati prima di altri.
Per questo vi suggerisco di associare gli errori dei file al nome del file.
RE: errori nelle funzioni di test
Accidenti, a questo non avevo pensato ....
Per ora lasciate perdere ed incrociamo tutti le dita
-- Comment added by AndreaSterbini on 01 Apr 2005
RE: Dimensioni buffer all'interno di altre funzioni
Le dimensioni dei buffer vanno decise nelle funzioni in cui essi vengono allocati.
- tokenizzaEmail
- tutte le funzioni di test
RE: dim
dim non è una funzione ma un parametro (intaro) che fornisce alla funzione che devi implementare la dimensione della stringa in cui devi copiare i risultati.
Nel caso del vettore di tokens si tratta del numero di elementi del vettore.
-- Comment added by AndreaSterbini on 01 Apr 2005
domande varie
posso assumere che primoHeader effettui i controlli necessari sulla validità dell'header (così da evitare ulteriori check su parseHeader)?
è possibile escludere il test sul NULL_POINTER in almeno il primo argomento di primaParola?
in modo da poter passare il parametro NULL alla funzione strtok evitando molte complicazioni...
-- Comment added by MarcelloLagana on 01 Apr 2005
Pagina di consegna
Ho messo in linea la pagina di consegna
per il progetto.
RE: domande varie
è proprio parseHeader che sa la sintassi di uno header, le altre non ne sanno nulla.
[NB: avevo scritto primoHeader ma mi ero sbagliato]
il test NULL_POINTER su primaParola VA FATTO.
-- Comment added by AndreaSterbini on 01 Apr 2005
SINTASSI HEADERS
Professore, io, a intuito, ho fatto effettuare a parseHeader il controllo sulla sintassi di uno header, poiché primoHeader si preoccupa solamente di estrapolare il primo blocco che secondo lui fa parte di un singolo header (e quindi controlla se esso si sviluppa su più linee). Se poi all'interno dello header c'è qualcosa di errato (ad esempio: tipo\valore vuoto, inizio con un tab o con uno spazio, ecc) per quanto riguarda la sintassi, è parseHeader che lo sengnala............non so se ho ripetuto ciò che ha espresso lei, ma vittima di stanchezza\mal di testa non vorrei aver franinteso le sue specifiche......GRAZIE!
-- Comment added by DavidBenedetti on 01 Apr 2005
Per chi lo sà...
se il testo non è vuoto ma contiene solo caratteri non alfanumerici o parole più piccole di due caratteri come "e" "o" ecc la funzione primaParola e quindi la tokenizzaEmail cosa devono restituire????
-- Comment added by TizianoFranchi on 01 Apr 2005
ANCORA SULLA SINTASSI DEGLI HEADERS
Professore, tornando a casa ho riflettuto a lungo sulla questione esposta dal mio ultimo messaggio, e devo ammettere di essere rimasto un pò spiazzato dalla sua risposta riguardo primoHeader(...). Nelle sue specifiche, riguardo primoHeader(...), c'è scritto come riconoscere uno header: e fin qui sono d'accordo, anche perché la funzione deve sapere quando lo header finisce per terminare la sua estrazione. Ma perché deve segnalare errori di sintassi? Se fosse così, allora la funzione primoHeader(...), oltre all'operazione di estrazione di uno header dal blocco degli headers, farebbe anche l'operazione di parsing (analisi) dello header, e quindi che senso avrebbe parseHeader(...)? Non potrebbe a questo punto spezzarlo in tipo e valore proprio lei? Basandomi sulla mia modesta logica, ho assunto fin dall'inizio che fosse proprio parseHeader(...) (dal nome stesso 'analizza Header') a segnalare eventuali errori nella sintassi dello header passatogli come parametro dall'esterno; poiché lo analizza, controllando che la sua sintassi sia corretta, e lo spezzetta in tipo e valore...spero di essermi spiegato...GRAZIE!!!
-- Comment added by DavidBenedetti on 01 Apr 2005
Per chi lo sa...
parola = '\0' e torna RESULT_OK
-- Comment added by GiovanniColombi on 01 Apr 2005
Consegne multiple
Ogni consegna sovrascrive quella precedente?
-- Comment added by GiovanniColombi on 01 Apr 2005
...
vorrei sapere come può mai essere venuto in mente a chi ha scritto le STL di dare a una funzione un nome uguale al tag di una struct... ("stat")
-- Comment added by AlbertoLaRocca on 01 Apr 2005
header strano
prof. ma allora un header di questo tipo lo dobbiamo coniderare valido oppure no?
>tipo<monnezza_varia>valore<
dove "monnezza_varia" contiene caratteri alfanumerici che non siano i due punti, ne' spazi, ne' tabulazioni, ne' newlines; x es.:
From\|!"£$%&/()=?^atomino85@gmailNOSPAM.com
questo header deve essere considerato valido? il tipo è "From" e il valore "atomin85@gmailNOSPAM.com"?
grazie.
-- Comment added by AlbertoLaRocca on 01 Apr 2005
...
pardon, sopra ho sbagliato a scrivere la sintassi dell'header strano; la versione giusta è:
<tipo>monnezza_strana<valore>
grazie ancora.
-- Comment added by AlbertoLaRocca on 01 Apr 2005
Header strano
A quanto ne so Alberto, lo header ke dici tu è errato...!
-- Comment added by DavidBenedetti on 01 Apr 2005
Header strano
Bad header il campo tipo si estende fino a NOSPAM.com, il campo velore è vuoto
-- Comment added by AlessandroGrottoli on 01 Apr 2005
Ancora sulla sintassi degli Header
Secondo me ti si stà fondendo il cervello pianopiano
Quello che dici è sensato, ma pensa a questo: primoHeader() cerca uno header CORRETTO (inizio e fine) all'inizio di un buffer, quindi controlla la
sintassi... parseHeader riceve un HEADER quindi corretto e analizza qual'è il
campo e quale il valore...se ci sono...GIUSTO Prof?
-- Comment added by AlessandroGrottoli on 01 Apr 2005
header strano
no scusa, chi lo dice l'ordine in cui vengono chiamate le funzioni? è ovvio che alla fine di tutto il lavoro parseHeader verrà chiamata sempre dopo primoHeader, ma ad esempio nei test parseHeader la si potrebbe anche chiamare con parametri a buffo, quindi il fatto che riceva un header non implica che l'header sia corretto, perché non è detto che provenga direttamente da primoHeader; inoltre dipende anche dalle implementazioni di primoHeader: la mia ad esempio non fa controlli sulla sintassi, cerca solo un newline dopo il quale non ci siano spazi o tabulazioni (dopo il quale insomma inizia sicuramente un altro header); prof. non mi dica che ho sbagliato!!!
andiamo, i controlli sulla sintassi vanno fatti da parseHeader, non da primoHeader!!! sennò parseHeader che fa, si gira i pollici?!? (avevo pensato a 1 altra cosa da fargli fare, ma mi sono censurato...)
tornando all'header strano: io pensavo che quello fosse corretto perché tra il presunto tipo ed il presunto valore di fatto ci sono dei separatori (caratteri non alfanumerici), però diciamo che invece è sbagliato; quindi l'unico modo che ha parseHeader per capire quando finisce il tipo è cercare i due punti oppure uno spazio oppure una tabulazione, dico bene?
grazie.
PS: ma... e se trovasse un newline?!? O_____o'
-- Comment added by AlbertoLaRocca on 01 Apr 2005
piccolo OT x chi usa Windows
provate Open Watcom, è una favola!!!
magari comunque una prova di compilazione su Linux alla fine fatela sempre, ma il Dev-C---++ lasciatelo perdere, fa ASSOLUTAMENTE SCHIFO!!! se lo usate passate a OW! vabbè, magari siccome per fare il passaggio ci vuole 1 po', bisogna ambientarsi e abituarsi ad usarlo, se usate Dev-C++ e non volete magagne per questo lavoro di Laboratorio di Programmazione, finite con quello, ma poi passate al + presto al gioiellino: io ci sono appena passato, e credo che non tornerò mai più al Visual Studio, questo OW mi sta piacendo troppo! troppo potente!
profiler favoloso, debugger perfetto, compilatore ottimo, editor di immagini, editor di risorse, editor specifico a parte per le dialog, Spy e DDE Spy... vabbè, quest'ultima non serve a niente
secondo me il binomio Open Watcom e MSDN conferisce il potere assoluto su Windows!!!
-- Comment added by AlbertoLaRocca on 01 Apr 2005
Header strano
per la prima parte aspettiamo conferme dal Prof. perchè inizio ad avere anche
io dei dubbi(uffa ora che ero sicuro di aver finito modulo1.c..
)
Per quanto riguarda l'header di prima solo spazio o : separano il tipo dal
valore... guardati qualche tua email e vedi la giusta sintassi, in fin dei
conti, uniti i 4 moduli, non dovrà mica controllare caciotte sto programma
chi dovrebbe trovare un newline parseHeader()? se così fosse guardati la
definizione di "monnezza"!!!!
certo che poi dipende dai casi...potrebbe esserci un BAD_HEADER dietro l'angolo se fosse l'ultimo carattere dell'header
-- Comment added by AlessandroGrottoli on 01 Apr 2005
Estrazione del primo header
Senza l'uso di variabili globali (utilizzate come contatori o indici) come è
possibile conoscere la dimensione del primoHeader da estrarre dal testo headers?
In particolare non possiamo inserire nessun carattere limite (per riuscire a conoscere quando arrivati a fine header) dunque non ho in mente altre soluzioni se non la variabile globale. E' possibile evitare questa scelta, che non vorrei usare? Potrei mettere alla fine di ogni header un '\0', ma non so se questa scelta è consentita
-- Comment added by MassimilianoNatale on 02 Apr 2005
Senza titolo?
Non la devi conoscere...basta che ti fermi ad uno '\n' o ad un '\0'
-- Comment added by TizianoFranchi on 02 Apr 2005
Re: risposte
RE: SINTASSI HEADERS
Esatto, è parseHeaders che conosce la (semplice) sintassi di uno header.
[sopra ho sbagliato a scrivere ... ora lo correggo]
RE: Consegne multiple
Eatto, ogni consegna sovrascrive la precedente e quindi solo l'ultima vale.
RE: Estrazione del primo header
Non ho capito la domanda.
Il testo degli headers è limitato dal carattere '\0'.
Il primo header termina con un '\n' seguito da un carattere diverso da spazio o tab.
-- Comment added by AndreaSterbini on 02 Apr 2005
RE: header strano
Attenzione, i separatori servono per trovare le parole e non c'entrano nulla con la sintassi du uno header.
Il tipo è separato dal valore da uno spazio o tab
-- Comment added by AndreaSterbini on 02 Apr 2005
fiuuuu...
perfetto, ora è tutto chiaro, grazie prof.
-- Comment added by AlbertoLaRocca on 02 Apr 2005
test
alla funzione che testa leggiFile che nome dobbiamo mettergli al file da passare a leggiFile()????
-- Comment added by TizianoFranchi on 02 Apr 2005
e invece no, non era tutto chiaro...
ancora due cose! come si deve comportare la primoHeader nei seguenti 2 casi?
caso 1) subito dopo il tipo incontra un newline, quindi prima dei due punti di uno spazio o di una tabulazione
caso 2) tra il tipo e il valore ci sono solo i due punti, senza spazi ne' tabulazioni
-- Comment added by AlbertoLaRocca on 02 Apr 2005
pardon,
naturalmente volevo sapere come si comporta la parseHeader in quei due casi, non la primoHeader
-- Comment added by AlbertoLaRocca on 02 Apr 2005
e invece no, non era tutto chiaro... frown
IMHO:
1) BAD_HEADER perchè non c'è il valore
2) idem
-- Comment added by GiovanniColombi on 02 Apr 2005
tipi di header
per curiosità, ma i 2 header "From: blabla" e "From blabla" hanno lo stesso type o type diversi per via dei 2 punti?
-- Comment added by MarcelloLagana on 02 Apr 2005
ancora header strani...
tipi diversi per via dei due punti (IMHO!)
cmq, nel 1° caso mi sono spiegato male: quello che intendevo chiedere è come deve comportarsi la parseHeader se incontra nell'ordine le seguenti cose:
- una serie di caratteri alfanumerici (il presunto tipo)
- un newline
- uno spazio o tab
- un'altra serie di caratteri alfanumerici (il presunto valore)
l'header è valido? il presunto tipo di fatto è separato dal valore da uno spazio o tab, il quale fa si che l'header continui anche dopo il newline, ma è anche vero che tra il tipo e il newline non c'è nessuno spazio/tab/due punti...
-- Comment added by AlbertoLaRocca on 02 Apr 2005
alberto ma le leggi le risposte alle domande che fai?
ti è stato detto che i due punti sono FACOLTATIVI e che quando estrai l'header copi tutto! non solo i caratteri alfanumerici!! il tuo header from%)/&=(/&(/$&quellochevuoi.def è sbagliato perchè parse header distingue tra tipo e valore cercando un carattere SPAZIO, le schifezze vengono tolte dopo. perciò, visto che il tuo header non ha spazi, parse header riconosce tipo ...tutto... valore ..niente... e quindi esce perchè NON TROVA NESSUN VALORE!!!!! in altre parole ecco la risposta alla tua domanda: in entrambi i casi esce con BAD_HEADER
-- Comment added by GabrieleTarantino on 02 Apr 2005
+++odio i test!
nessuno mi ha ancora detto ha quale arg devo associare il test su RESULT_OK. e poi volevo chiedere anche: nel testmodulo1.c dobbiamo includere modulo1.c?
i test devono sempre essere in grado di generare l'errore?
cioè in altre parole per un errore tipo quello dei file, il test deve creare il file dargli i permessi necessari a fare il test e passarlo alla f ? (come si fa a impostare i permessi?)
ancora una cosa, ci sono alcuni controlli che possono essere svolti da più funzioni...
per esempio il controllo HEADER_NOT_FOUND per vedere se il file comincia con "a capo" lo posso far fare sia a tokenizzaMail che a estraiHeaders o anche a leggiFile quindi nei test quell'errore verrà gestito da una sola di queste funz. e nelle altre risulterà not valid, va bene così o la cosa può creare problemi in fase di correzione?
-- Comment added by GabrieleTarantino on 02 Apr 2005
-_-'
gabriele, ma le leggi le domande che faccio? -_-'
non sto più parlando del mio vecchio header from<schifezze>blablabla, ora sto parlando d'altro...
che succede se subito dopo il presunto tipo incontro un newline seguito da uno spazio e dal presunto valore? tipo questo:
From
atomino85@gmailNOSPAM.com
-- Comment added by AlbertoLaRocca on 02 Apr 2005
e ovviamente nell'esempio lo spazio dopo l'accapo non è venuto... -_-'
-- Comment added by AlbertoLaRocca on 02 Apr 2005
inclusione in testModulo1.c
la direttiva #include non deve mai essere usata con un sorgente, solo con un header! devi includere soltanto le librerie standard e "modulo1.h", anzi non devi includere nemmeno quello perché l'ha già incluso Sterbini in testModulo1.h
-- Comment added by AlbertoLaRocca on 02 Apr 2005
X Alberto
Secondo la definizione il tipo è "From\n" e il
valore "atomino85@gmailNOSPAM.com" poichè "secondo la definizione" il tipo
comprende anche caratteri non alfanumerici...
-- Comment added by AlessandroGrottoli on 02 Apr 2005
ANCORA
sintassi Header
Allora : la sintassi degli e di un singolo header la controlla unicamente
parseHeader() o anche estraiHeaders() e primoHeader()? E' giusto farla controllare a tutti e tre?
-- Comment added by AlessandroGrottoli on 02 Apr 2005
ANCORA sintassi Header
dalla risposta del prof. deduco solo parseHeader. Per rispondere anche ad altri quesiti simili, credo che certi controlli li facciano solo determinate funzioni, poichè stiamo cmq scrivendo un programma e non avrebbe molto senso fare controlli ripetuti su dati che sappiamo già essere corretti. Giusto prof.?
-- Comment added by GiovanniColombi on 02 Apr 2005
+++odio i test!
1) Non è importante su quale argomento vuoi controllare RESULT_OK perchè per ottenere RESULT_OK tutti gli argomenti devono essere validi.
2) Esatto ti devi fare i test sui file (vedi sopra che è spiegato).
-- Comment added by GiovanniColombi on 02 Apr 2005
Ancora estrazione del primo header
Praticamente quello che intendevo io era questo: io passo alla funzione primoHeader() il testo estratto dalla funzione estraiHeaders() che però mi estrae tutti gli headers dell'e.mail senza includere \n o \0. Dunque ho tutti gli headers attaccati l'uno all'altro senza la possibilità di poterli poi distinguere singolarmente.
-- Comment added by MassimilianoNatale on 02 Apr 2005
Ancora estrazione del primo header
estraiHeaders non fa questo, ma torna il contenuto della mail fino ai primi 2 newlines consecutivi che trova. Inoltre termina con '\n\0'(come stabilito alla fine della lezione di mercoledi). Per distinguerli basta che segui la risposta del prof. Se ho scritto idiozie correggetemi.
-- Comment added by GiovanniColombi on 02 Apr 2005
not include modulo1.c
ma se in test_modulo1.c non devo includere modulo1.c come faccio a chiamare le funzioni dal file dei test? le copio o cosa?
p.s. per alberto la rocca, oggi quando ho pubblicato quella risposta, non era aggiornata la pagina, e non ho visto che non era l'ultimo mex quello in cui chiedevi i 2 casi...
-- Comment added by GabrieleTarantino on 02 Apr 2005
Avevo interpretato male
Per quanto riguarda l'estrazione del primo headers pensavo che questa andava fatta dopo aver lanciato estraiheaders() sul buffer recuperato da questa funzione. Comunque farò estrarre alla funzione semplicemente il testo fino alle due linee consecutive. Grazie
-- Comment added by MassimilianoNatale on 02 Apr 2005
inclusione header
da testModulo1.c è lecito chiamare le funzioni da testare perché vengono incluse tramite testModulo1.h, il quale include modulo1.h, che è l'header dove esse sono dichiarate; modulo1.h non è incluso solo per conoscere i codici di errore, ma ovviamente anche i prototipi delle funzioni.
-- Comment added by AlbertoLaRocca on 02 Apr 2005
Risposte
RE: test (leggiFile)
Il file email1.txt siete sicuri di averlo, se vi servono altri file dovete crearli da programma.
RE: e invece no, non era tutto chiaro...
Ricorda che il separatore tra tipo e valore è spazio o tab. se non ci sono spazi o tab si ha BAD_HEADER. Il tipo è formato da caratteri QUALSIASI (anche non alfanumerici).
[farò una piccola modifica a questa specifica per il modulo 2]
Entrambi i casi dipendono se ci sono spazi o tab dopo.
caso 1) Se ci sono il '\n' va a finire nel tipo.
caso 2) Se ci sono i ':' finiscono in mezzo al tipo
RE: tipi di header
"From" e "From:" sono diversi. (chi ha mai detto di togliere i duepunti?)
RE: odio i test! (tests su RESULT_OK)
ATTENZIONE: associate i test su RESULT_OK al SOLO argomento 0 (zero). E' inutile ricopiarli per ogni argomento.
RE: HEADER_NOT_FOUND
dovrebbe essere generato solo dalla funzione che estrae gli headers.
RE: BODY_NOT_FOUND
dovrebbe essere generato solo dalla funzione che vuole estrarre il body.
RE: inclusione in testModulo1.c
includete, includete tutto, tanto i miei .h sono protetti dalla inclusione multipla.
RE: ANCORA sintassi Header
giusto
RE: not include modulo1.c
li compili e linki insieme:
- gcc -o tests testsModulo1.c modulo1.c
-- Comment added by AndreaSterbini on 03 Apr 2005
tokenizzaEmail & BUFFER_TOO_SMALL
Se una funzione torna a tokenizzaEmail BUFFER_TOO_SMALL, immagino si debba gestire l'errore e allocare memoria sufficiente (altrimenti si pianterebbe sempre, a meno di allocare kB di memoria). Io la sto implementando così, ma non so come gestire il ritorno di parseHeader. Come faccio a sapere se è dimt o dimv a essere troppo piccolo? Sarebbe sconveniente riallocarli tutti e due se uno va bene.
-- Comment added by GiovanniColombi on 03 Apr 2005
test su RESULT_OK
allora se alle funzioni di test viene richiesto un test su RESULT_OK, ma su un argomento diverso da 0, torniamo NOT_VALID?
-- Comment added by GiovanniColombi on 03 Apr 2005
Senza titolo?
lo so ma non si può avere tutto..io ho riallocato tutte e due
-- Comment added by TizianoFranchi on 03 Apr 2005
sui test
ma per i test generali, tipo:
- tutti quelli sui file;
- HEADER_NOT_FOUND;
- BODY_NOT_FOUND;
- BAD_HEADER.
il campo argomento che valore mi devo aspettare???????????
nel senso quand' è che devo restituire NOT_VALID??????????
io per ora ho messo che l'argomento manco lo guardo, però se qualcuno mi sà dire qualcosa...
-- Comment added by TizianoFranchi on 03 Apr 2005
Altra Domanda
se il corpo dell'email sono tutte parole di 1 carattere la funzione tokenizzaEmail deve restituire BODY_NOT_FOUND oppure richiamare printToken() e quindi stampare solo gli headers????????????
-- Comment added by TizianoFranchi on 03 Apr 2005
Body not Found
se fosse così, il body esiste, ma nel tokenArray[].contesto non ci metti niente perchè non sono parole (minimo 2 caratteri---+ \0) quindi si poi printToken() stamperà solo gli headers
-- Comment added by AlessandroGrottoli on 03 Apr 2005
allocazione memoria
io per evitare errori BUFFER_TOO_SMALL in tokenizzaEmail ho sempre allocato una quantità di memoria sicuramente sufficiente:
- per estraiHeaders alloco una quantità di memoria pari alla lunghezza dell'intera email
- ogni volta che chiamo primoHeaer alloco una quantità di memoria pari alla lunghezza del buffer contenente gli headers meno la lunghezza degli headers già estratti
- per parseHeader alloco (sia per il buffer del tipo sia per quello del valore) una quantità di memoria pari alla lunghezza dell'intero header
ovviamente ogni volta tengo anche conto dello spazio necessario per contenere il terminatore NULL.
a questo punto quindi è chiaro che una funzione non può mai ritornarmi BUFFER_TOO_SMALL, e se succede vuol dire che ho sbagliato qualcosa.
-- Comment added by AlbertoLaRocca on 03 Apr 2005
test FILE_UNREADABLE
prof., come si fa a testare l'errore FILE_UNREADABLE sulla funzione leggiFile? ho cercato qui sul forum, ma non mi pare che se ne sia parlato (se ho cercato male mi perdoni, il forum sta proliferando in una maniera mostruosa...). quello che non so fare è bloccare un file usando solo le librerie standard del C; che funzione devo usare? è sufficiente aprirlo prima di chiamare la leggiFile?
grazie.
-- Comment added by AlbertoLaRocca on 03 Apr 2005
altra domanda
io credo che se non trova nessuna parola... debba ritornare l'errore!
-- Comment added by GabrieleTarantino on 03 Apr 2005
macro
prof. il mio file testModulo1.c sta diventando di una confusione incredibile! sarebbe molto utile per me poter definire delle macro, quindi per esser sicuro che lei non ne abbia definite con nomi uguali, propongo di stabilire una qualche convenzione, ad es. che gli studenti possano definire solo macro il cui nome inizia con qualcosa di particolare, tipo un underscore, mentre lei definirà solo macro senza underscore iniziale, oppure con un underscore doppio. che ne pensa?
-- Comment added by AlbertoLaRocca on 03 Apr 2005
EMPTY_STRING e FILE_EMPTY
2 domande su questi 2 errori:
1) nei parametri in cui la stringa contiene il contenuto dell'intero file, questi due errori sono esattamente la stessa cosa e possono essere restituiti indifferentemente? (io cmq FILE_EMPTY lo restituisco solo dalla leggiFile; EMPTY_STRING lo restituisco da tutte le altre e solo se necessario)
2) quando nella funzione estraiHeaders testiamo i parametri, il test per EMPTY_STRING (o FILE_EMPTY che sia) del parametro email deve essere fatto prima o dopo i test degli altri due parametri? e il test per HEADER_NOT_FOUND?
per porre la mia seconda domanda in maniera più precisa: ciò che va testato nell'ordine in cui sono definiti i parametri è la loro validità "spicciola" (puntatori nulli e dimensioni negative) oppure anche altre condizioni un attimino più "sofisticate", come ad esempio appunto il caso di stringa vuota o stringa che inizia col newline (e quindi headers assenti)?
-- Comment added by AlbertoLaRocca on 03 Apr 2005
uso static
Salve prof è lecito usare "static" delle nostre funzioni?
Dato che non possiamo tornare nulla sarebbe di grande aiuto!
-- Comment added by Users.691942 on 03 Apr 2005
precisazione, sempre sulla mia seconda domanda
le facevo questa domanda prof, perché io ritengo utile testare prima tutte le condizioni più "spiccole", cioè validità dei puntatori e delle dimensioni, e poi, in caso di test completamente positivi, eseguire il resto del lavoro, altrimenti le funzioni in certe condizioni potrebbero iniziare a svolgere il loro lavoro (potenzialmente costoso in termini computazionali) e perdere tempo per poi scoprire ad esempio che il puntatore al buffer dove devono scrivere il risultato è nullo...
-- Comment added by AlbertoLaRocca on 03 Apr 2005
uso di static
immagino che il prof ti bocci come se avessi usato variabili globali :P
penso che quando il prof. parla di "infinità di problemi legati alle variabili globali" si riferisca alla loro protezione nel multithreading e da possibili deadlock che ne potrebbero derivare in caso di errore... tutti questi problemi riguardano anche le variabili locali statiche.
-- Comment added by AlbertoLaRocca on 03 Apr 2005
Chiarezza sulla sintassi di un header
Vorrei sapere con chiarezza la giusta sintassi di un header. Esattamente volevo sapere se la funzione primoHeader, nella stringa primo_header mette prima del carattere terminatore, cioè, '\0', il carattere newline, cioè, '\n'.
primo_header = "From 127.0.0.1\n\0" Giusto?
-- Comment added by MarcoEsposito on 03 Apr 2005
Utilizzo funzione "PrimaParola"
Ciao,volevo sapere dato che la funzione "parseHeader" torna come risultato il tipo e il valore Es."andreasterbini@miosito.it" per spezzettare il valore ovvero togliere i caratteri alfanumerici devo usare la funzione "primaparola"?????giusto???
-- Comment added by Users.691942 on 03 Apr 2005
Dubbi dubbi dubbi...
Dalla stampa di esempio della funzione printTockens sembra che in tokenizza per leggere le parole si debba usare la funzione primaParola, mentre per il contesto (per non perdere i ':') si debba fare un'altra funzione che si fermi semplicemente al primo spazio. Oppure sono io che ho sbagliato la mia funzione primaParola?? Mmm...
Altra domanda: si possono creare file di appoggio?
Sorry per eventuali errori d dgtazione, inizio ad essere stanco
Luca Lollobrigida
-- Comment added by LucaLollobrigida on 03 Apr 2005
ParseHeader: caso BUFFER_TOO_SMALL
Se nelle altre funzioni, quando ci trovavamo di fronte una stringa più grande dello spazio allocato per contenerla, anche se incomplete dovevamo copiare tutti i caratteri che entravano e restituire l'errore BUFFER_TOO_SMALL. Questo discorso vale anche per la ParseHeader? Me lo chiedo perchè non è specificato nel pdf del modulo1, quindi non so se è una dimenticanza oppure è voluto
-- Comment added by RiccardoVona on 03 Apr 2005
Risposte
RE: test su RESULT_OK
io ci metto NOT_IMPLEMENTED
RE: tokenizzaEmail & BUFFER_TOO_SMALL
dipende da come la implementi.
- se gestisci l'errore e ritenti allora non devi propagare l'errore
- se non gestisci l'errore lo propaghi e basta
RE: sui test
i test generali conviene assegnarli all'argomento 0 (che poi è il dato in input che viene esaminato)
RE: Altra Domanda
il codice BODY_NOT_FOUND viene solo se l'unica riga vuota è seguita da EOF o se non c'e' riga vuota.
RE: test FILE_UNREADABLE
Potresti creare un file e poi aprirlo in modo esclusivo oppure togliere i diritti di scrittura.
NOTA: Per semplificarvi la vita assumete che esistano 3 nomi di file standard:
- file-empty che non contine nulla
- file-unreadable di cui non avete diritti di scrittura
- file-missing che non è presente
RE: macro
Definite macro che iniziano con le vostre iniziali o con il vostro nome e cognome.
RE: EMPTY_STRING e FILE_EMPTY
Il primo riguarda un argomento stringa, il secondo un argomento file(name).
RE: uso static
Perchè? Non serve ...
RE: Chiarezza sulla sintassi di un header
primoHeader elimina il '\n' finale (ma non quelli interni agli header multilinea)
RE: Utilizzo funzione "PrimaParola"
primaParola viene usata da tokenizzaEmail sia per spezzettare in parole i valori degli headers che il body dell'email (mi sa che non hai letto il file delle specifiche
)
RE: Dubbi dubbi dubbi...
chi ha mai detto che il tipo sia di soli caratteri alfanumerici?
Se possibile non create file di appoggio (avrete a diaposizione i files email1.txt, file-unreadable, file-empty ed il famigerato
file-missing)
-- Comment added by AndreaSterbini on 03 Apr 2005
RE: parseHeader?: caso BUFFER_TOO_SMALL
certo ... questo è un errore che dovrebbe venir fuori da tutte le funzioni che riempiono un buffer di dati (tutte).
-- Comment added by AndreaSterbini on 03 Apr 2005
EMPTY_STRING e FILE_EMPTY
prof., e la mia seconda domanda?
x me e' importante saperlo!
-- Comment added by AlbertoLaRocca on 03 Apr 2005
FILE_EMPTY
ma questo codice di errore deve essere restituito se è vuoto il nome del file da aprire o se è vuoto il contenuto? perché nel secondo caso ci sarebbero alcune situazioni in cui l'errore coincide esattamente con EMPTY_STRING (x es. il parametro email della funzione estraHeaders)
cmq legga anche la mia seconda domanda e relativa precisazione plz thx :P
-- Comment added by AlbertoLaRocca on 03 Apr 2005
fiuuuu...
ragazzi, adesso si che si ragiona! ho inserito delle macro e ho ridotto il file testModulo1.c di qualcosa come il 60-70 percento... io non sono il tipo che va a cercare apposta la compressione e l'ottimizzazione estrema anche quando è inutile, come fanno alcuni (a parte il fatto che ridurre il numero di linee di codice non sempre ottimizza il programma finale), ma adesso ci vedo molto meglio!
-- Comment added by AlbertoLaRocca on 03 Apr 2005
FILE_EMPTY
Io lo uso solo in leggiFile (dato che è l'unica che manipola files). Ha senso solo se indica che il file è vuoto. Se il nome del file è una stringa vuota torno EMPTY_STRING invece.
-- Comment added by GiovanniColombi on 03 Apr 2005
Sulle funzioni di test
Mi è poco chiara l'implementazione delle funzioni di test. Nel pdf allegato al modulo 1 si dice che una funzione di nome test_XXX che riceve come coppia di valori "tipo di test" = NULL_POINTER, argomento = 0 deve controllare se la funzione XXX ritorna NULL_POINTER se gli viene passato NULL come primo argomento. Ma perchè NULL? Che sia il primo argomento è chiaro (visto lo 0) così come anche il risultato che la funzione dovrebbe restituire. Ma sto NULL da dove spunta fuori? Ringrazio in anticipo
-- Comment added by MassimilianoNatale on 03 Apr 2005
FILE_EMPTY
d'accordo Giovanni, ho fatto anche io così, ma secondo te sarebbe lecito restituire FILE_EMPTY dalla funzione estraiHeaders se il parametro email contenesse una stringa vuota? te lo chiedo perché devo sapere cosa posso accettare quando faccio i test e cosa non posso accettare, altrimenti sparo errori a zona erogena di canide...
-- Comment added by AlbertoLaRocca on 04 Apr 2005
Sulle funzioni di test
quello è un esempio molto specifico: in quel caso devi passare NULL al primo parametro perché sarebbe l'unico caso teorico in cui sarebbe accettabile che la funzione restituisse il codice NULL_POINTER.
ma in realtà in altri casi non te li dice nessuno i parametri che devi passare alla funzione per eseguire il test, te li devi inventare tu, e te li devi inventare in maniera tale che siano ingannevoli, cioè in maniera tale che una funzione scritta male abbia buone probabilità di restituire un codice di errore che non c'entra una zona erogena (non necessariamente di canide stavolta).
-- Comment added by AlbertoLaRocca on 04 Apr 2005
Ancora sulle funzioni di test
Effettivamente il corretto funzionamento di queste funzioni di test mi è poco chiaro (non avendo potuto seguire le lezioni di laboratorio e dovendomi attenere unicamente al pdf del prof)
-- Comment added by MassimilianoNatale on 04 Apr 2005
FILE_EMPTY
Alberto estraiHeaders non mette le mani sui file quindi perchè dovrebbe ritornare un errore di file vuoto?
-- Comment added by AlessandroGrottoli on 04 Apr 2005
delirio test
Se ho capito bene (e ne dubito): io faccio il controllo sul valore tipo_di_test e a seconda del valore di questo passo dei dati per far in modo che la funzione ritorno REALMENTE quel valore?
2a) Domanda: che senso avere poi effettuare il test su un argomento di tipo dimensione?
-- Comment added by MassimilianoNatale on 04 Apr 2005
FILE_EMPTY
Secondo me no perchè l'argomento è un buffer e non il nome di un file. Considero anche il fatto che il prof. ha detto che non tutti i codici hanno necessariamente un senso. Io preferisco andarci cauto e far ritornare solo i codici sui quali sono sicuro, al massimo non arriverò primo al torneo!
-- Comment added by GiovanniColombi on 04 Apr 2005
delirio test
1) si, in base a tipo_di_test e n_argomento devi chiamare la funzione, passargli degli argomenti sensati (considerando appunto che devi cercare di 'smascherare' le funzioni errate) e poi vedere se il valore di ritorno è quello che ti aspettavi (se passi un puntatore NULL ti aspetti che una funzione corretta ti torni l'errore NULL_POINTER). Vedi altri post per casi particolari tipo il RESULT_OK.
2) Il test sulla dimensione lo devi associare al parametro int. Ha senso controllare se il buffer in cui devi scrivere è abbastanza capiente per contenere dimensione - 1 caratteri (ricorda che alla fine devi metterci lo '\0'). Devi pure controllare che la dimensione sia >= 0.
di questo non posso dirti perchè devo ancora finire il mio
-- Comment added by GiovanniColombi on 04 Apr 2005
Argomenti passati alla funzione: email e headers
Quando ad esempio richiamiamo le funzione estraiHeaders e primoHeader, quando finisce l'esecuzione il valore dei due argomenti passati deve cambiare? Mi spiego meglio, prendiamo estraiHeader, gli passiamo email che contiene il blocco headers---+ il corpo del messaggio. Alla fine della funzione email dovrà puntare all'inizio del corpo del messaggio?
-- Comment added by RiccardoVona on 04 Apr 2005
tokens
nei tokens è possibile trovare una stringa vuota? (puntatore a zona di memoria con solo il terminatore)
-- Comment added by MarcelloLagana on 04 Apr 2005
Argomenti passati alla funzione: email e headers
Non è nello scopo delle funzioni eseguire queste operazioni. E comunque non sarebbe possibile in ALCUN modo fare una cosa del genere.....almeno non nelle condizioni prefissate!
-- Comment added by DavidBenedetti on 04 Apr 2005
tokens
Prova a costruire una situazione apposita dove si potrebbe trovare una stringa vuota dentro un token!
-- Comment added by DavidBenedetti on 04 Apr 2005
tokens
solo nei test... :P
volevo proprio sapere se dovevo considerare quest'evenienza
-- Comment added by MarcelloLagana on 04 Apr 2005
Risposte
RE: EMPTY_STRING
EMPTY_STRING è un semplice controllo sulle stringhe di input.
Per i controlli sulla sintassi di uno header c'e' l'errore BAD_HEADER.
RE: FILE_EMPTY
Se avessi voluto farvi controllare se il nome del file è una stringa vuota avrei aggiunto anche l'errore EMPTY_STRING ... (ma che scemo che sono ... l'ho fatto!
)
RE: Sulle funzioni di test
Per vedere se una funzione gestisce correttamente un argomento puntatore in cui viene passato il valore NULL (cioè zero) come faresti?
I proverei a passarglielo e vedrei se esce il codice NULL_POINTER ...
RE: delirio test
Ma se si passa -4 come dimensione di un buffer la funzione che deve ritornare secondo te?
RE: Argomenti passati alla funzione: email e headers
Sarebbe meglio di no, altrimenti i test sviluppati da me o dai tuoi colleghi potrebbero fallire per via dei side-effects. (sì, lo so, avrei dovuto dichiarare gli argomenti const ).
RE: tokens
direi di no ... le parole hanno almeno 2 caratteri.
Naturalmente stampaToken deve dare errore se ciò accade.
-- Comment added by AndreaSterbini on 04 Apr 2005
CONSEGNATE?
Possibile che siate tutti così occupati da non provare a consegnare
nemmeno una versione preliminare del modulo?
Non me ne è arrivato nemmeno uno, forse la pagina non funziona?
-- Comment added by AndreaSterbini on 04 Apr 2005
No prof.....
E' solo che fra un pò ci esce un pulsante rettangolare in fronte con su scritto "Format c: ? " (C stavolta sta per cervello!) e poi solo "OK" come scelta......
Skerzo, è solo ke tiene molto impegnati!
-- Comment added by DavidBenedetti on 04 Apr 2005
ma professore, lei ci stupisce ogni giorno di più! oggi ad esempio notiamo delle sottili sfumature ironiche nel suo tono
ok, lasciamo perdere l'ambiguità degli errori EMPTY_STRING e FILE_EMPTY, ma ehm, come dire, volevo ribadire la mia seconda domanda!!!!!
gliela quoto qui di seguito:
quando nella funzione estraiHeaders testiamo i parametri, il test per EMPTY_STRING del parametro email deve essere fatto prima o dopo i test degli altri due parametri? e il test per HEADER_NOT_FOUND?
per porre la mia seconda domanda in maniera più precisa: ciò che va testato nell'ordine in cui sono definiti i parametri è la loro validità "spicciola" (puntatori nulli e dimensioni negative) oppure anche altre condizioni un attimino più "sofisticate", come ad esempio appunto il caso di stringa vuota o stringa che inizia col newline (e quindi headers assenti)?
con relativa precisazione:
le facevo questa domanda prof, perché io ritengo utile testare prima tutte le condizioni più "spiccole", cioè validità dei puntatori e delle dimensioni, e poi, in caso di test completamente positivi, eseguire il resto del lavoro, altrimenti le funzioni in certe condizioni potrebbero iniziare a svolgere il loro lavoro (potenzialmente costoso in termini computazionali) e perdere tempo per poi scoprire ad esempio che il puntatore al buffer dove devono scrivere il risultato è nullo...
la ringrazio dell'eventuale risposta :)
-- Comment added by AlbertoLaRocca on 04 Apr 2005
Tokens
Quindi va bene se printTokens dà errore durante la stampa? Oppure devo verificare l'esattezza degli argomenti prima di incominciare a stampare?
-- Comment added by MarcelloLagana on 04 Apr 2005
Argomenti passati alla funzione: email e headers
Forse non ho capito bene come funziona esattamente la funzione tokenizzaEmail allora... immaginavo una cosa simile:
- chiama la estraiHeaders per prendere il blocco degli headers
- chiama la primoHeader finchè non finisce di esaminare il blocco degli header
- per ogni primo_primoheader chiama la parseHeader per separare il tipo ed il valore
- chiama la funzione primaParola finchè valore non è stato scomposto
- quando è stato analizzato tutto il blocco degli headers si chiama primaParola sul corpo del messaggio
Però qui sorge il problema, cioè come gli faccio capire, ad esempio, alla funzione primoHeader che il primo header che ha trovato va "scartato" in quanto già analizzato e che deve cercare il secondo? Considerando che primoHeader prende come argomento tutto il blocco degli headers... Oppure, come gli dico che deve eseguire primaParola sul corpo del messaggio se email punta sempre sul primo carattere del blocco headers? Potrei ricalcolarmi tutte le dimensioni e poi passargli come argomenti puntatori dichiarati da me, ma non mi sembra molto efficente rifare per due volte la stessa operazione.
-- Comment added by RiccardoVona on 04 Apr 2005
Allora, ascolta...
In realtà Riccardo, è semplice fare quello che (giustamente) desideri con tanto ardimento fare! Dunque: primoHeader riceve un una stringa, giusto? E cosa è una stringa in C? Una sequenza di caratteri sequenziali di cui conociamo il punto di inizio in memoria dal nome del puntatore che la 'punta'! Se dunque ho headers (dichiarato appunto come char*) che punta a "Ciao caro Riccardo, come va?" avrò in realtà che headers, al suo interno avrà scritto (che so) 1034, e cioè l'indirizzo di inizio della stringa che ho scritto...la fine di essa è ovviamente individuata dal carattere '\0'. Comunque, se tu volessi che headers puntasse all'inizio del tuo nome basterebbe che spostassi il puntatore che punta alla stringa sulla lettera 'R'.... headers = headers---+ 10;
In questo modo, se provi a stampare la stringa "contenuta" in headers dopo questa assegnazione avrai: "Riccardo, come va?". Tutto si basa sull'aritmetica dei puntatori (che fondamentalmente è aritmetica, ma nella memoria del computer: perciò bisogna andarci MOLTO cauti!). Se allora tu intendi dire ad una funzione da dove partire in una stringa puoi sempre usare una variabile intera da utilizzare come 'contenitore (o sommatore) di lunghezze! Nel senso; ammettiamo che tu kiami primoHeader passandogli headers...allora lui ti resituisce uno header di lunghezza N...e tu ke fai? Aggiungi N alla variabile intera che usi come accumulatore di lunghezze e poi richiami primoHeader passandogli "headers---+ counter_strings" (un esempio di nome che puoi dargli)....ma stai attento.....si nasconde un insidia dietro tutto ciò...mi dispiace, non posso dirti altro...non vorrei che il professore mi punisse......CIAO
-- Comment added by DavidBenedetti on 04 Apr 2005
Domanda su BAD_HEADER
se gli headers dell'email sono corretti però finiscono solo con un '\n' invece di due cosa devo ritornare??? BAD_HEADER giusto???
-- Comment added by TizianoFranchi on 04 Apr 2005
Domanda su BAD_HEADER
La funzione estraiHeaders resituisce headers[] che termina con \n\0.....dalle specifiche accordate con il professore!
-- Comment added by DavidBenedetti on 04 Apr 2005
Ah, no...scusa....
Avevo letto male la tua domanda...sorry!
-- Comment added by DavidBenedetti on 04 Apr 2005
nel file testModulo1.c
si possono mettere funzioni richiamate dalle funzioni test???
-- Comment added by TizianoFranchi on 04 Apr 2005
BAD_HEADER
quindi restituisce quest'errore...Per David: ho letto ora l'email, grazie!!
-- Comment added by TizianoFranchi on 04 Apr 2005
Allora, ascolta...
Mi autoquoto << Potrei ricalcolarmi tutte le dimensioni e poi passargli come argomenti puntatori dichiarati da me, ma non mi sembra molto efficente rifare per due volte la stessa operazione.>> che in pratica sarebbe fare quello che hai detto tu David... il mio problema è un altro:
Quando nelle tue funzioni tu identifichi l'oggetto che ti interessa, per conseguenza identifichi ache il resto (se ptrtesto punta alla fine del blocco headers ptrtesto---+ sizeof(char) punta all'inizio del corpo del messaggio). Riidentificare il tutto una seconda volta mi sembra una ridondanza. Ecco qual'era il mio problema...se bisogna ricalcolarsi il tutto per forza amen...
-- Comment added by RiccardoVona on 04 Apr 2005
Altra Domanda
per il test di printToken come faccio a dirgli di mettere l'output in un file invece che a monitor...??
-- Comment added by TizianoFranchi on 04 Apr 2005
Ascolta ascolta....
Le cose sono due: o mi sono spiegato male io, oppure ciò che ho detto in termini di algoritmo fa pena....siccome però l'ho già implementato in C questo algoritmo, penso di essermi spiegato male! Tra l'altro la tua domanda l'avevo anche capita bene....rifletti bene su quello che ho scritto....non è poi tanto cattivo!!!
-- Comment added by DavidBenedetti on 04 Apr 2005
Libreria stat.h
Professore, ho un problema con l'inclusione delle librerie che non so come trattare. Le spiego.
Su Dev-c---++, quando includevo la libreria <stat.h> all'inizio mi dava errore, perché non trovava la libreria, così io l'ho trovata nella sottocartella SYS di INCLUDE del Dev e l'ho copiata su INCLUDE...così facendo compilava....Venerdì sono andato in laboratorio a via salaria per provare a compilare sotto linux, ma non compilava....facendo poi man fstat ho visto che dava proprio l'istruzione di inclusione, e cioè #include <sys/stat.h>; scrivendo questo il compilatore non ha più fatto un fiato...Ora però stavo ricompilando sul Dev e mi ridava errore, così ho dovuto ricancellare "sys/" dall'istruzione di inclusione per farlo ricompilare senza problemi....la mia domanda è: compilando lei sotto linux, quale istruzione di inclusione precisa devo scrivere affinché il modulo1.c non fallisca immediatamente sulla compilazione??????? GRAZIE!
-- Comment added by DavidBenedetti on 04 Apr 2005
E lo sapevo...
Twiky interpreta "parentesi angolare aperta" sys/stat.h "parentesi angolare chiusa" come un tag....cmq era questa l'istruzione che mi ha dato linux....va bene?
-- Comment added by DavidBenedetti on 04 Apr 2005
Problemi funzioni di test.........
Ho dei problemi sulle funzioni di test in pratica io faccio la funzione di test ""int test_leggiFile(tipo_di test,int arogomento)""" e ci metto dentro il mio codice che per esempio verifica se passando un puntatore nullo mi torni il giusto errore, per testare un altro argomento devo sempre richiamamrmi il prototipo indicato dal prof nel .h??????Oppure devo testare---+ arogomenti all'interono dello stesso prototipo????
e poi tutti i prototipi nel .h devo essere lanciati da un main????
Insomma mi fate qualche esempio che con queste funzioni di test non ci sto capendo molto,io i test con il mio main me li sono fatti ma non riesco a capire come si collegeno queste funzioni!!
Grazie!
-- Comment added by Users.691942 on 04 Apr 2005
OT:forum
Volevo fare una proposta dato che le domande sono tante e credo siano tante anche per gli altri moduli, se il prof vuole io sono disposto a rendere disponibile un Forum dedicato a questo corso, così con Topic separati si farebbe meno fatica a leggere le 3000 domande e le risposte si potrebbero trovare più facilmente invece di essere sparse!
Fatemi sapere!
-- Comment added by Users.691942 on 04 Apr 2005
OT:Queste specifiche valgono anche per il canale P-Z?
Volevo sapere se le specifiche del progetto e le modalità di consegna
di lab prog fossero comuni a tutti e 3 i canali o per lo meno al canale P-Z
Grazie
-- Comment added by AntonioVillani on 04 Apr 2005
Problemi funzioni di test...
Per quanto riguarda i prototipi devi lasciarli così Marco, anke xké il professore compila i nostri testModulo1.c con il suo testModul1.h, uguale a quello ke ha distribuito a noi! Ti faccio un esempio generico di funzione di test...
int test_XXX(int tipo_di_test, int argomento)
{
switch(argomento)
{
case 0:
switch(tipo_di_test)
{
case RESULT_OK:
...
...
...
break;
case NULL_POINTER:
...
...
...
break;
...
...
...
}
break;
case 1:
switch(tipo_di_test)
{
case RESULT_OK:
...
...
...
break;
case NULL_POINTER:
...
...
...
break;
...
...
...
}
break;
}
...
...
...
...
...
return TEST_PASSED (oppure FAILED)
}
dove "..." sta per "codice scritto da te"!!!!!!
-- Comment added by DavidBenedetti on 04 Apr 2005
Queste specifiche valgono anche per il canale P-Z?
Ke io sappia Antonio no...però fossi in te kiederei ai diretti interessati...cioè i professori!
-- Comment added by DavidBenedetti on 04 Apr 2005
Problemi funzioni di Test...
Grazie David,ho capito molte cose,un ultima cosa che mi rimane ancora oscura,gli argomenti che vengono passati alle funzioni,per testare questo quel parametro, chi glieli passa un main fittizio???
-- Comment added by Users.691942 on 04 Apr 2005
PER IL PROF.........
lei ha detto che nei headers ci possono essere anche caratteri non alfanumerici, se uso primaParola() per spezzettare gli header i caratteri non alfanumerici verrebbero interpretati come separatori...sennò il controllo della parola la dovrebbe fare tokenizzaEmail() e i test per primaParola() non si potrebbero fare bene..insomma che devo da fa'???
-- Comment added by TizianoFranchi on 04 Apr 2005
prof., stavolta non mi scappa
in un solo pomeriggio la mia domanda è stata nuovamente sommersa da cose che non c'entrano nulla; e io gliela ri-quoto qui di seguito:
quando nella funzione estraiHeaders testiamo i parametri, il test per EMPTY_STRING del parametro email deve essere fatto prima o dopo i test degli altri due parametri? e il test per HEADER_NOT_FOUND? per porre la mia seconda domanda in maniera più precisa: ciò che va testato nell'ordine in cui sono definiti i parametri è la loro validità "spicciola" (puntatori nulli e dimensioni negative) oppure anche altre condizioni un attimino più "sofisticate", come ad esempio appunto il caso di stringa vuota o stringa che inizia col newline (e quindi headers assenti)?
con relativa precisazione:
le facevo questa domanda prof, perché io ritengo utile testare prima tutte le condizioni più "spiccole", cioè validità dei puntatori e delle dimensioni, e poi, in caso di test completamente positivi, eseguire il resto del lavoro, altrimenti le funzioni in certe condizioni potrebbero iniziare a svolgere il loro lavoro (potenzialmente costoso in termini computazionali) e perdere tempo per poi scoprire ad esempio che il puntatore al buffer dove devono scrivere il risultato è nullo...
la ringrazio dell'eventuale risposta
-- Comment added by AlbertoLaRocca on 04 Apr 2005
Altra domanda
Per ridirigere l'output su file io faccio così: lancio la funzione main (nella quale potresti schiaffargli dunque la printTokens) nel seguente modo:
./main > output
-- Comment added by MassimilianoNatale on 04 Apr 2005
sintassi headers/corpo
nella funzione estraiHeaders, se x caso la linea vuota che separa gli headers dal corpo è assente, dobbiamo restituire HEADER_NOT_FOUND, giusto?
-- Comment added by AlbertoLaRocca on 04 Apr 2005
giusto
-- Comment added by TizianoFranchi on 04 Apr 2005
Altra domanda
PER MASSIMILIANONATALE: io mi riferivo a una funzione C, da mettere nel codice di test_printToken() , non penso il prof compili il nostro programma con quell'istruzione..cmq grazie!!
-- Comment added by TizianoFranchi on 04 Apr 2005
primoHeader
prof, non mi ricordo---+ una cosa...
la funzione primoHeader deve scrivere nel buffer anche il newline che conclude un header?
se ne sarà discusso miliardi di volte, ma non me lo ricordo più! ^_^'
non riesco a trovare la risposta perché il forum è diventato di una lunghezza assolutamente ingestibile! O_o'
-- Comment added by AlbertoLaRocca on 04 Apr 2005
Risposte
Vi avevo già detto in che ordine fare i test ... (prima ARG, poi CODICE)
Spero che questo non complichi le cose troppo (incrocio le dita anche per me
)
RE: Allora, ascolta...
... sì, ascolta me ... l'aritmetica dei puntatori fa parte del programma d'esame di Programmazione 1. Studiatela.
(scusate ma non posso mica rifarvi il corso di Prog 1, no?)
RE: Domanda su BAD_HEADER
Se gli headers finiscono con un solo '\n' allora vuol dire che l'email non ha BODY.
RE: nel file testModulo1.c
Questo è un bel problema ...
Dato che non siete sicuri che il vostro file testModulo1.c verrà linkato con il VOSTRO file modulo1.c è meglio che copiate le funzioni di utilità che usate sia in modulo1.c che in testModulo1.c CAMBIANDOGLI NOME.
RE: Altra Domanda
potresti usare freopen
RE: Libreria stat.h
Non basta scrivere?
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
RE: Problemi funzioni di test.........
Le funzioni di test verranno chiamate da un MIO main che:
- installa un interrupt-handler che cattura i sementation-fault
- cicla su tutti gli argomenti
RE: E lo sapevo...
Le parentesi angolari definiscono i tag HTML e il browser non li mostra.
Usate il tag <verbatim>
RE: OT:forum
Anche io so usare un forum php ... lasciate stare
RE: OT:Queste specifiche valgono anche per il canale P-Z?
No
RE: PER IL PROF........
non ho capito la domanda ...
RE: sintassi headers/corpo
No, direi BODY_NOT_FOUND
-- Comment added by AndreaSterbini on 04 Apr 2005
finalmente risposta alla mia seconda domanda
perfetto!
in realtà inizialmente avevo fatto i test nell'ordine errato (avevo fatto degli algoritmi che imho erano migliori ma errati in questo contesto) ma qualche ora fa ho cambiato sperando di fare giusto, e ho fatto bene!
-- Comment added by AlbertoLaRocca on 04 Apr 2005
freopen(...)
Once I've used freopen, how can I get the original stdout (or stdin) back?
There isn't a good way. If you need to switch back, the best solution is not to have used freopen in the first place. Try using your own explicit output (or input) stream variable, which you can reassign at will, while leaving the original stdout (or stdin) undisturbed.
come faccio a modificare lo stream del modulo1.c senza inserire del codice che dipende da testModulo1.c?
-- Comment added by MarcelloLagana on 04 Apr 2005
CONSEGNA!
Professore, mi sarebbe tanto piaciuto consegnare, ma la pagina di consegna non mi riconosce il login...o meglio, una volta cliccato su "spedisci la tua soluzione" mi dice ATTENZIONE: manca il nome, torna indietro e inseriscilo...io sono iscritto, dov'è il problema???????? (PANICO!!!!!)
-- Comment added by DavidBenedetti on 04 Apr 2005
CONSEGNA!
ma lei l'aranciata... l'aveva pagata...? (tattattaaaaaaraaa, tararara-tattararà, tattattaaaaaaraaa...)
l'hai scritto o no sto nome David?
devi scrivere nome, cognome e WikiName nelle apposite caselle!
-- Comment added by AlbertoLaRocca on 04 Apr 2005
a proposito,
1 cosa soltanto: spero che lei per compilare non usi l'opzione -ansi o -pedantic... (mi dica che non la usa, la prego, non voglio riscrivere TUTTE LE MACRO...
)
-- Comment added by AlbertoLaRocca on 05 Apr 2005
primaParola
se la funzione primaParola riceve una stringa vuota che fa, restituisce EMPTY_STRING oppure scrive una stringa vuota nel buffer? (spero che debba restituire EMPTY_STRING :P )
grazie.
-- Comment added by AlbertoLaRocca on 05 Apr 2005
mi è sfuggito un passaggio....
RE: test (leggiFile)
Il file email1.txt siete sicuri di averlo, se vi servono altri file dovete crearli da programma.
-- Comment added by AndreaSterbini
RE: Dubbi dubbi dubbi...
chi ha mai detto che il tipo sia di soli caratteri alfanumerici?
Se possibile non create file di appoggio (avrete a diaposizione i files email1.txt, file-unreadable, file-empty ed il famigerato smile file-missing) -- Comment added by AndreaSterbini
ha cambiato idea? cioè basta passare come nomeFile "file-unreadable" alla leggiFile nei test e stiamo a posto? davvero? se, è così lei m sta salvando...
-- Comment added by GabrieleTarantino on 05 Apr 2005
mi è sfuggito un passaggio....
RE: test (leggiFile)
Il file email1.txt siete sicuri di averlo, se vi servono altri file dovete crearli da programma.
-- Comment added by AndreaSterbini
RE: Dubbi dubbi dubbi...
chi ha mai detto che il tipo sia di soli caratteri alfanumerici?
Se possibile non create file di appoggio (avrete a diaposizione i files email1.txt, file-unreadable, file-empty ed il famigerato smile file-missing) -- Comment added by AndreaSterbini
ha cambiato idea? cioè basta passare come nomeFile "file-unreadable" alla leggiFile nei test e stiamo a posto? davvero? se, è così lei m sta salvando...
-- Comment added by GabrieleTarantino on 05 Apr 2005
WE ARE THE CHAMPION TA RA RA
vabè nel frattempo io ho consegnato... aspetto notizie su questa cosa...
-- Comment added by GabrieleTarantino on 05 Apr 2005
Risposte
RE: freopen
Puoi:
- riusare freopen sul device "/dev/tty"
- oppure usare dup per duplicare il filedescriptor e fdopen per riaprirlo.
Vedi: freopen + dup
(magari evitate di copiare il codice senno' risultate copioni
)
RE: a proposito
OK, solo per te userò l'opzione --so-pedantic-that-nothing-works
RE: primaParola
esatto
RE: mi è sfuggito un passaggio....
Sì, ho cambiato idea per semplificarvi (leggermente) il lavoro.
-- Comment added by AndreaSterbini on 05 Apr 2005
E' proprio necessario fare anche i tests?
E fino qui la domanda sembra un'idiozia, ma deriva da un semplice calcolo del tempo. Sto ovviamente parlando del file di tests che dobbiamo fare noi. Sto impiegando più tempo a fare questi tests che a fare il progetto vero e proprio, e non è per nulla tempo ben speso. Mi spiego meglio, una volta capita l'utilità dei tests ed il modo per crearli ed effettuarli, essi si riducono a migliaia di righe in cui si perde più tempo a fare operazioni di copia ed incolla che a fare altro. Il risultato è che sono 3 giorni che sto facendo questo maledetto file e sono ancora ad un quinto. Dato che manca un giorno alla consegna non so cosa dovrò inventarmi per consegnare il tutto. Adesso, se avessimo solo questa come materia o al più un altro paio è un conto, ma visto che l'intero pomeriggio va via per seguire gli altri corsi, e la mattina dobbiamo studiare anch le altre materie, risulta praticamente impossibile riuscire a fare sia il progetto che i tests, o almeno a farli e a studiare anche le altre materie! Qui non è più una questione di imparare a programmare ma diventa una corsa contro il tempo fin dal primo giorno, nella quale la maggior parte di essa dovrà essere passata a fare righe e righe di spiegazioni. Vorrei quindi avanzare la richiesta di rendere opzionali i tests (ovviamente tenendo conto che chi li farà dovrà avere un bonus rispetto agli altri) almeno dal secondo modulo, per evitare di non passare l'esame non per mancanza di basi o di capacità per quanto riguarda la programmazione, bensì per mancanza di tempo nello scrivere tutto il codice che riguarda i tests.
-- Comment added by EnricoMontesi on 05 Apr 2005
è proprio per questo che il maestro usa le macro...
-- Comment added by AlbertoLaRocca on 05 Apr 2005
(col termine "maestro" mi riferivo a me, non al prof.)
-- Comment added by AlbertoLaRocca on 05 Apr 2005
RE: E' proprio necessario fare anche i tests?
Come ho detto (nella homepage del corso) si passa il corso con almeno il 50% del progetto (totale) svolto.
- darò peso maggiore alle funzioni più difficili
- anche i test fanno parte della valutazione (con peso da definirsi)
PS: un suggerimento per scrivere le spiegazioni: standardizzatele scrivendo una funzione a cui passate solo i parametri necessari a completarle.
-- Comment added by AndreaSterbini on 05 Apr 2005
PER IL PROF
siccome lei ha detto che per spezzare lo header bisogna usare primaParola() il mio dubbio è il seguente: poichè nel testo ci devo stare solo caratteri alfanumerici e la funzione che si occupa di restituire la parola alfanumerica è proprio primaParola allora anche nello header vanno tolti i caratteri non alfanumerici!!perchè se non fosse così non potrei usare primaParola per spezzare lo header in parole..giusto??
-- Comment added by TizianoFranchi on 05 Apr 2005
PAGINA DI CONSEGNA
Professore, non so più come consegnarle il mio lavoro! Ieri sera ho provato a consegnare, ma mi appariva quell'avviso ("ATTENZIONE: manca il nome, torna indietro e inseriscilo") che, ancora adesso, non capisco: nonostante avessi riempito TUTTI i campi. Oggi, all'ora di pranzo, sono andato al laboratorio di matematica e ho provato a consegnare scrivendo però nelle text box relative ai testi dei nostri moduli (su ENTRAMBE) delle stringhe casuali...di una sola riga...COSI HA FUNZIONATO (difatti, per ora, so di aver consegnato sicuramente solo una schifezza!). Tutto contento sono tornato a casa, non avendo i files con me. Ho provato nuovamente da casa a consegnare, ma....NIENTE DI FATTO! Allora, sono tornato all'università, munito di files su dischetto e sono andato nuovamente ai laboratori di matematica e ho riprovato a consegnare...ma niente!Disperato sono venuto a via salaria, sperando di trovarla e di poterle chiedere di persona come mai succede questo, ma non l'ho trovata (ore: 17:30) e così sono andato al laboratorio del nostro dipartimento per provare l'ennesima volta a consegnare...ma, ovviamente, niente di fatto....stesso errore!Dov'è il problema????? I miei files sono troppo lunghi? Faccio qualcosa di sbagliato (nonostante la procedura seguita in tutti i casi è stata la stessa)? Mi devo iscrivere al corso di Laboratorio di programmazione e non l'ho mai saputo? Sto antipatico al server? La prego, mi illumini!
-- Comment added by DavidBenedetti on 05 Apr 2005
PS!
Non ho capito il suo PS professore...
-- Comment added by DavidBenedetti on 05 Apr 2005
ANCORA SULLA PAGINA DI CONSEGNA
Mi stavo dimenticando. In una delle prove fatte in laboratorio (VIA SALARIA) ho cancellato tutto il tutto il testo di entrambi i testi lasciando solamente le direttive di inclusione al preprocessore....e ha funzionato.....sono veramente confuso.....
-- Comment added by DavidBenedetti on 05 Apr 2005
TRA L'ALTRO.....
Se non riempio il campo "PASSWORD" (riempiendo correttamente tutti gli altri, compresi i testi dei miei moduli) e clicco sul pulsante "Spedisci la tua soluzione!" ricevo sempre lo stesso errore: "ATTENZIONE: manca il nome, torna indietro ed inseriscilo".....................................................MA IL NOME DE CHE???????????????????????????????????????????????????????????
-- Comment added by DavidBenedetti on 05 Apr 2005
STRANISSIMO
Io l'ho appena inviato...prova a fare reset password da twiki..anche se non centra nulla perchè se i msg li mandi!!!
-- Comment added by TizianoFranchi on 05 Apr 2005
BAD_HEADER
no prof..io dicevo che i due \n\n mancano tra l'header e il testo..però dopo ci sono!!quindi poichè viene preso come headers anche una parte del testo si ritorna BAD_HEADER giusto???
-- Comment added by TizianoFranchi on 05 Apr 2005
RE: TRA L'ALTRO.....
Non so che dirti ... altri hanno consegnato tranquillamente ...
Vedo anche le tue 3 consegne (quasi vuote ....)
Che browser usi? Forse un Mozilla/Netscape antidiluviano?
-- Comment added by AndreaSterbini on 05 Apr 2005
Risposte
RE: PER IL PROF
primaParola serve per estrarre le parole dai valori degli headers. I tipi degli headers possono contenere qualsiasi cosa tranne spazio e tab.
RE: BAD_HEADER
Vediamo un po' .... in tokenizzaEmail:
- prima estrai gli headers (e ottieni tutta la email
- poi estrai il body (e qui viene BODY_NOT_FOUND)
- poi li spezzi in singoli headers (e fin qui non hai errori)
- poi estrai tipo e valore (e qui potresti avere BAD_HEADER, ma solo se una riga del messaggio non contenesse alcuno spazio)
- poi tokenizzi i valori (niente BAD_HEADER)
Dato che BODY_NOT_FOUND è (nella lista dei codici) PRIMA di BAD_HEADER, devi controllare (e tornare) BODY_NOT_FOUND prima di passare a spezzare gli headers.
-- Comment added by AndreaSterbini on 05 Apr 2005
OK
quindi l'estraiHeaders non si deve preoccupare se non trova il fine headers, cioè "\n\n"???
-- Comment added by TizianoFranchi on 05 Apr 2005
OK
estraiHeaders si deve fermare quando trova \n\n!!!
Ma estraiHeaders può ritornare BODY_NOT_FOUND?
-- Comment added by AlessandroGrottoli on 05 Apr 2005
BROWSER....
Professore, io uso Mozilla, ma ho provato anche da Internet Explorer 6....e ho ottenuto gli stessi identici risultati....tra l'altro, avendo provato dal laboratorio di matematica e da quello di informatica, se così fosse, immagino debbano essere cambiati anche quelli di browser.....! GRAZIE!
-- Comment added by DavidBenedetti on 05 Apr 2005
Non mi menate...
Io non ho capito questa cosa della prima funzione. Se la dimensione della stringa testo è minore della dimensione del file, si copiano solo i primi caratteri. Ma la dimensione della stringa testo si intende espressa in byte o come lunghezza della stringa? Poi si copiano solo i primi caratteri che significa? Primi caratteri quanti?
Un'ultima cosa riguardo le funzioni di test. Io per far si che una funzione mi dia RESULT_OK devo fare tutti i possibili testi immaginabili? Ad esempio una volta gli passo un file vuoto, un'altra volta un float invece di un char.. e così via? Cioè facendo un test del genere mi deve dare sempre RESULT_OK oppure uno di quei codici di errore (ammesso che la funzione sia fatta comunque bene)? Grazie
-- Comment added by EmanueleGallo on 05 Apr 2005
Ah un'ultima cosa
Nelle funzioni di test, per esempio per testare la prima funzione, devo passargli io il buffer dalla funzione dalla funzione di test? Ecco ma se devo specificare una dimensione devo leggere un valore in input nel quale la dimensione la metto io?
-- Comment added by EmanueleGallo on 05 Apr 2005
Non mi menate...
e invece credo che Sterbini quando vedrà quel messaggio penserà che è proprio il caso di menarti...
cosa facevi a Programmazione I, avevi adocchiato una bella ragazza o cosa?
dai scherzo! comunque:
* la lunghezza della stringa espressa in bytes o in caratteri è la stessa identica cosa, perché un carattere occupa esattamente un byte (a meno che non usi lo standard Unicode, che però non abbiamo fatto/non ci interessa)
* quando si dice che si copiano i primi caratteri si intende che si copiano tutti quelli che c'entrano, calcolando anche che alla fine deve rimanere 1 byte di spazio x il terminatore NULL
* in una funzione di test non puoi assolutamente passare un float a una funzione da testare anziché un char, i test non devono essere fatti in questo senso! il programma deve comunque compilare, i tipi dei parametri che passi devono corrispondere tutti, i dati che passi devono tutti quanti rispettare delle condizioni minime di validità! su RESULT_OK devi semplicemente inventarti un possibile test che potresti fare, inventandoti dei dati che si, rispettano tutte le condizioni di validità, ma le rispettano proprio in extremis, perché così una funzione scritta male che fa le verifiche in maniera errata ha buone possibilità di fallire il test: io ad esempio per la funzione primaParola (per dirne una) su RESULT_OK ho fatto un test in cui il primo parametro contiene un testo abbastanza complicato, dove trovare la prima parola potrebbe essere difficile per una funzione scritta male; inoltre agli altri parametri ho passato un buffer valido, e una dimensione risicata che possa contenere pelo pelo la prima parola del testo che mi sono inventato (calcolando che ci deve stare anche lo '\0' finale), in maniera tale che se una funzione scritta male sbaglia i calcoli per la dimensione del buffer, mi restituisce un errore diverso da RESULT_OK e fallisce il test. spero di essermi spiegato bene con questo esempio, sennò chiedi altri chiarimenti facendo domande più specifiche.
-- Comment added by AlbertoLaRocca on 05 Apr 2005
precisazione
a dire la verità una differenza tra la lunghezza di una stringa espressa in bytes e la lunghezza espressa in caratteri esiste: quando la lunghezza è espressa in bytes si include anche il terminatore finale, quando è espressa in caratteri invece no, quindi se una stringa è lunga N caratteri, si può dire che è lunga N---+1 bytes: la stringa "ciao" è lunga 4 caratteri/5 bytes, la stringa "hello, world!" è lunga 13 caratteri/14 bytes.
-- Comment added by AlbertoLaRocca on 05 Apr 2005
primaParola e parole di lunghezza < 2
prof. io sapevo che primaParola deve restituire parole di almeno 2 caratteri alfanumerici, se trova una sequenza di un solo carattere alfanumerico isolata da monnezza la deve ignorare; oggi però mi è stato detto che primaParola deve comunque restituire anche caratteri singoli, e deve essere la tokenizzaEmail a selezionare le parole di lunghezza >= 2. è giusto questo?
-- Comment added by AlbertoLaRocca on 05 Apr 2005
tokenizzaEmail : allocazione memoria?
Domanda piuttosto stupida, nella funzione tokenizzaEmail, la memoria per contenere le varie stringhe, headers, header, parola, etc etc, dobbiamo allocarla noi? Se si, quindi dobbiamo anche gestirci internamente l'errore BUFFER_TOO_SMALL? (ovvero, se la funzione mi ritorna BTS, aumento la dimensione e rialloco memoria)
-- Comment added by RiccardoVona on 05 Apr 2005
tokenizzaEmail: allocazione memoria?
la tua domanda non è chiara; si, la tokenizzaEmail deve usare malloc per allocare memoria per le stringhe da mettere nelle varie strutture Token dell'array, e quindi tra parentesi nella funzione main e nelle funzioni di test alla fine devi anche liberare con free tutta la memoria allocata da tokenizzaEmail.
l'errore BUFFER_TOO_SMALL che c'entra?
-- Comment added by AlbertoLaRocca on 05 Apr 2005
tokenizzaEmail: allocazione memoria?
Visto che nella funzione tokenizzaEMail dobbiamo allocarci la memoria per memorizzare le varie stringhe che le funzioni elaboreranno, dobbia controlla se appunto la funzione chiamata ritorni l'errore BUFFER_TOO_SMALL
Esempio:
result = estraiHeaders(ciccio, pippo, dim)
if (result == BUFFER_TOO_SMALL)
*aumenta dim, rialloca la memoria e ripeti la estraiHeaders*
intendevo questo
-- Comment added by RiccardoVona on 05 Apr 2005
tokenizzaEmail: allocazione memoria?
*dobbiamo controllare
-- Comment added by RiccardoVona on 05 Apr 2005
tokenizzaEmail
ah si, quello si. più in generale, siccome la tokenizzaEmail deve praticamente chiamare tutte le altre funzioni (esclusa giusto la leggiFile), quando da una funzione riceve un errore, se è in grado di gestirlo (come nel caso di BTS) lo gestisce e continua a lavorare, altrimenti lo "propaga", cioè dealloca tutte le risorse che ha allocato fino a quel momento ed esce direttamente restituendo quello stesso errore.
-- Comment added by AlbertoLaRocca on 05 Apr 2005
tokenizzaEmail: allocazione memoria?
Non è necessario ke tu gestisca quell'errore Riccardo, è facoltativo....la cosa ke mi kiedo è come si potrà far combaciare le implementazioni dei test con le implementazioni delle funzione in questo senso...cmq è un'altra storia!
-- Comment added by DavidBenedetti on 05 Apr 2005
penso sia ora di chiarirlo una volta per tutte...
mettiamo che ho una email dal seguente contenuto: "blah blah blah"
alla fine dell'esecuzione di tutto il baraccone che cosa dovrà uscirne fuori? BODY_NOT_FOUND o HEADER_NOT_FOUND?!?
mi verrebbe spontaneo rispondere la seconda... io penso che tutto dipenda da come deve funzionare estraiHeaders, che di fatto mi pare sia la prima ad essere chiamata (dopo leggiFile naturalmente).
-- Comment added by AlbertoLaRocca on 05 Apr 2005
per la cronaca...
quello che ho fatto io restituisce HEADER_NOT_FOUND (incredibile ma vero!
)
-- Comment added by AlbertoLaRocca on 05 Apr 2005
e aggiungo:
cosa deve restituire invece il baraccone se l'intero contenuto dell'email è "From: andrea@sterbini.org" ?!?
e "blah blah blah\n\n" ?!?
-- Comment added by AlbertoLaRocca on 05 Apr 2005
...dannazione, lo fa anche a me!
Vorrei far notare che anche a me non fa consegnare, chiedendomi di inserire il nome...che ovviamente ho già inserito (ed io uso explorer 6.0, ma visto che sono state fatte prove anche dai laboratori direi che la cosa non dipende dal browser usato). Dato che non mi pare proprio il caso di perdere il modulo per colpa di questa cosa, che devo fare? Visto che sembra che consegnare il progetto per posta faccia venire l'orticaria a tutti i professori, immagino che lo stesso valga per lei...quindi? Glielo portiamo di persona? Non consegnamo e ci vediamo l'anno prossimo? Proviamo a corromperla con il cioccolato?
-- Comment added by EnricoMontesi on 05 Apr 2005
Problema consegna
Prof. anche a me da quel problema. Ho già consegnato diverse volte (per starmene tranquillo), ma tutte versioni incomplete. Vorrei avere la possibilità di consegnare, in qualche modo, oggi(il 6) una versione completa.
-- Comment added by GiovanniColombi on 06 Apr 2005
Problema consegna
Problema con la consegna anche per me. Ho consegnato solo 1 volta un modulo ancora lontanuccio dall'essere completo
-- Comment added by MassimilianoNatale on 06 Apr 2005
Lunghezza del testo
Per chi, come me, ha riscontrato problemi nella consegna del modulo, ho fatto un po' di prove. Finché le righe che incollavo erano inferiori alle 600 per finestra (ossia non più di 600 all'interno di una signola finestra) riuscivo ad inviarle, altrimenti no, mi dava quell'errore della richiesta di inserzione nome. Io ho fatto una versione accorciata (e decisamente meno completa) dei tests, in modo da rimanere al di sotto di quel limite ed ho inviato quella. Vi conviene intanto fare così, per non rischiare di non consegnare, fate la versione "bonsai" dei tests, eliminate tutte le parti superflue dal modulo (come spazi tra le righe per renderlo più leggibile e cose simili) e sperate che si venga a capo del problema.
-- Comment added by EnricoMontesi on 06 Apr 2005
RE: BROWSER....
Il problema dato dalla pagina di consegna derivava dal limite di 64K che avevo inserito per l'upload.
Ho allargato il limite a 500K, ora non da' piu' errore.
-- Comment added by AndreaSterbini on 06 Apr 2005
RE: primaParola e parole di lunghezza < 2
No, primaParola rende solo parole, (quindi di 2 o piu' caratteri) oppure una stringa nulla "" se non trova nessuna parola
-- Comment added by AndreaSterbini on 06 Apr 2005
RE: penso sia ora di chiarirlo una volta per tutte...
BODY_NOT_FOUND
-- Comment added by AndreaSterbini on 06 Apr 2005
Re: Re: penso sia ora di chiarirlo una volta per tutte...
bisogna restituire BODY_NOT_FOUND in quale dei 3 casi che ho detto? il primo?
-- Comment added by AlbertoLaRocca on 06 Apr 2005
PER IL PROF
senta nell'email che arriva dopo la consegna non è che sia proprio preciso il testo!!!mancano delle parentesi, dei minori! devo riconsegnare vero??
-- Comment added by TizianoFranchi on 06 Apr 2005
Re_Re_penso_sia_ora_di_chiarirlo
- D: Chi estrae il body dalla email?
- R: tokenizzaEmail
- D: quindi chi si accorge se il body non c'è?
- R: tokenizzaEmail
- D: e quando se ne accorge?
- R: quando l'email non contiene la sequenza '\n\n'
Ora è chiaro? [... che strazio ....
]
-- Comment added by AndreaSterbini on 06 Apr 2005
RE: PER IL PROF
[ e per chi, sennò? ]
Per caso stai guardando l'email in modalità HTML?
-- Comment added by AndreaSterbini on 06 Apr 2005
test
qualcuno sa come si fa a riprestinare stdout???????
-- Comment added by TizianoFranchi on 06 Apr 2005
RE: stdout
freopen("/dev/tty","w",stdout);
-- Comment added by AndreaSterbini on 06 Apr 2005
primaParola e parole di lunghezza >= 2
Professore, non per difendere la mia posizione, anche perché comprendo il discorso che mi ha fatto oggi riguardo alle competenze "specifiche" di ogni funzione, però vorrei solo esprimere un piccolo parere...Quando lei dice che primaParola restituisce SOLO parole di lunghezza maggiore o uguale a 2 caratteri, mi sorge un piccolo dubbio...Mi spiego. Quando noi passiamo a primaParola la stringa su cui cercare la prima parola disponibile, ci ricalcoliamo poi su tokenizzaEmail il punto su cui realmente siamo arrivati con primaParola per proseguire la scansione. Da qui, però, si dipanano i miei dubbi. Se primaParola restituisce solamente le parole corrette (e cioè che sono effettivamente considerate parole, con lunghezza >= 2), quando si ritornerà su tokenizzaEmail, essa, per capire effettivamente dove è arrivata primaParola, dovrà, di fatto, cercare anch'essa l'inizio di una possibile parola, aggiungendo poi la lunghezza della parola restituita da primaParola (ma quest'ultimo passaggio penso sia ormai assodato!). Quindi la mia considerazione è questa. Se dobbiamo attenerci strettamente alle singole competenze delle funzioni, di fatto saremo più coerenti con le specifiche, ma poi, nell'insieme del modulo, tokenizzaEmail, non farà forse qualcosa in più oltre le sue più strette competenze? Mi scusi se la mia è un'affermazione futile, ma è solo per sapere (e imparare!). GRAZIE!!!
-- Comment added by DavidBenedetti on 06 Apr 2005
RE: primaParola e parole di lunghezza >= 2
... la vita è piena di inconsistenze .... lasciamene passare una anche a me
(avrei dovuto far tornare a leggiParola il numero di caratteri "monnezza" scartati ... ma oramai era troppo tardi per cambiare le specifiche "in corsa")
-- Comment added by AndreaSterbini on 06 Apr 2005
caratteri ascii strani
prof., l'email di conferma che mi è arrivata il file testModulo1.c contiene delle piccole differenze: nulla di che in realtà, semplicemente nei test che avevo fatto per primaParola e per qualche altra funzione avevo messo dei caratteri accentati (erano test cattivelli :P ) solo che nella email di conferma questi caratteri mi appaiono come dei punti interrogativi; quindi niente, semplicemente se vede questi test e non capisce che senso hanno tenga presente che la mia intenzione iniziale era di testare i caratteri accentati.
grazie e scusi se la stiamo assillando, ma dovevamo avere specifiche precise, altrimenti molti test sarebbero risultati discordanti, e probabilmente qualuno lo risulterà lo stesso.
-- Comment added by AlbertoLaRocca on 06 Apr 2005
Si figuri.....
Non ho alcun problema professore, si figuri.....c'è di peggio.....MOOOOOLTO peggio! Al massimo non prenderò 30 e lode con bacio accademico.....ma non si può avere tutto dalla vita!!!
(manco il 30!
:))
-- Comment added by DavidBenedetti on 06 Apr 2005
Mail1.txt o email1.txt?
Il mio programma presuppone che il file "Mail1.txt" esiste (come specificato in alcune risposte). Osservo però che in altre risposte questo file viene chiamato "email1.txt". Vorrei dunque sapere se questa scelta (come immagino e spero) è indifferente ai fini del risultato dei test
-- Comment added by MassimilianoNatale on 07 Apr 2005
primaParola e parole < di 2 caratteri
la mia funzione PrimaParola non ritorna parole < di 2 caratteri: ho speranze di non aver sbagliato il compito?
-- Comment added by MarcelloLagana on 07 Apr 2005
primaParola
è giusto così: primaParola deve restituire solo parole di 2 o più caratteri, l'ha detto ieri il prof.; anche la mia funziona così.
-- Comment added by AlbertoLaRocca on 07 Apr 2005
domandine varie
Anche se il tempo di consegna è scaduto volevo sapere alcune cose per capire se ho svolto bene il mio modulo:
- le funzioni svolgono il loro lavoro ANCHE se la dimensione del buffer passato è troppo piccola o ritornano SOLO il codice d'errore BUFFER_TOO_SMALL?
- il test FILE_UNREADABLE sulla prima funzione è inutile perchè tanto il file deve essere aperto in sola lettura.
- alcune funzioni di test non riescono a stampare il loro messaggio d'errore in caso di test failed perchè le funzioni chiamate provocano il crash del programma PRIMA che il controllo gli venga restituito. (Ciò ad es. mi è accaduto con il test NULL_POINTER su una funzione su cui avevo disabilitato il check) Qualcuno ha trovato una soluzione a questo problema?
-- Comment added by AndreaMantoni on 08 Apr 2005
domandine varie
- secondo me vanno bene entrambe le cose perché io sapevo che se una funzione ritorna un codice d'errore, il contenuto del buffer è indefinito.
- forse volevi dire FILE_UNWRITABLE... in tal caso sono d'accordo.
- in teoria una soluzione parziale esisterebbe in C---++ (il blocco try) ma in C standard e senza fare uso di assembly la soluzione non esiste, quindi secondo me va bene anche se ti va in crash.
PS: prof. aggiusti il forum del modulo2 plz, che qualcuno si è scordato di chiudere un tag <verbatim> e ha fatto scomparire la form
-- Comment added by AlbertoLaRocca on 09 Apr 2005
Librerie per il modulo2
Ma la libreria modulo2.h (come pure testModulo2.h) è già disponibile?
Sto provando a scaricarla ma non la trovo da nessuna parte. Uso questo forum
perchè come diceva Alberto La Rocca quello relativo al modulo2 è out service
-- Comment added by MassimilianoNatale on 09 Apr 2005
Risposte
RE: Mail1.txt o email1.txt
Metterò una copia del file anche sotto l'altro nome.
RE: domandine varie
è possibile installare un interrupt handler che cattura il SIGSEGV e far terminare il test senza abort. Sto facendolo nei miei test.
RE: forum
ricordatevi di chiudere i tag <verbatim>
RE: modulo2.h
Domani o lunedì (le specifiche sono una bozza ... no?
).
-- Comment added by AndreaSterbini on 09 Apr 2005
interrupt handler
ma per installare l'ISR cmq non si può usare solo C standard, no? da che libreria prende le funzioni per installare le ISR?
-- Comment added by AlbertoLaRocca on 10 Apr 2005
sempre interrupt handler
ma scusi, ora che ci penso... in Linux è possibile installare una ISR in modalità protetta?!?!? O_O
-- Comment added by AlbertoLaRocca on 10 Apr 2005
RE: interrupt handler
Per essere più precisi si tratta di un 'signal handler'.
Vedi ad esempio http://users.actcom.co.il/~choo/lupg/tutorials/signals/signals-programming.html
-- Comment added by AndreaSterbini on 11 Apr 2005
Primi Tests
Ho messo in linea i primi risultati dei test
-- Comment added by AndreaSterbini on 19 Apr 2005
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.
- C'è una pagina apposta per gli OffTopic.
-- AndreaSterbini - 20 Mar 2005