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 smile

-- 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 ... smile

-- 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 big grin

-- 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 big grin : 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 smile

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 wink

-- 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...?!? big grin

-- 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 big grin

-- 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 smile

-- 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... big grin )

-- 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 wink

-- 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 smile

-- 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... big grin

-- 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... big grin 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

RE: TokenizzaEmail

  • 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 smile

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 smile :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... big grin

-- 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 smile .

-- 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 smile 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!!! smile

-- 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 smile

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 smile 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? smile

-- 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 cool!

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 smile

-- 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 from*andrea; from*sterbini; from*org; from*v; to*babbo... ... chiudo e riapro e sembra andare. boh..

primaParola prende lettere e numeri io l'avevo fatta solo con le lettere, quando ho aggiunto le cifre ha stampato:

from*cosa;
from*vorrei;
from*per;
from*natale;
from*3
from*3

..da dove li ha presi?!?!?!?

per verificare intoppi gli facevo stampare tutto:

testo.

primo header

parole del primo header...

stampatokens.

quando ho finito ho commentato un system("PAUSE") che avevo messo... e magicamente non fungeva più, stampava:

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 frown )

-- 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 wink

-- 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 ... smile

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 frown

questi 9 spazi iniziali su TWiki non vengono mai frown
la mia stringa iniziale era:
"<9 spazi>parola1parola2"

-- 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 big grin
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... big grin

-- 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! smile

-- 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... wink

-- 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 smile )... 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 smile ):
  • 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!!! smile

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!) smile

-- 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 smile )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... frown

-- 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 stick out tongue

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...! smile

-- 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...!) smile

-- 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 smile ]

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!!!!! big grin
(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... big grin ))

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! smile

-- 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!!! smile

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 frown

-- 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 smile

-- 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") mad!

-- 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&lt
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 smile 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!!! wink
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! smile 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 big grin
secondo me il binomio Open Watcom e MSDN conferisce il potere assoluto su Windows!!! smile

-- 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.. frown )

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 big grin

chi dovrebbe trovare un newline parseHeader()? se così fosse guardati la definizione di "monnezza"!!!! smile 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... smile

perfetto, ora è tutto chiaro, grazie prof. smile

-- 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... frown

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 smile

-- 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... frown

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... -_-' mad!

-- 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 smile 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 smile

-- 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 smile big grin
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 stick out tongue

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 smile

-- 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 frown )

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 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? frown
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... smile

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! smile

-- 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! smile

-- 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! wink )

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...... smile 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 wink
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 smile

-- 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!!! smile

-- 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 smile

-- 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... frown
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

RE: ordine dei test (ad AlbertoLaRocca)

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 smile )

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
    • cicla su tutti i codici
      • chiama test_XXX(arg,cod)

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! smile
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! smile

-- 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? big grin
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 smile )

RE: a proposito

OK, solo per te userò l'opzione --so-pedantic-that-nothing-works smile

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... wink

-- 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... big grin
cosa facevi a Programmazione I, avevi adocchiato una bella ragazza o cosa? wink big grin
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 smile

-- 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! smile )

-- 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 .... frown ]

-- 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 smile

(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!!! smile (manco il 30! smile smile :))

-- 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? frown

-- 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 big grin

-- 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? smile ).

-- 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


This topic: Labprog2eo > WebHome > DomandeSulModuloUno
Topic revision: r312 - 2005-08-21 - AndreaSterbini
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback