Domande sul ModuloTre

Potete fare domande con la form in fondo.

Vi prego di postare gli eventuali OffTopic nella loro pagina (o di iniziarli qui ma poi di spostarvi in quella).




Lettura del file: leggiTokens(...)

Professore, ho notato che la funzione fscanf(...), con il formato %f, non legge un valore double dal file, bensí restituisce nella variabile 0.0000000...com'e' possibile? Ma soprattutto: come si puó ovviare a questo.....ed anche: Ho capito bene com'e' formattato il file??? GRAZIE!!!

-- Comment added by DavidBenedetti on 29 Apr 2005


Ricerca dei 20 token piú distanti da 0.5

Professore, quando dice di "ricercare i 20 token DIVERSI il cui peso Wi dista maggiormente dal valore 0.5", vuol dire che possiamo decidere noi se considerare solo quelli che distano da 0.5 (TUTTI) in eccesso o (TUTTI) in difetto oppure ho capito male??? GRAZIE!!!

-- Comment added by DavidBenedetti on 29 Apr 2005


Re - LeggiTokens

Come lanci la fscanf? Prova (solo per fare un esempio) a lanciarla nel formato di lettura %s%f così sei sicuro che venga saltata la stringa che sta davanti al numero. Per quanto riguarda la ricerca dei token penso tu debba considerare quelli più distanti fregandotene se in eccesso o in difetto. Tra un 0.1 e un 0.8 prendi 0.1, che ti frega se sta in difetto? In bocca al lupo

-- Comment added by MassimilianoNatale on 29 Apr 2005


Struct dizionario ed il parametro dimensioni

Da quanto ho capito la struttura dizionario va implementata tramite hashtable. Ma il parametro dimensioni (che indica il numero di elementi che la tabella può contenere) non dà alcuna informazione sul numero di buckets che la tabella hash deve avere. Possiamo scegliere un valore arbitrario oppure c'è specifica a cui attenerci?

-- Comment added by MassimilianoNatale on 29 Apr 2005


Ricerca dei 20 token piú distanti da 0.5

Ti guardi token per token poi prendi i venti cho o sono più vicini a 1 o sono più vicini a 0...se hai 40 token sui 0,8-0.9 e tre a 0.3 sicuramente i venti che devi prendere saranno quelli tra 0.8 e 0.9...in eccesso (0.5 in su) = Token spam...in difetto (0.5 in giù) =token Ham...ora non ricordo come considerare il caso 0.5 (o non è stato detto)

-- Comment added by AlessandroGrottoli on 29 Apr 2005


20 tokens più distanti....

O io sono sempre più distante da 'sti 20 token??? smile

-- Comment added by DavidBenedetti on 29 Apr 2005


Stricmp o strcmp ???

Professore, ma l'errore di DOUBLE_KEY_FOUND dobbiamo ritornarlo secondo il criterio del "case sensitive" o del "case not sensitive"???

-- Comment added by DavidBenedetti on 30 Apr 2005


tabella hash o albero di ricerca???

David tu che usi tra queste due possibilità??? io l'ho fatte entrambe e penso che l'albero di ricerca sia mille volte più semplice e menu lungo da implementare, soprattutto perchè tanto non dobbiamo fare la funzione delete() che è l'unica cosa un pò più complicata!!tu che ne pensi??

-- Comment added by TizianoFranchi on 30 Apr 2005


a che serve il parametro "dimensioni"?

Ragazzi, un dubbio che mi ha assalito è questo: Nel momento in cui faccio il dizionario di ricerca (che è più facile da implementare ma ha un costo computazionale maggiore, dettaglio che però nel nostro caso è poco importante, dato che non credo si arriverà a milioni di parole memorizzate...questa valeva come opinione per la domanda di Tiziano) a cosa mi serve il paramentro "dimensioni"? Una delle cose utili del dizionario è che è dinamico, quindi i pezzi vengono aggiunti a destra o a sinistra a seconda di quante parole ci sono...come faccio a dare una dimensione ad una struttura che di suo non ne ha?

-- Comment added by EnricoMontesi on 30 Apr 2005


funzione nuovoDizionario(int dimensione);

l'intero dimensione è il numero di chiavi che può contenere il dizionario giusto?

-- Comment added by TizianoFranchi on 30 Apr 2005


dimensione

Sono pienamente d'accordo con te...:)

-- Comment added by TizianoFranchi on 30 Apr 2005


dimensione

E comunque vale anche per l'hash table..non ha proprio senso!!!!a sto punto lo faccio col vettore no???

-- Comment added by TizianoFranchi on 30 Apr 2005


dimensione

Peccato ke, a differenza del vettore, l'albero binario di ricerca sia più veloce nella ricerca e nell'inserimento Tiziano!Soprattutto x grandi dimensioni!!!Ma, a parte questo dettaglio, anke x me il parametro dimensione non ha molto senso...cmq io l'ho implementato ugualmente così: io fisso all'inizio la dimensione massima (e cioè il numero massimo di chiavi che può contenere appunto il dizionario) e poi eseguo il conteggio degli elementi man mano che li inserisco. Nel momento in cui voglio inserire un altro elemento, ma mi rendo conto che il dizionario ha raggiunto il suo massimo, lancio un'eccezione di TABLE_FULL!!!

-- Comment added by DavidBenedetti on 30 Apr 2005


nuovoDizionario()

allora questa funzione che mi restituisce??se il dizionario lo crei mano a mano nell'inserisciValore().(Per quanto riguarda l'albero di ricerca)..mentre se usi l'hash table può ritornare appunto il puntatore all'hash table giusto?

-- Comment added by TizianoFranchi on 30 Apr 2005


dimensione

Basta prevedere un campo int size nella struct dizionario, e incrementarlo nella insert!

-- Comment added by GabrieleTarantino on 30 Apr 2005


nuovoDizionario(...)

Ricordi le lezioni del caro buon "vecchio" professor Tronci Tiziano??? Se tu definisci una struttura nodo per l'albero e poi una struttura dizionario (un handler) che abbia al suo interno il puntatore alla radice dell'albero (e cioè ad un suo nodo di fatto) hai la risposta alla tua domanda? E cioè questa funzione creerà un handler al dizionario (naturalmente un puntatore ad esso) avendone inizializzato i suoi membri...ad esempio, come diceva giustamente Gabriele, il campo dimensione con le dimensioni ke desideri tu, e il numero di elementi contenuti a 0 (x il momento!!!) smile

-- Comment added by DavidBenedetti on 30 Apr 2005


Senza titolo?

"...(e cioè ad un suo nodo di fatto) hai la risposta alla tua domanda?..." Sorry, qui il ? non ci andava!!!

-- Comment added by DavidBenedetti on 30 Apr 2005


Risposte

RE: Ricerca dei 20 token piú distanti da 0.5

Usate il valore assoluto (abs) prima di ordinarli.

RE: Struct dizionario ed il parametro dimensioni

Fate vobis, potete ad esempio usare una funzione che dipende dalle dimensioni fornite.

RE: Stricmp o strcmp ???

Stavolta il confronto è CASE SENSITIVE.

RE: a che serve il parametro "dimensioni"?

a dire quanti elementi ci sono dentro al massimo.

-- Comment added by AndreaSterbini on 30 Apr 2005


Ricerca dei 20 token più distanti da 0.5

Professore, non ho ben capito la risposta...Cioè, ho capito quello ke intende, ma non sono riuscito a trovare la risposta alla mia domanda...Io kiedevo: dobbiamo seguire un qualche particolare criterio per selezionare i 20 token in questione, oppure (una volta ordinati per peso) possiamo sceglierli a nostro piacimento? Ad esempio scegliamo, da quello ke pesa di meno (di più), i 20 token successivi (precedenti)?

-- Comment added by DavidBenedetti on 01 May 2005


ABS(...)

Tra l'altro, mi sembrava di aver capito ke i pesi delle parole variavano da 0.0 a 1.0, e non ke fossero anke negativi!!! (Non ke mi cambi la vita, giusto per kiarimento!)

-- Comment added by DavidBenedetti on 01 May 2005


Pesi con abs(...)

Quando lei dice che dobbiamo utilizzare la funzione abs di valore assoluto prima di ordinare i token, intende dire che i pesi devono essere memorizzati nei campi già come valori assoluti?

-- Comment added by DavidBenedetti on 01 May 2005


vi sono mancato...? :-|

ALR back again! (fischi e verdure marce...)
ho iniziato adesso a vedere la bozza, ho sbattuto un po' la testa contro il muro e mi sono fatto il bozzo; le funzioni del modulo le ho finite, non vorrei dire ma questo modulo effettivamente mi sembra *decisamente*---+ facile degli altri due... (ultime parole famose: l'armadietto fu aperto per il modulo 3 ^_^)
ok, allora prima cosa: David, avevi proprio bisogno delle lezioni di Tron C (il nuovo rivoluzionario linguaggio di programmazione, potenziamento dell'ANSI C) per capire quella cosa? seconda: un dizionario, ched'è, un albero binario di ricerca? terza: effettivamente la storia del parametro delle dimensioni merita una bella accigliata con grattatina di tempia... quarta: chi è che libera la memoria allocata da nuovoDizionario? (non mi dite la main... T___T) quinta: David, che ti lanci TABLE_FULL, il C non ha le eccezioni! o_O (non mi dire che il Tron C ce le ha... T______T) e sesta: perché il confronto è case sensitive? se uno spammer scrive "VIAGRA", "ViAgRa" o "viagra" non è da considerarsi sempre la stessa cosa???

-- Comment added by AlbertoLaRocca on 01 May 2005


x chi implementa l'albero di ricerca:

suggerisco di definire la struct Dizionario come un'unione di due struct: la prima versione contiene dati tipo la dimensione massima e il puntatore alla root, mentre la seconda versione è di fatto un nodo dell'albero contenente puntatore alla chiave, valore e puntatori ai figli; secondo me è la soluzione migliore, visto che alcune funzioni (tipo cercaValore) devono essere ricorsive e come parametro dovrebbero avere un puntatore a un nodo, e invece hanno un puntatore a struct Dizionario. considerate inoltre che secondo me il dizionario (allocato dalla main) potrà essere liberato solo (dalla main) facendo free(d), quindi se voi allocate ciascun nodo in spazi separati la free libererà solo la root o quello che è; di conseguenza nuovoDizionario deve allocare uno spazio lineare grande abbastanza da contenere un numero di nodi (opportunamente linkati) pari a dimensioni.

-- Comment added by AlbertoLaRocca on 01 May 2005


unione

x "unione" ovviamente intendevo una union del C, non era un termine generico.

-- Comment added by AlbertoLaRocca on 01 May 2005


Chiarimenti...

A parte il fatto ke ricordavo il prof Tronci a Tiziano solo per non star lì a provare a spiegare tutta la roba che hai detto tu e riskiare poi ke poveretto nn ci capisse niente perké nn mi ero saputo spiegare: almeno pandava a riguardarsi gli appunti e rimuginava. E poi quello ke hai detto tu (la suddetta "roba") è esattamente quello ke ho detto io poco sopra...anke se forse spiegato male, nn pretendo nulla! In più NON NECESSARIAMENTE cercaValore dev'essere ricorsiva perché c'è un modo molto semplice (e anke lineare, dipendente dall'altezza massima dell'albero) per la ricerca in modo iterativo. Poi, scusa, ma se devi allocare un albero binario, come fai all'inizio ad allocare in nuovoDizionario uno spazio lineare??? NB = Non lo sapevo (quindi grazie x avermelo fatto nortare), ma il Deitel & Deitel parla anke di eccezioni (e gestione di esse) nel C!!!

-- Comment added by DavidBenedetti on 01 May 2005


Ancora per il parametro "dimensione"

Per quanto riguarda la ricerca su albero binario...se non mi ricordo male altro che lineare, veniva addirittura in LogN (battibile giusto dalla tabella Hash che ce la fa in O(1), poiché costnte). A parte questo, però, che tutto sommato a poco a che vedere col resto, io quando credo il dizionario alloco lo spazio solo per la "radice" (il mio dizionario è un albero binario di ricerca). Non potrei mai allocare altri spazi, poiché non saprei come agganciarli alla radice, dato che non potrei sapere preventivamente quanti figli destri o sinistri l'albero avrà (e fare un albero bilanciato è un suicidio per quanto riguarda il fattore tempo e complessità). A questo punto il termine dimensione potrei inserirlo nei nodi dell'albero...ma vorrebbe dire che ogni albero ha un campo "dimensione"...uno spreco di spazio immondo. Le idee migliori che mi vengono sono:

1) Creo una variabile "dimensione" globale (poiché non posso passarla a "nuovoDizionario" date le specifiche della funzione) e la faccio puntare solo dal nodo padre (mi sembra una soluzione veramente stupida e insensata, però)

2) Creo l'albero in modo che abbia tra i vari campi anche il campo "dimensione"...ma inizializzo con il giusto valore solo quello che appartiene alla radice, mentre tutti i nodi figli avranno il campo "dimensione" a NULL. In questo modo lo spreco di spazio su disco dovrebbe essere minimo.

Qualcuno di voi ha idee più intelligenti?

-- Comment added by EnricoMontesi on 01 May 2005


Souzione personale...

Quello ke ho fatto io, Enrico, è creare una struttura Dizionario ke abbia il puntatore alla radice dell'albero, il campo dimensione (massima) e il campo elementi, ke si aggiorna ogni qualvolta inserisco un nuovo nodo; e poi la struttura "nodo" ke contiene la chiave, il peso e i puntatori ai figli (destro e sinistro). Il campo dimensione lo inizializzo quando kiamo nuovoDizionario(...) con il valore che gli passo...in questo modo il Dizionario sa già a priori la sua capacità massima e, quando kiami inserisciValore(...), basta ke prima controlli se il numero di elementi contenuti dal Dizionario è uguale alla sua capacità massima e, se così, resituisci TABLE_FULL!

-- Comment added by DavidBenedetti on 01 May 2005


x David, varie

per l'albero binario di ricerca hai ragione, si può fare un algoritmo lineare, non ci avevo pensato!! smile però non posso concordare sul fatto che sia più semplice: più veloce sicuramente, e anche meno gravoso per lo stack (quindi 1 ottima cosa), ma più semplice da realizzare non penso proprio :P
poi x quanto riguarda le eccezioni: x curiosità, come dice di fare il D&D per gestirle in C? io sapevo che esistevano solo nel C---++, a parte il fatto che Ms le ha portate anche nel C con le sue estensioni (si è presentta la necessità in quanto Windows, per compatibilità, è stato sviluppato in C, ma le eccezioni vengono usate e sono anche molto importanti)

x quanto riguarda l'allocazione dell'albero, x EnricoMontesi e x chi implementa il dizionario in forma di albero binario di ricerca: il prof (che scrive la main) non sa com'è fatta la struct "Dizionario", perciò l'unico modo che ha per deallocare il dizionario è free(d) dove ovviamente "d" è un puntatore a un dizionario; se vuoi evitare memory leaks è necessario fare in modo che la free liberi l'intero dizionario, cioè fare in modo che tutto il dizionario sia contenuto in un unico blocco dell'heap; questo blocco naturalmente viene allocato dalla nuovoDizionario, e calcolarne la dimensione è semplice:
dimensione * sizeof(struct Dizionario)
no?

-- Comment added by AlbertoLaRocca on 01 May 2005


formato file errato

professore, ma se il formato di una linea del file dei tokens è errato (ad esempio se una linea contiene un token ma non contiene nessuno spazio e nessun valore) interrompiamo la lettura e cosa ritorniamo, BAD_MATCH?

-- Comment added by AlbertoLaRocca on 01 May 2005


Allocazione memoria ed eccezioni...

Il D&D nn parla della gestione delle eccezioni, ma parla delle eccezioni in quanto tali (ad esempio divisione per 0, segmentation fault, ecc...), e cmq, adesso ke ci penso, si possono gestire con la libreria signal.h attraverso una specie di catch effettuato dalla funzione signal che intercetta dal sistema qualsiasi tipo di interrupt di eccezione generato...(xlomeno se me la ricordo bene). Per quanto riguarda l'allocazione della memoria nn hai torto quando dici giustamente ke il professore nn sa come abbiamo implementato il dizionario, ma nn vedo xké allora dovremmo scervellarci a fare un albero binario di ricerca quando potremmo farlo direttamente in un array allocando memoria con il calcolo ke hai detto tu...nn mi sembra abbia senso...si vede ke il professore abbia già considerato questa ipotesi...oppure ce ne dobbiamo preoccupare noi una volta effettuato il calcolo del peso della mail, quindi da dentro calcolaPeso(...)....nn so...Per l'algoritmo di ricerca iterativo pensaci meglio...dammi retta!!! smile

-- Comment added by DavidBenedetti on 01 May 2005


di nuovo allocazione lineare dell'albero binario

professore, mi sono accorto che per evitare memory leaks è necessario allocare anche le stringhe contenenti le chiavi degli elementi nello stesso blocco dell'albero; questo però purtroppo rende difficile il calcolo della dimensione del blocco in base al numero massimo di elementi, anzi più che difficile diciamo impossibile, visto che non c'è modo di farlo in quanto noi non possiamo conoscere inizialmente la dimensione delle singole stringhe; quindi propongo di modificare leggermente il significato del parametro della funzione nuovoDizionario (solo per chi implementa l'albero): possiamo stailire che il parametro rappresenta la dimensione massima del blocco espressa in bytes, non in numero di elementi.

-- Comment added by AlbertoLaRocca on 01 May 2005


algoritmo iterativo di ricerca

ho appena finito di modificare la inserisciValore e la cercaValore sostituendole con implementazioni iterative: ti assicuro che le soluzioni ricorsive erano concettualmente più semplici, non scherzo!! è una legge fondamentale della realtà: se guadagni da qualche parte, perdi necessariamente da qualche altra: se in un algoritmo guadagno in termini di prestazioni e consumo di risorse, perdo in termini di semplicità! no? smile

-- Comment added by AlbertoLaRocca on 01 May 2005


iterazione e ricorsione...

Per quanto riguarda la inserisciValore(...) hai ragione, ma infatti non avevo parlato di quella! Per quanto riguarda la ricerca sono in disaccordo...cmq è meglio se affrontiamo questo discorso al di fuori di Twiki Alberto...1)così il professore nn perde tempo 2)così i nostri colleghi nn perdono tempo 3)così nn incasiniamo il forum...

PS = Enrico hai ragione, la ricerca in un albero binario è tutt'altro ke lineare, ma è logN, ho sbagliato...x quanto riguarda la battibilità di questo metodo con quello dell'hashtable, se ben ricordo, nn mi sembra proprio vero (xlomeno nn sempre). In un hashtable hai un vettore di puntatori a liste e se devi ricercare un elemento in una posizione in cui ci sono state molte collisioni dovrai scandire (al peggio) tutta la lista (e cioè N elementi) x avere una risposta. Poi, certo, se l'hashtable è priva di collisioni, è un altro paio di manike!!!

-- Comment added by DavidBenedetti on 01 May 2005


scartate le unioni (peccato, erano carine:) )

ora che ho trovato questi algoritmi iterativi e li ho sostituiti a quelli ricorsivi, vedo che non c'è più bisogno di definire i nodi dell'albero e il suo... "control block" (chiamiamolo così) in una stessa unione contenuta nella struct Dizionario, ma è possibile farlo in due strutture diverse; il "control block" (ovvero la struct che contiene il puntatore alla root e la dimensione massima) l'ho definito come la struct Dizionario, e i nodi li ho definiti in un'altra struct a parte.

-- Comment added by AlbertoLaRocca on 01 May 2005


iterazione e ricorsione

ora non esageriamo David, smile non mi sembra proprio di essere OT stavolta (a patto che lasciamo perdere la filosofia); aggiungo che l'algoritmo della inserisciValore è "simìllimo" (gh ^^) a quello della cercaValore, perché anche là si tratta semplicemente di una ricerca: per inserire un valore devi cercare la sua ipotetica posizione e crearla, diciamo così; quindi come complessità è analogo.

-- Comment added by AlbertoLaRocca on 01 May 2005


iterazione e ricorsione...

Sicuro sicuro...??? E' la tua risposta definitiva? La accendiamo?

-- Comment added by DavidBenedetti on 01 May 2005


ecco: quello era ot smile

-- Comment added by AlbertoLaRocca on 01 May 2005


ancora sul formato del file dei tokens

se in una linea il token è separato dal valore da tabulazioni anziché da spazi, il formato è da considerarsi ancora valido? ed è valido anche quando si incontrano numerosi spazi e tabulazioni mischiati insieme?

-- Comment added by AlbertoLaRocca on 01 May 2005


formato del file di tokens...

Domanda alla quale nn so affatto cosa rispondere...anke se a intuito potrei dirti ke nn si dovrebbero considerare errori del genere visto ke né nelle specifiche è stato detto né nel .h sono stati definiti dal professore errori ke segnalino situazioni del genere...l'ultima parola cmq sta al professore...

-- Comment added by DavidBenedetti on 01 May 2005


ancora sul formato del file dei tokens

mi sembra difficile che si presentino errori di formato in un file scritto dal programma stesso...

-- Comment added by GiovanniColombi on 01 May 2005


ancora sul formato del file di tokens...

Si, in effetti mi pare di aver capito che nel modulo 4 dovremmo proprio generare questo file...hai ragione Giovanni.....

-- Comment added by DavidBenedetti on 01 May 2005


Formato dei tokens, complessità e dimensioni

Risposta generale (e ancora qualche perplessità). Per quanto riguarda il formato dei Tokens, dato che era l'argomento principale del primo modulo io direi che tutte le eccezioni ed i problemi venivano affrontati lì, no? Darei per scontato che il file che arriva è corretto (a parte i soliti errori di stringa vuota o nulla), altrimenti dobbiamo di nuovo ripetere le funzioni del primo modulo. Per quanto riguarda la complessità delle hashtable...questa, se fatta bene, è una struttra grazie alla quale puoi inserire ogni voce in maniera unica, grazie ad un calcolo matematico che adesso non ricordo (e non mi va sinceramente di andarlo a cercare ^^). Questo ci permette di far si che, nel caso dovessimo ricercare una voce, possiamo semplicemente rifare il calcolo sopracitato sulla suddetta voce (un calcolo anche se complicato ha sempre una complessità costante, e quindi O(1)) e quindi avere la posizione esatta della parola da noi ricercata...di conseguenza non dobbiamo scorrere nessun vettore ma andare direttamente nella posizione trovata...quindi un altro O(1). Complessità finale: O(1)---+ O(1) = O(1). Per quanto riguarda la creazione del dizionario credo che alla fine anche io creerò un struttura che punta alla radice, i vari nodi saranno un'altra struttura.

-- Comment added by EnricoMontesi on 02 May 2005


Valore "dimensioni" errato

E se il valore della variabile "dimensioni" è un valore negativo o vale zero, nel momento in cui lo passiamo a "nuovoDizionario" come facciamo a farci restituire errore, dato che la funzione non torna un intero? Per me le possibilità sono 3:

1) La funzione che chiama "nuovoDizionario" effettua il controllo della variabile "dimensioni", in modo da poter far si che l'unico errore all'interno della funzione possa essere fatto dalla malloc. A questo punto in caso di MEM_ALLOC_ERROR semplicemente "nuovoDizionario" tornerò NULL, e la funzione chiamante saprà che se le viene tornato NULL vuol dire che l'allocazione di memoria è andata male per qualche motivo (mi sembra la soluzione migliore).

2) La funzione nuovoDizionario controlla se il valore di "dimensioni" è valido, altrimenti torna NULL e la funzione chiamante saprà che tale valore di ritorno implica un'errata dimensione. In questo modo però come facciamo a restituire l'eventuale errore di allocazione di memoria?

3) qualsiasi tipo di errore fa si che la "nuovoDizionario" torni "UNKNOW_ERROR". Mi sembra però uno schifo di soluzione...non fa capire nulla del perché c'è stato un errore.

-- Comment added by EnricoMontesi on 02 May 2005


perplessità su "calcoloPeso"

Nella descrizione della funzione "calcoloPeso" c'è un accenno alla "formula descritta a lezione". Dato che nella citata lezione io non c'ero, volevo sapere quale fosse (sempre che non sia banalmente ciò che c'è scritto poco dopo sempre nella descrizione della funzione). Qualcuno potrebbe gentilmente riscriverla qui, dato che credo sia di interesse per tutti coloro che non erano a lezione? Grazie ^^

-- Comment added by EnricoMontesi on 02 May 2005


formula x il calcolo del peso

io non me la ricordo x niente, ma penso cmq che stia in attachment (Sterbini dovrebbe aver messo in attachment tutte le sue lezioni, no?)

-- Comment added by AlbertoLaRocca on 02 May 2005


chi gestisce gli errori?

per evitare che ci siano dubbi e che i test non funzionino su altri codici, non sarebbe meglio definire da subito quale funzione deve controllare quale errore?

-- Comment added by GabrieleTarantino on 02 May 2005


Risposte

RE: ABS(...)

... ma che dici! ... abs della differenza da 0.5 !

RE: disallocazione

Grazie Alberto, me ne ero dimenticato, aggiungo il deallocatore (distruttore)

RE: case sensitive

mi pare di aver letto che conviene essere case-sensitive, e visto che non cambia molto ...

RE: Ancora per il parametro "dimensione"

preferisco che non usate variabili globali non necessarie

l'idea di DB non spreca memoria

RE: formato file errato

stavolta presumiamo che il file sia corretto.

RE: Allocazione memoria ed eccezioni...

Con signal si riescono a acchiappare diversi errori ma non c'e' la possibilità di passare velori (oggetti) che comunicano attraverso i dettagli dell'errore al catch. C---++ e Java da quel lato sono una meraviglia.

C'e' chi ha fatto una libreria per gestire eccezioni in C ma non l'ho provata a fondo.

NON fate un array semplice, che ci guardo e vi annullo l'esercizio.

RE: di nuovo allocazione lineare dell'albero binario

no, dimensione è il numero di elementi del dizionario/alberodiricerca/hastable.

RE: algoritmo iterativo di ricerca

A me viene sempre spontaneo riscrivere le funzioni iterative come ricorsive ...

... devo aver programmato troppo in lisp e prolog ... smile

RE: scartate le unioni (peccato, erano carine:) )

Era un po' che DB lo stava suggerendo wink

RE: ancora sul formato del file dei tokens

Stavolta preferirei rimanere su una difficoltà più "umana" del modulo2.

[OT] eliminaTagsInvisibili si riesce a scrivere usando rimpiazzaEspressioneRegolare anche per i tags nidificati ... che forza!!!

RE: Valore "dimensioni" errato

... mmmhhhh mi sa che devo far tornare un codice anche lì ...

RE: perplessità su "calcoloPeso"

ma le slides che ce le ho messe a fare su twiki?

-- Comment added by AndreaSterbini on 02 May 2005


slides

...adesso sarò rincitrullito io...ma le uniche slides che mi visualizza la pagina di laboratorio di programmazione (per la cronaca quella da cui si può accedere anche ai vari moduli) mi mostra solo 2 slides risalenti entrambe a Marzo...

-- Comment added by EnricoMontesi on 03 May 2005


slides

e infatti la formula l'abbiamo vista a marzo...

-- Comment added by AlbertoLaRocca on 03 May 2005


AIUTO!

..stò in crisi qualcuno per piacere mia dia una mano..qui di seguito riporto i quesiti che mi stanno ossessionando..e spero vivamente che qualche anima pia mi possa dare una mano..

1.Nella funzione nuovoDizionario i codici di errori non devono essere gestiti?cioè.. nel caso si presentivo problemi e/o incovenienti quali, uno a caso, "dimensioni" negativo, bisogna ritornare sempre NULL?..è un pò ambigua come cosa..

2.Nella funzione inserisciValore si deve ricercare una chiave e se trovata inserire il valore..fin qua ok! ma se la chiave non è presente nel dizionario la funzione deve aggiungerla oppure deve restituire il codice d'errore KEY_NOT_FOUND? ..e se la chiave è presente và aggiunto il valore alla lista o ritornare il codice DOUBLE_KEY_FOUND? in ultimo visto che tra i parametri che riceve la funzione non è presente la dimensione del vettore del dizionario, durante la ricerca di una chiave come posso capire che il vettore è terminato?(e nel caso, se il vettore è pieno ritornare TABLE_FULL)?

..mi scuso per gli eventuali errori..spero di aver formulato le domande in maniera più chiara possibile.. e ringrazio sin da ora coloro che mi presteranno un pò di attenzione..Cordiali Saluti..

-- Comment added by DavideFacente on 03 May 2005


Re: AIUTO!

ehm, a parte tutto cmq vorrei farti notare che il professore ha esplicitamente vietato di implementare il dizionario come un vettore: o alberi binari o hash table! se lo fai come un vettore lui quando controlla il codice se ne accorge e ti caxxia ^^

-- Comment added by AlbertoLaRocca on 03 May 2005


RE: algoritmo iterativo di ricerca

be', prof., si abitui a fare il contrario allora: :P in genere gli algoritmi iterativi sono preferibili a quelli ricorsivi per almeno due motivi:
  • non gravano sullo stack
  • nel caso in cui l'operazione sia eccessivamente prolungata gli algoritmi iterativi possono essere facilmente interrotti (basta aggiungere un controllo nella condizione del ciclo) e l'errore può essere gestito, e soprattutto non causano un crash, a differenza di quelli ricorsivi che causano facilmente lo stack overflow

-- Comment added by AlbertoLaRocca on 03 May 2005


AIUTO!

Non penso di aver capito bene cosa intendi riguardo alla funzione inserisciValore(...) Davide...A quanto ho capito la funzione inserisce nel dizionario un nuovo nodo che avrà come chiave la stringa e come valore il double in entrata...Ma non deve cercarla prima...Anke xké poi nelle specifiche c'è scritto ke "...se la kiave è già presente si torni DOUBLE_KEY_FOUND...". Non so se ho capito bene o meno, fatto sta che, rileggendo le specifiche, mi sembra di capire così...

-- Comment added by DavidBenedetti on 03 May 2005


calcolaPeso(...)

Professore, non riesco affatto a capire come si calcolano i pesi delle parole...soprattutto quando parla del calcolo della deviazione delle parole (immagino parli dei token!) da 0.5...Potrebbe spiegarlo terra terra (x me, povero tapino!)?

-- Comment added by DavidBenedetti on 03 May 2005


Chiavi del dizionario: Ordine

Possiamo gestire il dizionario (mi riferisco all'ordine delle chiavi) a nostro piacimento? Io ho pensato ad esempio di creare un numero costante di buckets pari al numero di lettere dell'alfabeto, e di inserire le chiavi sempre in ordine alfabetico. Abbiamo, come immagino, tutta questa libertà di scelta o dobbiamo seguire qualche specifica?

-- Comment added by MassimilianoNatale on 03 May 2005


Dubbio...

Inizio a pensare di non aver capito un emerito ca...volo di questo modulo.....:(

-- Comment added by DavidBenedetti on 03 May 2005


nuovoDizionario: problema con il valore tornato

Ma siamo sicuri che la funzione nuovoDizionario() ,che alloca lo spazio per un array di puntatori che poi andranno a formare le liste, debba tornare un valore di tipo struct Dizionario *? Volendo implementare il dizionario tramite hash table sto trovando un pò di problemi con questa funzione

-- Comment added by MassimilianoNatale on 04 May 2005


passaggio di puntatori

Sono un po' perplesso da una cosa che mi succede nella funzione nuovoDizionario. Innanzitutto sarei grato se qualcuno riuscisse a spiegarmi l'errore di compilazione

14 C:\Dev-Cpp\dizionario.h [Warning] useless keyword or type name in empty declaration

oltre a ciò il mio programma non salva i cambiamenti. Mi spiego meglio, io passo una variabile di tipo "struct Dizionario *" a "nuovoDizionario". Al suo interno viene allocata la memoria e quindi creata la struttra. In questa struttura c'è anche un campo "int" in cui viene memorizzato il valore di "dimensioni". Quando però si esce dalla procedura e si torna nel main, il valore il precedente intero non è più uguale a "dimensioni", bensì ha un valore random tipico delle variabili non allocate o non inizializzate. Non riesco a capire come sia possibile che il valore non venga memorizzato se io passo effettivamente il puntatore, e non solo il valore.

-- Comment added by EnricoMontesi on 04 May 2005


AIUTO BIS

...`corregetemi se sbaglio..partendo dal presupposto che io sto cercando di implementare il dizionario con l`hashtable..(dove l`hashtable e' un vettore di puntatori a liste).. in pratica se mi ritrovo la stessa chiave vado a incrementare la lista e ritorno il codice..mentre se la chiave non e` presente l`asggiungo alla tabella e ritorno RESULT_OK!!giusto?..David scusami ma come faccio a ritornare il codice d`errore DOUBLE_KEY_FOUND se nn faccio prima una ricerca della chiave???..cmq gia` il fatto di aver capito piu` o meno cosa deve fare la funzione mi solleva...almeno posso iniziare a smanettare..fatto sta` che con tutto il rispetto, il pdf che ha tirato su il prof. per me e` un po ambiguo..o forse sono rinc*****ito io e/o ingorante(non escludo l`ultima ipotesi)..cmq resta ankora da svelare il mistero di cosa deve tornare nuovoDizionario..mbha..vedremo!..e il tempo passa..aspetto notizie..Cordiali Saluti..

PS. Alberto hai ragione niente vettore.. frown PPS. Non e che avete Msn ho simili?..magari ci si scambia il contatto!

-- Comment added by DavideFacente on 04 May 2005


Risposte

RE: AIUTO!

[bel titolo utile smile ]

  1. nuovoDizionario torna NULL se qualcosa non funziona.
  2. inserisciValore torna errore solo se la chiave è già presente (o un parametro fa schifo), sennò la inserisce e torna RESULT_OK
  3. basta che ti ricordi il valore passato alla nuovoDizionario

[OT] algoritmo iterativo di ricerca

Visto che il tempo-macchina costa molto meno del tempo-uomo, continuo a scrivere funzioni ricorsive, meglio manutenibili. wink

RE: calcolaPeso(...)

Ho aggiornato le bozze che descrivono il progetto, ora il calcolo da fare dovrebbe essere più chiaro.

RE: Chiavi del dizionario: Ordine

Avete completa libertà sia nell'implementazione (ma senza usare un semplice vettore) sia per le strutture che per la funzione di hash.

RE: Dubbio...

[che bel subject ... e che bella domanda chiara! smile ]

RE: nuovoDizionario: problema con il valore tornato

potresti incapsulare la tua hashtable in una struct Dizionario definita appropriatamente ....

RE: passaggio di puntatori

nuovoDizionario NON riceve un puntatore, bensì un intero che indica quanti elementi si potranno inserire nel dizionario.

Deve allocare una struct Dizionario (definita da te) e tornarla.

-- Comment added by AndreaSterbini on 04 May 2005


AGGIORNAMENTO

Ho aggiornato i files in attachment al ModuloTre.

I cambiamenti sono minimi, spero di aver chiarito abbastanza bene il conto da fare.

-- Comment added by AndreaSterbini on 04 May 2005


[OT] algoritmi iterativi di ricerca

anche questo è vero, però stando a quanto dice DB gli algoritmi iterativi sono più semplici smile

-- Comment added by AlbertoLaRocca on 04 May 2005


algoritmo iterativo di ricerca...

il sottoscritto DB non ha mai detto una cosa del genere...l'unica cosa ke ho detto e' ke l'algoritmo di ricerca NON NECESSARIAMENTE deve essere ricorsivo...punto. Ke poi ho detto anke ke sia semplice e' una cosa un pokino diversa.....!!!

-- Comment added by DavidBenedetti on 04 May 2005


errore di compilazione

Ragazzi, scusate se torno con questa domanda ma è una cosa che mi lascia veramente perplesso ed una risposta sarebbe veramente gradita. In fase di compilazione mi viene dato questo errore:

14 C:\Dev-Cpp\dizionario.h [Warning] useless keyword or type name in empty declaration

Ovviamente in quanto "warning" permette comunque di poter far girare il programma, ma non riesco a comprenderne il significato. Qualcuno di voi ha mai incontrato una cosa simile?

-- Comment added by EnricoMontesi on 04 May 2005


errore di compilazione...

ad okkio potrei solo provare ad indovinare: forse ha qualcosa a ke vedere con un tipo di dato (magari dikiarato da te)...xo' non so cos'altro dire...se vuoi, porta il codice in classe ke provo a darti una mano...!

-- Comment added by DavidBenedetti on 04 May 2005


Parametro dimensione

..visto che la funzione inserisciValore non riceve un parametro dimensione come faccio a calcolare il valore hash della chiave così da poter inserire la chiave e il relativo valore all interno dell'hashtable??? e più precisamente dentro la medesima funzione inserisciValore come faccio a capire quanto è grande l'hashtable visto che appunto, non è presente nessun parametro dimensione? ..il prof. mi ha risposto dicendomi "basta ricordare il valore passato alla nuovoDizionario"(ma non mi ha chiarito molto le idee..)..e io ho pensato:si ok ma se nelle altre funzione non ho nessun riferimento a quel parametro come posso utilizare il valore presente in quel parametro e quindi appunto sapere la dimensione dell'hashtable?..voi come avete fatto?? cioè stò sclerando di brutto..Cordiali Saluti

-- Comment added by DavideFacente on 04 May 2005


scanf() e derivate per i valori double

Qualcuno può dirmi come chiamare la scanf() per la lettura dei valori double? Domanda un pò stupida però leggendo il valore tramite scanf("%f") (come faccio) mi porta per ogni chiave l'assurdo numero che è -0.000000... Da cosa può dipendere?

-- Comment added by MassimilianoNatale on 05 May 2005


scanf() e derivate per i valori double

non usare scanf, usa atof, è più appropriata.

-- Comment added by AlbertoLaRocca on 05 May 2005


Parametro dimensione...

Nella frase: "basta ricordare il valore passato alla nuovoDizionario" il professore ti ha praticamente dato la soluzione su un piatto d'argento Davide. Per 'ricordare' la dimensione basta ke consideri il Dizionario come un 'qualcosa' ke ha la facoltá di ricordare...!!!

-- Comment added by DavidBenedetti on 05 May 2005


errata corridge in "freeDizionario"

C'è un errore nella dichiarazione di "freeDizionario" all'interno di "modulo3.h" Il parametro che le viene passato è:

"Dizionario * dizionario"

mentre credo debba essere:

"struct Dizionario * dizionario"

Professore può confermare?

-- Comment added by EnricoMontesi on 05 May 2005


Risposte

RE: errore di compilazione

che ne dici di farci sapere cosa c'e' scritto sulla misteriosa riga 14 del file dizionario.h ?

RE: Parametro dimensione

"basta ricordare il parametro dimensione" vuol dire: aggiungi un campo al tuo dizionario e ficcaci la dimensione quando lo crei.

RE: errata corridge in "freeDizionario"

I casi sono due: o usate una typedef o scrivete struct Dizionario, controllo e correggo il .h

-- Comment added by AndreaSterbini on 05 May 2005


int calcolaPeso(...)

Il primo parametro è di tipo Token, quindi se il tokens->contesto è uguale a NULL come chiave prendiamo direttamente la stringa tokens->parola, altrimenti ci dobbiamo ricostruire la chiave in questo modo: tokens->parola---+ "*" + tokens->contesto. Esempio: "From*andrea" giusto??

-- Comment added by TizianoFranchi on 05 May 2005


errata corridge in "freeDizionario"

"che ne dici di farci sapere cosa c'e' scritto sulla misteriosa riga 14 del file dizionario.h ? "

E anche lei ha ragione! Comunque ho risolto...scoprendo di essere un deficiente! Il povero compilatore mi dava quel warning perché io dichiaravo le strutture usando "typedef struct", senza però rinominare la struct ala fine della dichiarazione. Ovviamente, dato che in tutti i prototipi di funzioni dateci Dizionario viene dichiarato come "struct", ho scelto di eliminare il typedef, poiché sarebbe inutile rinominarlo se poi tanto in tutte le funzioni devo dichiararlo con "struct". Di conseguenza, comunque, il warning è scomparso.

-- Comment added by EnricoMontesi on 05 May 2005


errata corrige in "freeDizionario"

Sì, quell'errore lo dà anche a me

-- Comment added by MassimilianoNatale on 06 May 2005


int calcolaPeso(...)

Si, almeno io ho fatto così Tiziano...!!!

-- Comment added by DavidBenedetti on 07 May 2005


int calcolaPeso(...)

per il calcolo di bad e good come bisogna fare??? Da quello che ho capito si prendono i primi 20 tokens che hanno valore più alto e si calcola bad come il prodotto di tutti i valori, mentre good si fa il prodotto di 1 - il valore, che però sono gli stessi sia nel calcolo di bad che nel calcolo di good giusto?? oppure dobbiamo prendere i 20 valori più alti per bad e i 20 valori più bassi per good??

-- Comment added by TizianoFranchi on 07 May 2005


int calcolaPeso(...)

Dovrebbero essere gli stessi 20 token in entrambi i casi Tiziano.....!

-- Comment added by DavidBenedetti on 07 May 2005


20 token più distanti da 0.5...

Professore, ma se ci capitasse una situazione in cui abbiamo meno di 20 token diversi, come facciamo a prendere i famosi 20 token??? Se il loro numero è minore (o uguale) a 20 li prendiamo tutti o ne consideriamo meno?

-- Comment added by DavidBenedetti on 07 May 2005


abs(...) e fabs(...)

Professore, visto che lavoriamo con numeri in virgola mobile per elaborare i pesi delle parole, avrei pensato ad usare la funzione fabs(...), che calcola i valori assoluti dei double...invece abs(...) lo calcola per gli interi...(infatti non capivo perché, usando quest'ultima, mi veniva sempre 0 il peso della mail)...conferma???

-- Comment added by DavidBenedetti on 07 May 2005


calcolaPeso(...)

In questo caso Professore, è necessario il calcolo del valore assoluto del peso ottenuto dai calcoli oppure no?

-- Comment added by DavidBenedetti on 07 May 2005


calcoloPeso()

scusa david ma la funzione fabs() come mai bisogna usarla?? i valori dei tokens non sono tutti positivi??

-- Comment added by TizianoFranchi on 07 May 2005


calcolaPeso(...)

Si, ma il fatto è ke, x fare il calcolo del loro peso, devi vedere quei 20 fra tutti loro distano di più da 0.5 ( e cioè fabs((valore * occorrenze) - 0.5) )...ecco ke, quindi, potresti ritrovarti dei valori negativi...!!!

-- Comment added by DavidBenedetti on 07 May 2005


problemi se ci sono troppi tokens

Ho notato una cosa, se ci sono troppi tokens, le produttorie per ottenere i punteggi di Bad e Good tendono ovviamente a zero (essendo produttorie di numeri compresi tra 0 e 1). Se questa tendenza supera la precisione che riesce a gestire la variabile double otterremo dei valori Bad: 0.000000 e Good = 0.000000 Quando quindi andremo a fare il calcolo di peso=bad/(good---+bad) faremo una divisione per zero...ed ovviamente il calcolatore si arrabbierà. Che facciamo quindi? Se otteniamo un valore di bad e good (entrambi, poiché tanto se ce n'è anche uno solo maggiore di zero il problema non sussiste più) uguale a zero ritorniamo "INVALID_PARAMETER"?

-- Comment added by EnricoMontesi on 07 May 2005


divisione per 0....

Quello ke dici è vero Enrico, xò pensa anke al fatto ke dobbiamo considerare solamente 20 tra tutti i token ke ci arrivano dalla email (e tutti diversi), e li scegliamo fra quelli ke distano maggiormente da 0.5, perciò si presume ke quei 20 abbiano un peso compreso tra 0.5 e 0.2-0.1...penso...ma cmq mi stavo facendo la stessa (lecitissima) domanda!

-- Comment added by DavidBenedetti on 07 May 2005


Risposte

AGGIORNAMENTO di freeDizionario

Ho aggiornato modulo3.h e Modulo3.pdf aggiungento lo struct che mancava.

RE: int calcolaPeso(...)

Esatto, la chiave è parola oppure contesto*parola

RE: int calcolaPeso(...)

Sono gli stessi valori, se ci fai caso in quei valori trovi sia i più SPAM (più alti) che i più HAM (più bassi)

RE: 20 token più distanti da 0.5...

Se avete meno di 20 tokens scegliete quelli che mancano casualmente.

[ma che ho fumato oggi?]

NO: se avete meno di 20 token fate i conti con quelli che avete.

RE: abs(...) e fabs(...)

Mi sembra sensato.

RE: problemi se ci sono troppi tokens

Mi pare di ricordare dalle prime slides che vi mostrai tanto tanto tempo fa che i pesi sono sicuramente maggiori di 0 e minori di 1.

RE: Attenti ai pesi

Il peso da usare nella produttoria è quello che sta nel dizionario, e NON gli va sottratto 0.5 (a parte per trovare i più lontani da 0.5)

-- Comment added by AndreaSterbini on 08 May 2005


Problema pesi

Allora, capiamoci bene (soprattutto tu, David...mi hai messo una pulce nell'orecchio grossa quanto un elefante!) e cerchiamo di evitare che qualcuno (tra cui me) capisca male questo modulo. Leggo dalle specifiche che non sono sempre e solo i primi 20 tokens, bensì c'è scritto che tutti i tokens che hanno lo stesso valore del ventesimo devono far parte della produttoria (sul PDF c'è erroneamente detto che vanno "sommati" anche loro, mentre in realtà devono essere "moltiplicati", fate attenzione a non sbagliarvi) anche se in questo modo superiamo i 20 tokens, quindi se abbiamo 20 tokens con un valore uguale al ventesimo ecco che usciremo dalla tolleranza dei double...o è possibile che io mi stia sbagliando ed anche con un totale di 40 o 50 tokens con cui fare la produttoria non si uscirà mai da tale tolleranza? (ricordo che il numero 0.0000009 non può essere visto da un double, poiché può tener conto di sole 6 cifre dopo lo 0), quindi il nostro double darà come risultato 0.000000, poiché troncherà l'ultima cifra. Io ho provato con 22 tokens, ed il risultato è stato Bad = 0.000000 e Good = 0.000003 Possibile che aggiungendo altri dieci tokens non si superi la precisione del double?

-- Comment added by EnricoMontesi on 08 May 2005


attenti ai pesi

quindi li devo ordinare facendo (occorrenze*peso)-0.5 ma per trovare bad e good devo fare il calcolo con occorrenze*peso

-- Comment added by TizianoFranchi on 08 May 2005


E sempre per quanto riguarda i pesi

X quanto riguarda la domanda di Tiziano direi decisamente di si (ho letto e riletto le specifiche e sono abbastanza convinto di ciò). Ho però un dubbio sulla definizione di "prendere i primi 20 tokens diversi" che viene data nel PDF. Nella mia testa prendere i primi 20 tokens diversi vuol dire prendere i primi 20 tokens che hanno parole diverse (dato che i tokens sono fatti solamente da parole) per esempio se ci sono tra i primi 20 ben 2 tokens = "pippo", ne prenderò uno solo. Il problema è che poi si parla di lavorare sui valori e di prendere i successivi valori uguali al ventesimo...quindi mi viene il dubbio che per "i primi 20 tokens diversi" si intendano i primi 20 che abbiano valore diverso (quindi "pippo" = 0.8 e "viagra = 0.8" non verranno presi entrambi, ma solamente uno). Professore, può specificare bene quale dei due modi è quello giusto? Devo prendere i primi 20 tokens diversi osservando le parole o i valori?

-- Comment added by EnricoMontesi on 08 May 2005


E sempre per quanto riguarda i pesi

Io direi che la cosa più sensata da fare è questa!! i primi 20 tokens diversi li prendiamo in base alla parola, mentre una volta preso il ventesimo dobbiamo vedere se i successivi hanno lo stesso valore..il prodotto perciò andrà avanti fino a quando non troveremo il primo token con peso diverso!!

-- Comment added by TizianoFranchi on 08 May 2005


per il calcolo di bad e good

ma per calcolare bad bisogna fare bad * (peso * occorrenze) e per calcolare good bisona fare good * ((1-peso) * occorrenze)???? bad quasi sempre mi viene 0 anche se nell'array tokens ci sono molte occorrenze di token che indicano spam

-- Comment added by TizianoFranchi on 08 May 2005


Precisazione sui pesi

Non ci sono occorrenze nel conto.

Dovete solo moltiplicare i valori selezionati trovando il 20mo token diverso (come key) e prendendo tutti quelli che hanno la stessa distanza da 0.5 o una distanza maggiore.

-- Comment added by AndreaSterbini on 08 May 2005


Chiedo umilmente scusa...

Ragazzi vi chiedo scusa x avervi fatto impazzire su questo benedetto calcolo mettendovi pulci assurde nelle orekkie...avevo letto (o interpretato (peggio xké vuol dire ke nn capisco manco più l'italiano)) male le specifiche...perdonatemi.....

-- Comment added by DavidBenedetti on 08 May 2005


Attenti ai pesi...

Professore, lei ha detto: "Il peso da usare nella produttoria è quello che sta nel dizionario, e NON gli va sottratto 0.5 (a parte per trovare i più lontani da 0.5)"...questo cosa vuol dire: ke dobbiamo ricordarci sia il peso di ogni token ke la sua distanza da 0.5? A me non torna molto la cosa, anke xké dalle specifiche avevo capito ke prima calcolavo tutte le distanze dei token da 0.5 e poi, con le distanze ottenute, calcolavo le produttorie considerando i 20 token---+ distanti da 0.5......oppure mi sono sbagliato un'altra volta???

-- Comment added by DavidBenedetti on 08 May 2005


Calcolo del peso...

Ho appena modificato l'algoritmo del calcolo del peso ed ho notato una cosa abbastanza interessante (se così deve funzionare!). Se nei pesi delle parole c'è anche un solo peso che è uguale ad 1.0 l'email è automaticamente spam e cioè peso = 1.0. Invece per valori che si avvicinano (chi più, chi meno) a 1.0 (ma nessuno che ne sia uguale), l'email generalmente ha peso < 1: ad esempio 0.6 - 0.86324345...ecc......giusto professore?

-- Comment added by DavidBenedetti on 08 May 2005


Le funzioni di test: ehm ma non è un po troppo "custom" come modulo per farle?

Iniziando a scrivere le funzioni di test mi sono trovato di fronte a questo interrogatio. Faccio subito un esempio:

funzione test_inserisciValore
per effettuare il test sul primo parametro (chiave in questo caso) devo inizializzare correttamente gli altri due (valore e *dizionario). Dizionario però è variabile, quindi non si può "inizializzare" manualmente. Di conseguenza per rendere la funzione di test universale, per inizializzarlo devo chiamare la funzione nuovoDizionario, non sapendo se questa sia corretta oppure no.
Come ci comportiamo?

-- Comment added by RiccardoVona on 08 May 2005


funzioni di test

secondo me hai ragione Riccardo, però io vedo che il prof. finora ha applicato i test di ciascuno solo sul suo codice e sul codice di ciascuno; non ha mai fatto i nostri test sul codice degli altri; forse ho capito male, forse il torneo va fatto alla fine di tutto?

-- Comment added by AlbertoLaRocca on 08 May 2005


risposte ai test ed a David

Secondo me dobbiamo banalmente mettere in ordine i primi 20 tokens diversi (per key) che più si allontanano dal valore 0.5 Dopodiché utilizzare il loro valore (e non la loro distanza da 0.5) per calcolare il peso. Per quanto riguarda i tests, io utilizzo le variabili "nuovoDizionario" e simili, specificando nei tests quando è che l'errore può essere dovuto solo alla funzione testata o quando può derivare anche dall'errato uso delle funzioni d'appoggio.

-- Comment added by EnricoMontesi on 09 May 2005


[HASH O ALBERO]è possibile usare funzioni in più?

Prof volevo farle una domanda per gestire una tabella hash(tipo la funzione di hashig e quella di inserimento), secondo me, sarebbe comodo aggiungere delle funzioni che la gestiscano anche senza modificare l'header lei che ne pensa? posso farlo? inoltre visto che una hash table è un vettore di puntatori a strutture la free nn è molto indicata è possibile modificare il prototipo? ultimo ma non meno importante nn ho capito bene come fare a calcolare il peso di una parola...

-- Comment added by AndreaFerraresi on 10 May 2005


"la free non è molto indicata"?

scusa, tu come fai in C puro a deallocare qualsiasi blocco allocato dinamicamente? cosa vorresti usare al posto di free? (può essere che ci sia qualche funzione che non conosco... :P )

-- Comment added by AlbertoLaRocca on 10 May 2005


Risposte

RE: Attenti ai pesi...

Scusa, Davide ... ma hai letto quello che ho scritto sulle specifiche? Mi sembra abbastanza chiaro. Una cosa è ordinare i token per scegliere quali moltiplicare, un'altra è moltiplicarne i pesi.

RE: Calcolo del peso...

Non mi torna, il prodotto di più numeri con la virgola minori o uguali a 1 dà 1 SOLO se sono TUTTI 1.

RE: Le funzioni di test: ehm ma non è un po troppo "custom" come modulo per farle?

Usate la funzione nuovoDizionario, inserisciValore eccetera.

RE: funzioni di test

Il torneo lo posso fare subito, basta che scriva due cicli nidificati che accoppino (nel senso di accoppiare, non di accoppare smile ) tutti i vostri compiti .... ma per il momento mi manca il tempo di analizzare i dati.

RE: [HASH O ALBERO]è possibile usare funzioni in più?

Basta che ne mettiate i prototipi nel vostro file dizionario.h

NON MODIFICATE modulo3.h o testsModulo3.h

-- Comment added by AndreaSterbini on 11 May 2005


leggiTokens e DOUBLE_KEY_FOUND

come si deve comportare la leggiTokens se nel file trova più occorrenze di una chiave?

deve continuare ad aggiungere elementi o fermarsi e tornare errore?

-- Comment added by MarcelloLagana on 11 May 2005


leggiTokens e DOUBLE_KEY_FOUND

Da quanto ha detto il professore alla stessa domanda che gli ho fatto mi sembra l'altra settimana, sembra si debba propagare immediatamente l'errore.

-- Comment added by DavidBenedetti on 11 May 2005


Puntatore a puntatori

Come si dichiara un puntatore a puntatori? Io ho fatto cosi: typdef struct List { char chiave[128];double valore;}Lista; struct Dizionario{int pos; Lista*vet[];}; ed eseguendolo da il seguente errore: array size missing in 'vet'.

-- Comment added by SalvatoreDiPasquale on 11 May 2005


Puntatore a puntatori

Perche' devi semplicemente scrivere tra le parentesi quadre del vettore vet[] la dimensione che vuoi...Altrimenti, se la tua intenzione e' quella di allocare dinamicamente il vettore, quando viene chiamato nuovoDizionario(...) allora devi semplicemente togliere le parentesi quadre...!!!

-- Comment added by DavidBenedetti on 11 May 2005


Puntatore a puntatori

ma se tolgo le parentesi quadre diventa un puntatore "semplice"

-- Comment added by SalvatoreDiPasquale on 11 May 2005


Puntatore a puntatori

Se hai bisogno di un puntatore a puntatorE e' un conto ma non puoi avere un puntatore a puntatorI...Se quello che intendi e' un array di puntatori a liste (al ché intuirei una tua volontá di implementare un hashtable) dovrebbe essere come ti dicevo...ammesso che io non mi sia completamente rinco*******o...!!!

-- Comment added by DavidBenedetti on 11 May 2005


pesi

ma i pesi dei token che possono essere: 0.1 <= peso <=0.9 giusto???perchè se è 0 il prodotto bad viene 0, se è 1 il prodotto good viene 0 (1-peso)==>(1-1)=0. dato che facciamo i prodotti basta che il peso sia 0 o 1 ad annulare tutta la produttoria.

-- Comment added by TizianoFranchi on 11 May 2005


Puntatore a puntatori, soluzione a puntate (4^ puntata puntata)

un puntatore a un puntatore si dichiara semplicemente con due asterischi, ma non penso che ti serva.

-- Comment added by AlbertoLaRocca on 11 May 2005


asd big grin ma perche' SalvatoreDiPasquale e' stato punito da SuperMan? big grin

-- Comment added by AlbertoLaRocca on 11 May 2005


Per i test

Come faccio a verificare se le funzioni fanno le cose in modo giusto??ad esempio come faccio a sapere se l'inserisciValore(); inserisce correttamente la chiave e il valore nel dizionario se non conosco la struct di quest'ultimo??Posso solo controllare se restituisce result_ok

-- Comment added by TizianoFranchi on 11 May 2005


test_leggiTokens()

per fare i test su FILE_UNREADABLE, FILE_EMPTY ecc metterà nella directory i file: file_unreadable.txt e file_empty.txt ecc..

-- Comment added by TizianoFranchi on 11 May 2005


Problemi consegna

Vorrei consegnare un prima bozza del mio programma però ho problemi con la consegna

-- Comment added by MassimilianoNatale on 11 May 2005


RE: Problemi consegna

Oggi pomeriggio lo aggiusto

-- Comment added by AndreaSterbini on 12 May 2005


Senza titolo?

Volevo sapere se la leggiTokens nel caso trovi una chiave già presente nel dizionario va a quella successiva oppure ritorna il comando al main, e non inserisci più eventuali chiavi presenti?

-- Comment added by LucaOlivieri on 12 May 2005


Spazio in memoria

posso crearmi nella struttura dizionario un campo che mi indichi la dimensione massima del mio dizionario, o questo non e' consentito per un impiego maggiore di spazio?

-- Comment added by SalvatoreDiPasquale on 12 May 2005


Nomi di file standard

Prof. per il testing della leggiTokens possiamo assumere che nella directory siano presenti i files: file-empty e file-unreadable e che non sia sicuramente presente file-missing (come fu in modulo1)?

-- Comment added by GiovanniColombi on 12 May 2005


RE: Senza titolo? [diciamo DOUBLE_KEY_FOUND in leggiTokens]

IMHO deve tornare immediatamente l'errore DOUBLE_KEY_FOUND (e così per qualsiasi altro codice riceva da una funzione chiamata).

-- Comment added by GiovanniColombi on 12 May 2005


Spazio in memoria

Mi sembra doveroso. Ti serve per far tornare il codice TABLE_FULL a inserisciValore.

-- Comment added by GiovanniColombi on 12 May 2005


File Token

vorrei sapere se il file passato alla funzione leggiToken termina con un \n\0 o PUO terminare anche solamente con un \0 ? grazie

-- Comment added by GiuseppeIamele on 12 May 2005


Errore in testModulo3.h ??? + file di esempio

Prof. mi scusi ma ho un problema con i .h anche in questo modulo. Compilando, in testModulo3.c mi da errore < `INVALID_PARAMETER' undeclared >. Allora ho spulciato nei .h e ho notato che testModulo3.c non ha accesso alle definizioni del modulo2 poichè non include testModulo2.h (che a sua volta include testModulo1.h e modulo2.h). Facendo le seguenti modifiche a testModulo3.h tutto fila liscio:

aggiungo: #include "testModulo2.h" #include "modulo3.h"

elimino #include "testModulo1.h"

Potrebbe mica controllare? A qualcun'altro è capitata la stessa cosa?

PS: potrebbe anche dirci il nome del file d'esempio da usare nei test di leggiTokens?

-- Comment added by GiovanniColombi on 12 May 2005


File Token

dalla bozza 2: [CUT] Si assuma che il file sia corretto e che finisca per \n [CUT] prego

-- Comment added by GiovanniColombi on 12 May 2005


Double Key Found

Quando vado ad inserire una chiave già presente,devo inserirla nel dizionario e tornare KEY_DOUBLE_FOUND oppure non la inserisco nel dizionario perchè già presente e torno semplicemente KEY_DOUBLE_FOUND??Grazie

-- Comment added by MarcoMagnaneschi on 13 May 2005


Chiarimenti......

Ciao, dato che purtroppo non sono riuscito a venire a lezione vorrei se possibile dei chiarimenti su questo modulo, la funzione calcola peso non riesco a capire bene cosa fa nella sua parte iniziale qualcuno potrebbe gentilmente spiegarmelo? Da quello che ho capito io una volta che abbiamo preso i valori con la leggi token li dobbiamo mettere con la inserisci nel nostro dizionario in maniera ordinata (l'ordine è dato dalle chiavi e non dal valore)e così per tutte le chiavi che vengono lette, finito questo, dobbiamo chiamarci la calcola peso che prende il nostro dizionario e il fantomatico vettore Token tokens[] che non ho capito bene a cosa serva......insomma un anima pia che mi spieghi la funazione calcola peso nella quale credo vada usata anche la cercaValore

-- Comment added by Users.691942 on 13 May 2005


Risposte

RE: form di consegna

L'ho sistemata.

RE: Spazio in memoria

Certo che devi ricordare la dimensione, sennò come controlli se non ne devi inserire più?

Ma non c'e' bisogno di averla in tutti i nodi dell'albero

Ti servono DUE struct, una esterna (il diz) ed una interna (i nodi del diz)

RE: Nomi di file standard

Certamente

RE: File Token

Il nome del file finisce con '\0' (visto che è una stringa)

Il file finisce con '\n' e poi c'e' l'EOF

RE: Errore in testModulo3.h ???

Includete voi i file .h necessari

RE: file di esempio

Mettiamoci d'accordo che il nome del file di esempio sia dizionario.txt

RE: Double Key Found

La seconda che hai detto smile

-- Comment added by AndreaSterbini on 13 May 2005


dizionario.txt

Ho messo in attachment a ModuloTre uno (scemo) esempio di dizionario.txt

-- Comment added by AndreaSterbini on 13 May 2005


DUBBIO: struct dizionario

io ho usato una hash-table, dove ho due strutture definite nel modo seguente, cioe' la struttura dizionario: contenente un campo con la dimensione e un campo con un puntatore a una struttura formata dai due campi: chiave e dizionario. Volevo capire se puo' andare bene? grazie

-- Comment added by SalvatoreDiPasquale on 13 May 2005


dubbio struct dizionario

scusate i due campi sono chiave e posizione.

-- Comment added by SalvatoreDiPasquale on 13 May 2005


leggiTokens()

se durante la lettura e inserimento nel dizionario la funzione inserisciValore() che questa funzione chiama restituisce DOUBLE_KEY_FOUND come ci si comporta??ritorniamo l'errore o semplicemente lo ignoriamo e si prosegue con l'inserimento??

-- Comment added by TizianoFranchi on 13 May 2005


Calcolo del peso

Se nn ho commesso errori... sia good che bad (per il calcolo del peso finale) sono calcolati sui 20 token piu significativi(a distanza maggiore). bad è uguale alla produttoria dei pesi spam compresi nei 20 token, e good alla produttoria dei pesi ham... giusto?

-- Comment added by GiuseppeIamele on 13 May 2005


calcolo del peso

No..il calcolo va fatto senza distinguere se il peso è spam o ham. Ovvero le due produttorie vanno fatte su gli stessi valori, solo che bad=bad * peso mentre good=good * (1-peso) inizializzando sia bad che good a 1.0

-- Comment added by TizianoFranchi on 13 May 2005


E se i tokens sono tutti uguali?

Non mi è ben chiara una cosa....
Nelle specifiche di calcolaPeso c'è scritto di calcolare il peso dell'email in base ai primi VENTI tokens DIVERSI ... e se i tokens sono tutti uguali?

mettiamo che il body di un email è
viagra viagra viagra viagra viagra viagra viagra 
viagra viagra viagra viagra viagra viagra viagra 
viagra viagra viagra viagra viagra viagra viagra 
viagra viagra viagra viagra viagra viagra viagra 

Come devo comportarmi?
I token DIVERSI in "tokens" di sicuro non arrivano a venti, quindi devo considerare al MASSIMO i primi venti token o devo fare il calcolo quando ho MINIMO venti token?

-- Comment added by MarcoEsposito on 14 May 2005


Senza titolo?

-- Comment added by MarcoEsposito on 14 May 2005


E se i tokens sono tutti uguali?

ok ok ho leggendo sopra ho concluso che devo fare il calcolo con i token che ho ...

-- Comment added by MarcoEsposito on 14 May 2005


E se i tokens sono tutti uguali

se sono tutti uguali tu comunque devi prendere quelli diversi quindi nel caso dell'email con scritto solo viagra questo sarà l'unico token da considerare e l'email avrà il suo peso!se ci sono meno di venti token fai il calcolo con quelli che hai!

-- Comment added by TizianoFranchi on 14 May 2005


E se i tokens sono tutti uguali

Ok, si questo penso di averlo capito, e solo per sicurezza voglio chiedere un'altra cosa

quindi un email come ho scritto sopra ha lo stesso peso di un email che contiene solo

"viagra" 
??

-- Comment added by MarcoEsposito on 14 May 2005


E se i tokens sono tutti uguali

Si perchè il prof ha detto che le occorrenze non vanno prese in considerazione

-- Comment added by TizianoFranchi on 15 May 2005


contesti e parole

professore, mi dica se ho capito bene: io prima tokenizzo una email creando un vettore di strutture Token, le quali contengono (ciascuna) un campo "contesto" opzionale e un campo "valore" sempre presente; prendiamo in esame gli elementi con entrambi i campi presenti, ad esempio
"From:*Alberto"
; a questo punto io chiamo la calcolaPeso passandogli il puntatore a questo vettore nonché un bel dizionario contenente tutti i pesi; nel dizionario (che io ho implementato ad albero) potrebbe anche esserci un nodo la cui chiave è
"From:*Alberto"
e con un certo peso; dunque io per sapere il peso di quella roba nel dizionario devo cercare
"From:*Alberto"
, e non solo "Alberto", quindi per avere la stringa da cercare nel dizionario non devo cercare direttamente token[i].parola, devo creare un nuovo buffer con il formato
"<token[i].contesto>*<token[i].parola>"
e cercare quello, giusto?

PS: potrebbe riaggiustare il forum, che qualcuno ha di nuovo sfondato il margine orizzontale? thx smile

-- Comment added by AlbertoLaRocca on 15 May 2005


parametro valore

professore, ma i valori che noi assegniamo ai tokens sono sempre compresi tra 0 e 1? se sì, quando viene chiamata una funzione che ha come ingresso un parametro double valore dobbiamo restituire INVALID_PARAMETER se questo è negativo o strettamente maggiore di 1?

-- Comment added by AlbertoLaRocca on 15 May 2005


ommioddio, voglio tornare al liceo!!!
adesso mi sono pure scordato l'italiano: "ASSEGNIAMO"!!!! ma dimmi te!!

-- Comment added by AlbertoLaRocca on 16 May 2005


Risposte

RE: leggiTokens()

Direi di tornare immediatamente l'errore.

RE: E se i tokens sono tutti uguali

Non era questo che volevo, ma mi rendo conto che è troppo tardi per cambiare.

Quindi stabiliamo che:

  • si moltiplicano tra loro i primi venti token diversi
  • e che le ripetizioni dello stesso token vengono ignorate

PS nel prossimo modulo metto le occorrenze

RE: contesti e parole

Esatto, il token è contesto*parola

RE: parametro valore

Sì, direi di tornare errore. Il valore dev'essere compreso tra 0 e 1

-- Comment added by AndreaSterbini on 16 May 2005


Segmentation Fault in calcolaPeso

Se creo manualmente un vettore Token, con vari elementi e lo mando a calcolaPeso, tutto ok, se gli mando un token creato con tokanizzaEmail, limitandolo a 50-60 "quanti" tutto ok, ma se vado oltre, impazzisce...(i token sono molti di più, e se finiscono prima di "quanti" non va oltre) qualcuno è disposto ad aiutarmi...? PLEASE

-- Comment added by AlessandroGrottoli on 16 May 2005


Funzione di Hash

Sbaglio a dichiararla nel file dizionario.h e scriverla in modulo3.c?

-- Comment added by AlessandroGrottoli on 16 May 2005


test sulla freeDizionario

Come faccio a verificare che la freeDizionario liberi effettivamente TUTTA la struttura dizionario con tanto di handler, nodi, sotto-nodi, etc? A run-time penso sia possibile usare un debugger (quale mi consigliate?) per "spiare" nella memoria dinamica, ma come faccio a scrivere una funzione di test?

-- Comment added by AndreaMantoni on 16 May 2005


CalcolaPeso

Io purtroppo non ho capito molto a questo punto del CalcolaPeso, prendiamo solo i primi 20 Token diversi e facciamo le produttorie, senza fare il calcolo con le occorrenze?

-- Comment added by SimoneMurzilli on 16 May 2005


a proposito della deallocazione del dizionario

nn avevo letto che la struttura di handling dell'hash table doveva essere dinamica(ma in teoria nn dovrebbe essere un vettore???)cmq alberto quando ho parlato di free non intendevo free() ma freeDizionario() che come avrai ormai capito per un vettore nn era molto indicata...cmq qualcuno di voi ha avuto problemi di multiple definitions nei .h?

-- Comment added by AndreaFerraresi on 16 May 2005


parametro valore

ma deve essere diverso sia da 0.0 che da 1.0 giusto? quindi l'errore invalid_parameter viene lanciato anche in questo caso

-- Comment added by TizianoFranchi on 16 May 2005


RE: test sulla freeDizionario

Non si può testare la funzione free(), poichè non torna nessun error-code e non setta neanche errno. In più il suo comportamento in casi "speciali" è indefinito. Generalmente si assume che free() vada a buon fine. Quindi personalmente nel test su RESULT_OK di freeDizionario() controllo solo che il codice di ritorno è appunto RESULT_OK. Qualcuno conosce un modo migliore?

-- Comment added by GiovanniColombi on 16 May 2005


[OT] Brevetti software: 17/5 mobilitazione nazionale

Penso sia una cosa importante che ci riguarda tutti:

http://punto-informatico.it/p.asp?i=52786

Se qualcuno è interessato si continua in OffTopic. Altrimenti scusate l'ot.

-- Comment added by GiovanniColombi on 16 May 2005


cerca valore

se ho trovato la chiave, torno il valore associato nella variabile(passata per puntatore) e return (RESULT_OK)?

-- Comment added by SalvatoreDiPasquale on 16 May 2005


cerca valore

Si Salvo!!

-- Comment added by MarcoMagnaneschi on 17 May 2005


Dubbio su BAD E GOOD

Ma Bad è semplicemente il prodotto degli Wi pesi e Good è il prodotto degli (1-Wi) pesi???GRAZIE

-- Comment added by MarcoMagnaneschi on 17 May 2005


Dubbio su BAD E GOOD

si, almeno così è scritto sulle specifiche smile

-- Comment added by RiccardoVona on 17 May 2005


Contesto o Parola?

Ma le chiavi contenute nella struttura Token sono nel campo "contesto" o "parola"? Io ho sempre assunto il campo "parola" come quello in cui è sta la chiave, ma leggendo qualche affermazione nel forum ho qualche dubbio di questa mia scelta.

-- Comment added by MassimilianoNatale on 17 May 2005


contesto o parola?

se il campo contesto è NULL allora la chiave si trova solo su parola ma se non è NULL allora la chiave te la devi costruire come abbiamo fatto per la printTokens() del primo modulo...ovvero contesto*parola

-- Comment added by TizianoFranchi on 17 May 2005


Confusione

da quello che so io per calcolare l'hash di una parola serve la dimensione della hash table se non posso dichiarare variabili globali come faccio a tenermi dim?oppure posso dichiarare variabili globali in via del tutto eccezionale??explain it please

-- Comment added by AndreaFerraresi on 17 May 2005


Confusione

è concettualmente errato memorizzare la dimensione dell'hash table al di fuori di essa: memorizzala all'interno della struct Dizionario.

-- Comment added by AlbertoLaRocca on 17 May 2005


Risposte

RE: Funzione di Hash

Non credo, visto che i due files andranno sempre in coppia.

RE: test sulla freeDizionario

Buona domanda ...

Io faccio comunque una analisi della memoria non deallocata ... vedrete i nuovi run dei test ...

RE: calcolaPeso

Esatto

-- Comment added by AndreaSterbini on 17 May 2005


RE: Confusione

Puoi incapsulare la tua hashtable in una struct in cui metti la dimensione e le altre informazioni relative alla hashtable.

Fai conto che stai costruendo un oggetto smile (nel senso della OOP)

-- Comment added by AndreaSterbini on 17 May 2005


Problema fabs

Ho un problema con la fabs (a parte che nell'ordinamento delle distanze i valori ricavati da valori negativi è più "pesante" di quelli già positivi). Cmq il mio problema è un'altro quando cerco le distanze superiori al 20°token il test arriva fino alle distanze ricavate da valori positivi...le distanze negative(rese positive dalla fabs) non passano il test...qlc ha avuto questo problema??? (con la printf danno gli stessi valori...)

-- Comment added by SimoneMurzilli on 17 May 2005


Problema fabs...

Penso sia del tutto normale una cosa del genere Simone...!!!

-- Comment added by DavidBenedetti on 17 May 2005


Problema fabs

quindi, è giusto che pur avendo la stessa distanza non passi il test?

-- Comment added by SimoneMurzilli on 18 May 2005


Per vedere se ho implementato bene la calcolaPeso...

Potrebbe farci un esempio di un'email tokenizzata e del peso ad essa associata? (assumendo che i pesi vengano letti da "dizionario.txt")

-- Comment added by AndreaMantoni on 18 May 2005


già

sarebbe servito anche a me, ma temo che ormai non si faccia in tempo purtroppo ^^
incrociamo le dita smile a me apparentemente funziona

-- Comment added by AlbertoLaRocca on 18 May 2005


test su calcolaPeso

professore, alcuni test sulla calcolaPeso mi falliscono perché di fatto la calcolaPeso riesce a calcolare il giusto valore in virgola mobile della mail, ma ci sono dei problemi quando vado a confrontare il risultato ottenuto con quello che avrei voluto ottenere. mi spiego meglio: inizialmente in un test la calcolaPeso mi restituiva 0.1, e il risultato che volevo ottenere era appunto 0.1, però la funzione di test mi dava TEST_FAILED; inizialmente non ne capivo il motivo, poi ho fatto un memory dump del valore 0.1 e del risultato ottenuto dalla calcolaPeso (apparentemente sempre 0.1) e mi sono accorto che effettivamente i due valori erano diversi, ma lo erano di un unico bit ; di conseguenza i due valori double rappresentavano (quasi!) lo stesso valore e la calcolaPeso faceva correttamente il suo lavoro, ma il test falliva. lo so che è un po' tardino per accorgersene, ma vorrei che ne tenesso conto anche lei quando farà i test. grazie smile

-- Comment added by AlbertoLaRocca on 18 May 2005


Primi tests

Ho appena messo in linea qualche primo test del modulo 3

-- Comment added by AndreaSterbini on 30 May 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 - 28 Apr 2005

Edit | Attach | Watch | Print version | History: r144 < r143 < r142 < r141 < r140 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r144 - 2005-08-21 - AndreaSterbini






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