Domande sul Modulo 2 (funzioni per la gestione di liste e nodi)

In questa pagina potete porre domande sul Modulo 2 del progetto 2006/2007.

Vi prego di inserire un titolo che chiarisca che tipo di domanda state ponendo. Potete rispondere alle domande anche tra di voi.



Benvenuti

Questo è il primo messaggio sulla pagina delle domande riguardanti il modulo 2 del progetto. Per favore, leggete bene le specifiche e le domande degli altri prima di fare domande ovvie.

-- RobertoNavigli - 23 Apr 2007

puntatori a puntatori

Per cui dobbiamo usare i puntatori a puntatori

-- AlessandroMastropietro - 23 Apr 2007

Re: puntatori a puntatori

Scegliete voi come implementare list e iterator...

-- RobertoNavigli - 24 Apr 2007

Allocazione e liberazione della memoria

Salve prof, le volevo chiedere, dato che non dobbiamo implementare una funzione (ad es.) free_list, come possiamo affrontare la liberazione della memoria allocata costruendo le liste con add_first e add_last???

thx


-- MatteoLatini - 23 Apr 2007

Re: Allocazione e liberazione della memoria

E' un'ottima domanda. Questo è un problema che verrà dopo e comunque affrontabile solo con una funzione, come dice lei, di tipo free_list. Non preoccupatevene ora.

-- RobertoNavigli - 24 Apr 2007

MAIN

Quando sarà disponibile un main per testare le nostre funzioni?

-- GiuseppeSantaMariaSosso - 24 Apr 2007

Re: MAIN

Potete testarla anche voi con un vostro main (si tratta solo di chiamare le varie funzioni per costruire qualche nodo). Comunque lo renderò disponibile quanto prima.

-- RobertoNavigli - 24 Apr 2007

posizione all'interno della lista

non ho capito una cosa...la posizione attuale all'interno della lista quando deve essere aggiornata?

-- GianlucaSquarcia - 24 Apr 2007

Re: posizione all'interno della lista

Non c'è "la posizione attuale", ma ce n'è una per ogni istanza del tipo di dato iterator. Viene aggiornata dalla funzione next().

-- RobertoNavigli - 24 Apr 2007

iterator???

Scusi prof ma non ho ben capito dove punta l'iterator all'interno della lista... ad esempio se noi abbiamo list = 1->3->NULL get_iterator restituisce l'iteratore che se passato a next restituisce 1?

e poi un'altra cosa: ma vale lo stesso discorso per iterator come per la free_list? Ovvero e' meglio inserire iterator nella struttura list per inizializzare tutto insieme oppure allocare memoria ogni qual volt a ritorniamo un tipo interator per non incorrere successivamente in una possibile indeterminazione delle variabili void* ritornate da next????

thx


-- MatteoLatini - 24 Apr 2007

Re: iterator???

Risposta alla prima domanda: sì. Iterator è un tipo di dato distinto da list, quindi non deve essere "inserito" dentro list...


-- RobertoNavigli - 25 Apr 2007

struttura list

faro senz'altro una domanda banale, ma in qualsiasi tipo di lista che ho visto fin'ora, c'erano sempre dei campi informativi e uno (o anche piu) puntatori. In questo caso, non ho ben capito, dentro alla struttura list, essendo un tipo di dato astratto, cosa dobbiamo mettere oltre al puntatore?

-- JacopoSciarra - 24 Apr 2007

Re: struttura list

Certo, finora però avete fissato il tipo di dato dell'elemento di ogni nodo della lista. Qui invece il campo di contenuto, ovvero l'elemento, deve avere un tipo non specificato, ovvero void *.

-- RobertoNavigli - 25 Apr 2007

Tipi errori

Volevo sapere

enum op_errors
{
OP_OK = 0,
OP_MEM_ERROR,
OP_NO_ATTRIBUTE_ERROR,
OP_GENERIC
};

che tipi di errori sono,ossia quando devono essere visualizzati? Che tipo di errore si deve verificare?


-- LauraDiSaverio - 24 Apr 2007

Re: Tipi errori

Grazie, aggiorno il file pdf delle specifiche.


-- RobertoNavigli - 25 Apr 2007

DELUCIDAZIONI

La funzione void *next(iterator iteratore) deve aggiornare l'iteratore affinchè punti al prossimo elemento. Non prendendo *iteratore come argomento, è impossibile aggiornare l'iteratore proprio perchè la funzione accetta una copia e non un puntatore (sarebbero due istanze separate). A questo punto o la funzione deve accettare un puntatore a iterator o semplicemente si definisce il tipo iterator come puntatore a iteratore. Vorrei solo avere una conferma. Inoltre lo stesso discorso può essere fatto con il tipo list. La funzione int new_list(list *lista) cosa si aspetta: un puntatore allocato precedentemente con malloc, l'indirizzo di una variabile list o un puntatore non inizializzato?


-- GiuseppeLaTorre - 25 Apr 2007

Re: DELUCIDAZIONI

Questa è una buona domanda. Ma noi non abbiamo mai detto che list e iterator siano per forza delle strutture. Potrebbero essere dei puntatori a strutture (typedef insegna).

-- RobertoNavigli - 25 Apr 2007

int new_list (list* )

Salve! Forse sto x porre una domanda davvero sciocca. Alla funzione int new_list (list *) viene passato un puntatore e la funzione deve creare una lista vuota. Ma lista vuota non vuol dire che il puntatore list punterebbe a NULL ? In tal caso non avrebbe utilità questa funzione, perciò ho mal interpretato io?

-- MirkoSquitieri - 25 Apr 2007

int new_list

nelle specifiche il prototipo di questa funzione è:

int new_list(list *);

è proprio cosi o è un errore e sarebbe:

int new_list(list *l);

??


-- JacopoSciarra - 25 Apr 2007

Re: new list

non sarebbe meglio che la funzione new_list ritornasse un list?


-- JacopoSciarra - 25 Apr 2007

Re: Re: new list
si infatti, sto notando che forse è un errore, infatti momentaneamente ho tralasciato...

-- MirkoSquitieri - 25 Apr 2007

Re: Re: Re: new list
Non è un errore: è stata impostata volutamente in quel modo. Come ho scritto al vostro collega sopra (DELUCIDAZIONI) non è detto che list sia una struttura, può anche essere un puntatore a una struttura.

Il nome dei parametri non è obbligatorio nei prototipi.


-- RobertoNavigli - 25 Apr 2007

Re: new list

infatti....la lista vuota significa che il puntatore deve essere inizializzato a NULL e basta....non capisco quindi perkè bisogna controllare se l'operazione ha avuto successo oppure no

-- GianlucaSquarcia - 25 Apr 2007

Re: Re: new list
Per generalità. Le funzioni restituiscono tutte un codice d'errore, per pulizia, generalità, ecc. e anche perché se implemento la lista in modo più complesso (magari non è il vostro caso) potrebbero (ad esempio) sorgere problemi di cui si vuole tenere traccia.

-- RobertoNavigli - 25 Apr 2007

Re: Re: Re: new list
c'è qualcosa che continua a sfuggirmi..abbiate pazienza..

quindi se la mia new_list ha un prototipo del genere:

int new_list(list *l);

è corretto o è un errore? (in pratica non fa altro che mettere un puntatore a NULL)


-- JacopoSciarra - 25 Apr 2007

Re: Re: Re: Re: new list

Non potete modificare il prototipo delle funzioni che vi forniamo. Dovete semmai decidere come definire il tipo list.

-- RobertoNavigli - 25 Apr 2007

void *next( iterator i );

Salve professore , ho una domada da farle, come posso modificare iterator se dalle specifiche lei mi passa una coppia 0.0? Secondo me void *next( iterator i ); dovrebbe essere un puntatore senno non si riesce a modificare facilmente ma bisognerebbe implementare un workaround per aggirare il problema. Grazie

-- AntonioGaudino - 25 Apr 2007

Re: void *next( iterator i );

Ho risposto sopra a questa domanda.

-- RobertoNavigli - 25 Apr 2007

int get_attributo(node n, char* attribute, char** value);

Non ho ben capito il funzionamento della funzione get_attributo...la funzione ricerca nella lista degli attributi di node n se c'è la stringa attribute...se la trova la copia in value, ma praticamente viene copiata proprio la stringa attribute in value???

-- LauraMinicucci - 25 Apr 2007

Re: int get_attributo(node n, char* attribute, char** value);

No, nella stringa puntata da value viene copiato il valore associato all'attributo chiamato attribute. Il concetto e' quello dei tag xml: attribute="valore".

-- RobertoNavigli - 25 Apr 2007

Chiarimenti su get_attributo e set_attributo

1)Le funzioni get_attributo e set_attributo si riferiscono soltanto ai nodi di tipo TAG_NODE? (mi porta a pensare questo il fatto che nel tipo TEXT_NODE il campo attributes non deve essere impostato).

2)La funzione set_attributo deve sia creare un nuovo attributo che sovrascriverlo? (Es. se un nodo ha un attributo "PIPPO" con valore "PLUTO" e chiamo la funzione set_attributo("PIPPO", "PAPERINO"), il vecchio "PLUTO" deve essere sovrascritto con il nuovo "PAPERINO" o deve essere restituito un errore perchè si sta tentando di sovrascrivere un valore gia esistente? Se invece il nuovo attributo non è gia presente, deve essere aggiunto o deve essere restituito errore perchè si sta tentando di modificare il valore di un attributo che non è presente?


-- GiuseppeLaTorre - 25 Apr 2007

Re: Chiarimenti su get_attributo e set_attributo

1) sì 2) set_attributo serve sia a sovrascrivere che a creare (secondo se l'attributo e' presente oppure no).

-- RobertoNavigli - 26 Apr 2007

Errori e get_iterator()

Come gestiamo eventuali errori nella funzione get_iterator() visto che quest'ultima ritorna l'istanza dell'iteratore e non un errorcode?

-- OliverTran - 26 Apr 2007

Re: Errori e get_iterator()

Quali errori possono verificarsi?...

-- RobertoNavigli - 26 Apr 2007

Re: Re: Errori e get_iterator()
Nel mio caso il tipo dati iterator è un puntatore a struttura di tipo iter che contiene dei campi che tengano traccia della lista a cui è associato l'iteratore. Di conseguenza nella get_iterator devo generare un'istanza della struttura iter, operazione che potrebbe darmi un OP_MEM_ERROR.

-- OliverTran - 26 Apr 2007

Re: Re: Re: Errori e get_iterator()
Tralasci l'errore o lo emetta in uscita ed esca dal programma.

-- RobertoNavigli - 26 Apr 2007

new_text_node

nelle specifiche c'e scritto che devono essere impostati i campi text, type e children(lista vuota)...va impostato anke attribute come lista vuota?

-- GianlucaSquarcia - 26 Apr 2007

Re: new_text_node

essendo un nodo di testo non è fondamentale (i nodi di testo non hanno attributi), ma se lo fate va bene.

-- RobertoNavigli - 26 Apr 2007

funzioni di xsml_list

non ho capito se posso usare, in xsml_node.c, le funzioni di xsml_list e se posso includere in xsml_node.h il file xsml_list.h

-- GianlucaSquarcia - 26 Apr 2007

Re: funzioni di xsml_list

Devo per forza, no?

-- RobertoNavigli - 26 Apr 2007

Attributi

Come sono memorizzati questi attributi di nodi?

Ovvero io ho un nodo n di tipo tag_node che ha una list attributes, implementata a nostro piacimento. Visto che questa lista l'abbiamo implementata noi, possiamo anche decidere come implementare il tipo di dato che memorizzerà queste coppie attributo-valore nella list attributes?


-- OliverTran - 26 Apr 2007

Re: Attributi

Esattamente.

-- RobertoNavigli - 26 Apr 2007

Struttura list - ancora...

Salve Professore, vorrei avere spiegazioni ulteriori circa la struttura da definire list. Non ho ancora chiaro cosa si dovrà fare con questa struttura e non riesco ad organizzarmi al meglio. Sicuramente è un mio problema. E' corretto pensare che l'albero che si dovrà implementare per l'analisi sintattica è quello presente nell'introduzione XML e xsML delle specifiche del Modulo 1? Se si sarebbe corretta la struttura (1) per la sua rappresentazione in memoria?

Grazie mille.

Struttura (1)
typedef struct list list;
struct list {void *el; list *child; list *brother};
-- AndreaMencaroni - 26 Apr 2007

Re: Struttura list - ancora...

Andrea,

una lista è una lista, non deve essere un albero. Voi non dovete implementare l'albero (anche se di fatto lo fate attraverso la struttura node). La lista (e tutte le funzioni di interfacciamento) deve essere una struttura indipendente dal contesto del progetto, quindi utilizzabile in qualsiasi ambito.

La seconda parte del modulo, invece, è più specifica rispetto al progetto, ma - di nuovo - potrebbe essere utilizzata per qualsiasi struttura gerarchica che abbia bisogno delle stesse informazioni.


-- RobertoNavigli - 26 Apr 2007

pignoleria sulle specifiche

Quando nelle specifiche si legge "nel caso del nodo di tipo testo (testo passato in input alla funzione), devono essere impostati i campi text, type (= TEXT_NODE) e children (lista vuota)", per campo text s'intende il campo name, giusto?
struct node{
    char *name;
    list attributes;
    node_type type;
    list children;
};
-- CleoniceMansillo - 26 Apr 2007

Re: pignoleria sulle specifiche

Sì, è un refuso di una precedente versione delle specifiche.

-- RobertoNavigli - 26 Apr 2007

Re: funzioni di xsml_list

però nelle specifiche c'e scritto che l'implementazione delle liste non sarà nota alle funzioni di gestione dei nodi, cosa singnifica?

-- GianlucaSquarcia - 26 Apr 2007

Re: Re: funzioni di xsml_list

Significa che le funzioni di gestione dei nodi utilizzeranno solo l'interfaccia, ovvero le funzioni di gestione delle liste, senza conoscere come il tipo di dato astratto viene effettivamente implementato.

-- RobertoNavigli - 26 Apr 2007

add_child e lista children

Forse è una domanda stupida, ma quando, con add_child, aggiungiamo un figlio alla lista children, va inserito in qualche posizione in particolare (testa, coda o all'interno)? o la funzione è chiamata con un certo ordine e quindi facciamo solo inserimenti in testa?

-- CleoniceMansillo - 26 Apr 2007

Re: add_child e lista children

Non è una domanda tanto stupida. Bisogna effettuare una aggiunta in coda per preservare l'ordine dei nodi inseriti.

-- RobertoNavigli - 26 Apr 2007

Riferimento o copia dei nodi in add_child

Nella funzione int add_child(node parent, node child); child è di tipo *node, questo implica che l'istanza del child che passiamo alla funzione viene solo assegnata. Qualsiasi modifca esterna fatta al child si ripercuote anche nella struttura ad albero. E' corretto così o si dovrebbe trovare un modo generico di clonare il child creando così una nuova istanza indipendente?


-- GiuseppeLaTorre - 26 Apr 2007

Re: Riferimento o copia dei nodi in add_child

Corretto: io prima creo i nodi e poi li collego "ad albero". Quando modifico un nodo, voglio che questa modifica valga per il nodo in quanto parte dalla struttura complessiva. Non devo creare copie.

-- RobertoNavigli - 26 Apr 2007

Funzioni

Nelle funzioni

int new_text_node(node *n, char *text) int new_tag_node(node *n, char *name) int set_attributo(node n, char *attribute, char *value)

Le variabili text, name e value devono essere clonate o semplicemente assegnate?


-- GiuseppeLaTorre - 26 Apr 2007

risultati primo modulo

Salve prof vorrei sapere se i risultati del primo modulo usciranno in questi giorni, oppure alla fine dei 4 moduli??????

-- GennyProto - 27 Apr 2007

Re: risultati primo modulo

Speriamo prima della consegna del secondo modulo.

-- RobertoNavigli - 27 Apr 2007

Chiarimenti per Funzioni sulle Liste

Salve! Ci sono molti vuoti che non sono riuscito a colmare, leggendo le specifiche.

1) Ammettendo che "list" sia il tipo di dato con cui costruire una lista concatenata, se il tipo di nodo puntato da "*el" non e' un nodo di tipo "list", come possiamo mettere questo (in testa o in coda) alla lista "*l" di tipo list ?

2) Se ho ben capito chiamando "get_iterator(list l)", sulla lista "l" ci viene restituito il puntatore alla testa della lista ? Ho detto questo dalle parole <<" ... L'iteratore restituito dalla funzione si trova inizialmente davanti al primo elemento. ...">

3) Quel' e il compito di "int new_list(list *)" ? Se non fa altro che mettere il puntatore alla lista di tipo "list" a NULL, qual'e puo essere la sua utilita' ? Insomma in quali casi va usata ?

Grazie! Buon Lavoro


-- PezzRico - 27 Apr 2007

OP_NO_ATTRIBUTE_ERROR

Questo errore viene ritornato solo dalla get_attribute quando non trova l'attributo ricercato?

Ho riscaricato il file .pdf ma non ci sono stati aggiornamenti riguardo gli errori.


-- OliverTran - 28 Apr 2007

Re: Re: Chiarimenti su get_attributo e set_attributo
Salve Prof. Vorrei capire meglio se la funzione "set_attributo" deve (1) cercare se l'ATTRIBUTO è presente nella lista degli attributi e nel qual caso sovrascrivere il VALORE ad esso associato e (2) nel caso l'ATTRIBUTO non sia presente nella lista creare la coppia (ATTRIBUITO,VALORE) collocandola in ultima posizione della lista.

Grazie.


-- AndreaMencaroni - 28 Apr 2007

Re: Re: Re: Chiarimenti su get_attributo e set_attributo
Ho aggiornato il pdf delle specifiche. Per vostra comodità ho messo in italico le risposte ai vostri quesiti.

-- RobertoNavigli - 28 Apr 2007

Struct

è errato creare una lista doppia?
typedef struct elem *list
struct elem {
int value
list next
list prec
};
-- DanieleR - 28 Apr 2007

Iterator e next

Buongiorno, non mi sono chiare alcune cose: 1) dalle specifiche: "void *next(iterator i); Restituisce il prossimo elemento puntato dall'iteratore (la successiva chiamata a next deve sempre restituire l'elemento seguente all'ultimo elemento restituito)." Ovvero se sono arrivata alla fine della lista la next cosa restituirà, errore o NULL? 2) Sempre dalle specifiche: "int has_next(iterator i); Restituisce 1 se l'iteratore non è ancora arrivato alla fine della lista (ovvero se punta a un elemento valido), 0 altrimenti." Se sono arrivata alla fine della lista, sto ancora puntando ad un elemento valido, ma la lista non ha un next. Non dovrei allora restituire 0?

Grazie


-- DeliaPassalacqua - 28 Apr 2007

Re: Iterator e next

1) NULL 2) 0

-- RobertoNavigli - 29 Apr 2007

Re: Struct

Potete implementare i tipi di dato come volete. Tenete conto solo che valuteremo l'efficienza delle funzioni di aggiunta in testa e in coda alla lista.

-- RobertoNavigli - 29 Apr 2007

void *next(iterator i);

Forse chiederò una cosa banale ma non ho ben capito: "void *next(iterator i); Restituisce il prossimo elemento puntato dall'iteratore (la successiva chiamata a next deve sempre restituire l'elemento seguente all'ultimo elemento restituito)." Questo vuol dire che oltre a restituire l'elemento puntato dall'iteratore i devo anche aggiornare l'iteratore facendolo puntare all'elemento successivo della lista? Grazie

-- LauraMinicucci - 29 Apr 2007

NEW LIST

alla new_list(list *) cosa viene passato? Cioè io nel main devo creare un: list ptr; e poi chiamare new_list(&ptr); e una volta dentro allocare un blocco vuoto, che avrà come valore 0 e come next 0? Inoltre la struttura cosa conterrà nel campo valore? un intero, un carattere...ecc ecc ?

-- DanieleR - 29 Apr 2007

main2b.c problema nodo t4

Professore, il nodo t4 viene creato con new_text_node, poi c'è il controllo scritto sotto. Non mi darà mai ok, ho capito male io? Grazie
if (get_node_type(t4) == TAG_NODE) printf("t4 TAG_NODE (ok)\n");
        else printf("t4 TEXT_NODE (problema)\n");
-- DeliaPassalacqua - 29 Apr 2007

Re: main2b.c problema nodo t4

Grazie, ho aggiornato il main2b.c

-- RobertoNavigli - 29 Apr 2007

Re: NEW LIST

L'implementazione è libera. L'importante è che le funzioni agiscano correttamente.

-- RobertoNavigli - 29 Apr 2007

Re: void *next(iterator i);

Esattamente.

-- RobertoNavigli - 29 Apr 2007

(Void *)

Come immaginavo, all'uscita del suo main sarebbero sorti i problemi: ho completato il mio xsml_list.c pensando che il (void *el) fosse un elemento passato via main. Da quello ke posso vedere dal suo main, le cose non stanno così, e allora mi chiedo: ma l'elemento *el da dove lo prendiamo? Da input tramite scanf? ma soprattutto che dato è? int, char...ecc ecc ?

-- DanieleR - 30 Apr 2007

void *next(iterator i)

Questa funzione oltre che incrementare il valore puntato dall'iteratore, modifica anche la lista accorciandola, o è un puntatore in sola lettura?

-- DanieleR - 30 Apr 2007

problema main2a.c

non riesco a capire perche con il mio main, il mio file xsml_list.c funziona e con quello rilasciato dal prof no..o meglio, non mi stampa i caratteri giusti (nel ciclo while..)

nella mia implementazione, un oggetto di tipo iterator ha solo un puntatore alla lista. Non capisco come fare per far stampare il campo di tipo char* che è nella lista puntata dall'iteratore..

while(has_next(i))
   {
      char *s = (char *)next(i);
      printf("%s,", s);
   }
-- JacopoSciarra - 30 Apr 2007

(senza titolo)

mi scusi ma come possiamo far avanzare l'iteratore se il puntatore passato dal main è sempre lostesso?

a mio avviso questo il segmento di codice corretto per la scrittura degli elementi dal main dovrebbe essere una cosa del genere, forse ho interpretato male le specifiche?

while(has_next(i)){
      
      printf("%d, ",i->el);
      i=next(i);
   }
-- MicheleMartinelli - 30 Apr 2007

Incremento puntatore da *next

professore a me va tutto tranne l'iteratore. io ho bisogno, dal main, di fare i=next(i); per incrementare l'iteratore. Non riesco in alcun modo a passarlo e modificarlo by ref chiamando solo la next(i).

while(has_next(i))
   {
      char *s = (char *)next(i);
      printf("%s,", s);
   }

-- DanieleR - 30 Apr 2007

Re: Re: itaratore e stampa di caratteri
il mio problema su questo ciclo while è che non mi stampa i caratteri giusti..

le funzioni dell'iteratore le ho provate tutte singolarmente e funzionano.. chiedo agli altri utenti se riscontrano problemi nello stampare i caratteri o se è solo un errore mio.. è possibile che ci sia un problema nella seguente riga?

char *s = (char *)next(i);
-- JacopoSciarra - 30 Apr 2007

Re: Re: Re: itaratore e stampa di caratteri
ciao jacopo potresti spiegarmi come hai fatto la next(i)? xke io proprio nn ci riesco, c'è qualcosa ke mi sfugge!!!

-- DanieleR - 30 Apr 2007

Re: (senza titolo)

dipende da come hai creato la tua struttura iterator..questa funzione ha solo lo scopo di spostare di una posizione in avanti il puntatore alla lista..(spero non di dire fesserie)

-- JacopoSciarra - 30 Apr 2007

Re: Re: (senza titolo)
infatti ma a me nn funziona facendo next(i) ma solo se faccio i=next(i)! e non riesco a capire dove sbaglio

-- DanieleR - 30 Apr 2007

jetset tribute

Avrei due domande professore: 1) in get/set_attributo il parametro -attribute- è implicitamente accettato come valido, stando alle specifiche. Le funzioni devono tornare un codice di errore come OP_GENERIC in caso di nomi di attributo non validi? 2) la ricerca del nome_attributo è case-sensitive?

-- MevioColucci - 30 Apr 2007

Re: jetset tribute

1) potete fare come credete, comunque sì: se ci sono problemi diversi da quelli previsti dovete emettere OP_GENERIC 2) sì, case sensitive

-- RobertoNavigli - 01 May 2007

Re: Re: Re: next(i)
anche io nel mio main per mandare avanti faccio i = next(i) nel main del prof credo che si faccia una conversione.. nel senso che chiama la next, e che il risultato, tramite casting, sia convertito in una stringa, che dovrebbe essere quello che stampa.. pero a me stampa dei caratteri senza senso..

-- JacopoSciarra - 30 Apr 2007

next(i)

Jacopo, è sbagliato fare i=next(i)!!! bisogna fare solo next(i), e avere come risultato l'iteratore modificato by val. Ma ciò non è possibile visto ke è passato by val e non by ref. se fosse by ref sarebbe così: next(&i)! Non riesco a uscirne!!!!

-- DanieleR - 30 Apr 2007

Re: next(i)

Daniele, puoi dichiarare iterator come un puntatore a struttura. Guarda cosa ha scritto il prof. in "DELUCIDAZIONI".

-- DeliaPassalacqua - 30 Apr 2007

Re: Re: next(i)
Ciao Delia. Si è proprio quello che ho fatto, le ho provate tutte! Ho provato senza puntatore,con puntatore e doppio puntatore alla struttura..ma non va!Cioè: nella funzione lo sposta il puntatore, ma quando lo leggo da main non è stato modificato,quindi a meno che non passo &i(essendo by val)da main, o faccio i=next(i), non so proprio come fare frown

-- DanieleR - 01 May 2007

Gestione memoria && argomenti null

Salve prof ho 2 domande da farle:

1 : Nella funzione set attributo quando devo aggiornare il valore dell'attributo sto usando la realloc, in questo caso se dovesse fallire devo salvarmi l'indirizzo e ritentare opp. restituisco solamente OP_MEM_ERROR ??

2 : se gli argomenti ricevuti ad esempio in set_attributo come attribute o value sono uguali a NULL, dobbiamo restituire errore oppure consideriamo il caso di inserire ad esempio un attributo con valore o nome uguale a NULL?


-- GabrieleIoannucci - 30 Apr 2007

Re: Gestione memoria && argomenti null

Fate liberamente quello che credete più giusto.

-- RobertoNavigli - 01 May 2007

STRUTTURA LIST

un domanda, ma la struttura list che dobbiamo creare, deve reppresentare la struttura di un nodo della lista? o possiamo creare una struttura a parte propria della lista?e in questo caso, dobbiamo definire anche la struttura di un nodo?

-- LucaDiFilippo - 30 Apr 2007

Re: STRUTTURA LIST

Ho già risposto a questa domanda: leggere sopra.

-- RobertoNavigli - 01 May 2007

funzione add_child (...)

vorrei fare 2 domande riguardo la funzione (l'ho gia' sviluppata ma vorrei una conferma smile

#1: la funzione deve quindi aggiungere nel campo "list children del nodo parent" il contenuto del campo "list children del nodo child"? #2: nel caso in cui il nodo child avesse piu' di un figlio, la funzione dovra' aggiungerli tutti (in coda) al nodo parent?

grazie smile


-- ManuelMinopoli - 01 May 2007

Re: funzione add_child (...)

No! La funzione deve aggiungere il nodo child (solo il nodo, non i suoi figli) alla lista children del nodo parent!!!

-- RobertoNavigli - 01 May 2007

next

per modificare il next basta salvarsi in una variabile di tipo *void l'elemento corrente e mandare avanti iteratore come se fosse una normale lista...cosi a me almeno funziona

-- AlessandroMastropietro - 01 May 2007

funzioni next e getiterator

un paio di domande: 1 la funzione next deve anche spostarsi alla posizione sulla lista successiva? 2 la funzione gert_iterator come fa a restituire degli errori se se ne verificassero?come ad esempio nell'allocazione di memoria?

-- LucaDiFilippo - 01 May 2007

next( iterator i )

nn mi funziona questo comando, qualcuno saprebbe spiegarmi perchè? Tra l'altro per ora non trovo metodo migliore di eseguire questa azione di shifting...ma forse mi verrà in mente. Il compilatore nn mi dice nulla, né warnings né errors. Logicamente a me sembra corretta...però mi da segmentation fault in fase di esecuzione.

In pratica gli dico di puntare a cio cui punta il campo next puntato da i->nodo dove i->nodo è un puntatore void dichiarato nella struttura iteratore


i->nodo=(list *) (*(i->nodo))->next;
-- AlainBindele - 01 May 2007

OP_MEM_ERROR e OP_GENERIC

Buonasera, vorrei sapere se nelle funzioni add_first(list *l, void *el) e add_last(list *l, void *el), una situazione del tipo (*l==NULL), cotrollata prima di allocare memoria, deve restituire un errore di memoria, oppure è da considerarsi un errore generico? Grazie.

-- GloriaRomualdi - 01 May 2007

Re: OP_MEM_ERROR e OP_GENERIC

Scegliete voi.

-- RobertoNavigli - 02 May 2007

altri tipi di dato

Salve, volevo sapere se era possibile definire ulteriori tipi di dato oltre a list ed iterator... Grazie

-- LauraMinicucci - 02 May 2007

Re: altri tipi di dato

L'implementazione è libera, potete implementare come volete (tenendo conto dell'efficienza dell'implementazione).

-- RobertoNavigli - 02 May 2007

get_attribute

non ho ben capito come funziona questa funzione. Essa deve cercare in una lista di stringhe (appartenenti alla lista attributes del nodo in questione) quella che si chiama con il valore di attribute? e poi copiare il valore della stringa nell'array di char puntato da value??

quindi è una sorta di "find" sulle liste?


-- JacopoSciarra - 02 May 2007

get_attribute

non è che qualcuno gentilmente mi spiegherebbe come funziona questa funzione? il valore *attribute passato come paramentro che cosa è esattamente? è un elemento di una lista di *char? quindi bisogna effettuare una ricerca nella lista attributes del nodo n, dando per scontato che questa lista sia di *char?
int get_attributo(node n, char *attribute, char **value);
-- JacopoSciarra - 02 May 2007

Re: get_attribute

non è che qualcuno gentilmente mi spiegherebbe come funziona questa funzione? il valore *attribute passato come paramentro che cosa è esattamente? è un elemento di una lista di *char? quindi bisogna effettuare una ricerca nella lista attributes del nodo n, dando per scontato che questa lista sia di *char?
int get_attributo(node n, char *attribute, char **value);
-- JacopoSciarra - 02 May 2007

Re: get_attribute

non è che qualcuno gentilmente mi spiegherebbe come funziona questa funzione? il valore *attribute passato come paramentro che cosa è esattamente? è un elemento di una lista di *char? quindi bisogna effettuare una ricerca nella lista attributes del nodo n, dando per scontato che questa lista sia di *char?
int get_attributo(node n, char *attribute, char **value);
-- JacopoSciarra - 02 May 2007

Re: Re: Re: get_attribute
Per capire gli attributi bisogna riferirsi alle specifiche del modulo 1 del progetto: un attributo è dato da una coppia (chiave, valore). Ad esempio, nel caso specifico dell'xsML, specifico questa coppia dentro i tag:

<esempio nome_attributo="valore_attributo">

Quando chiamo get_attributo con il nome "nome_attributo" sul nodo corrispondente a esempio voglio ottenere il valore di tale attributo, ovvero la stringa "valore_attributo" (senza virgolette).


-- RobertoNavigli - 02 May 2007

tipo di dato attributo

il mio dubbio è questo...ho creato una struttura contenente 2 campi, char *text e int d, che rapprensentano la coppia nome-valore relativa ad un attributo. Questo struttura è poi stata chiamata, con typedef, data. Nel mio programma quindi, per vari motivi, la get_attributo dichiara localmente un puntatore a questa struttura. È un errore oppure no?
struct data{
   int d;
   char *text;
   };
   typedef struct data data;

nella get_attributo(....):
data *tmp;
tmp=malloc(sizeof(ELEMENT));
ELEMENT è l'alias della lista definito xsml_list.h
.
.
.
-- GianlucaSquarcia - 02 May 2007

Re: tipo di dato attributo

Non capisco perche' il tipo di dato intero. Che cosa e' intero?? Gli attributi possono avere qualsiasi chiave e qualsiasi valore (non solo numerico).

-- RobertoNavigli - 02 May 2007

Re: tipo di dato attributo

si scusi ha ragione userò un'altro char *. A parte questo...è giusto?

-- GianlucaSquarcia - 02 May 2007

Re: tipo di dato attributo

Non c'è un modo solo di farlo e non posso giudicare semplicemente da un'allocazione della struttura. Ripeto: fate voi, siete liberi di fare come volete, purché le funzioni facciano quello che devono fare.

-- RobertoNavigli - 02 May 2007

output main2b.c

quale dovrebbe essere l'output corretto?

-- GianlucaSquarcia - 02 May 2007

Re: output main2b.c

L'output corretto dovete capirlo voi. Ci sono alcune indicazioni nelle printf (ok va bene, problema va male), ma dovete iniziare a pensare che nessuno vi dirà, quando lavorate, qual è l'output corretto e qual è quello sbagliato. Cercate di capirlo da voi.

-- RobertoNavigli - 02 May 2007

(senza titolo)

per Gianluca: che senso ha fare una struttura "data" e poi un typedef struct sempre con lo stesso nome?

-- JacopoSciarra - 02 May 2007

output

Scusi prof come è possibile che il programma con il debug giri perfettamente e quando lo lancio da riga di commando nn faccia vedere nulla??

-- AlessandroMastropietro - 02 May 2007

Re: (senza titolo)

solo per abbreviare....

-- GianlucaSquarcia - 02 May 2007

Re: output

Strano. Ha provato a compilare sotto linux con gcc?

-- RobertoNavigli - 02 May 2007

Re: output

si ho provato a compilarlo nei lab a matematica e funzionava tutto anche su linux

-- AlessandroMastropietro - 02 May 2007

enum OP_ERRORS??

Scusi prof. ma l'enum. OP_ERRORS va inclusa solo in list.h o node.h o in entrambi i files(in questo caso mi da errore rechiarazine)?, perche se lo includo solo in list cosa c'entra ad esempio l'errore OP_NO_ATTRIBUTE_ERROR con l'A.D.T. creato con le liste . .? Grazie . . .


-- GabrieleIoannucci - 03 May 2007

funzioni in tempo costante

se consegno il progetto con 1 sola funzione in tempo costante invece che con 2, viene considerato sbagliato l'intero progetto?

-- GianlucaSquarcia - 03 May 2007

Re: enum OP_ERRORS???

gabrie va solo in list.h poichè quest'ultimo verrà incluso in node.h!!!!!!cmq prof per i risultati del primo modulo quando usciranno???

-- AlessandroMastropietro - 03 May 2007

scorrimento di liste

nelle specifiche c'è scritto che quando lavoriamo sui nodi, non si puo accedere direttamente ai campi di list ed iterator.. questo vuol dire che l'unico modo che abbiamo per scorrere la lista di attributi di un nodo, è usando la funzione next di un iteratore assegnato a quella lista giusto?

-- JacopoSciarra - 03 May 2007

Re: Re: Re: enum OP_ERRORS
ambe e' vero Mastro pure te c'hai ragione . . .

-- GabrieleIoannucci - 03 May 2007

Re: Re: Re: enum OP_ERRORS?
e per fortuna che hai preso 30L a primo esonero!!!!:-) Se beccamo a lezione

-- AlessandroMastropietro - 03 May 2007

Valore di ritorno della funzione "get_node_type"

Buonasera Professore. Facendo dei test a tappeto mi sono posto il problema del valore di ritorno della funzione "get_node_type". Secondo le specifiche, deve ritornare il tipo del nodo passato in input, quindi TEXT_NODE o TAG_NODE. Ma se il puntatore al nodo n fosse NULL cosa dovrebbe ritornare? E' un'eventualità non possibile (il test lo fa la funzione chiamante?) e quindi da non testare? Grazie mille.

-- AndreaMencaroni - 03 May 2007

dubbio nel main per get_attributo

Salve a tutti, non so se questa domanda e' stata gia' fatta, non ho avuto tempo di rileggere attentamente tutte le domande poste!!!

Ho un dubbio per quello che riguarda la funzione get_attributo in main2b.c:

Perche' la funzione get_attributo deve andare a vedere in t1 l'attributo "a1", se presente, se gli andiamo a far visitare t4? Nel senso, la funzione deve andare a controllare t1 perche' gli passiamo "a1", e precedentemente a t1 gli avevamo passato "a" oppure e semplicemente un errore di scrittura nella printf del main2b.c???

Tanti saluti a presto... Stefano Caruso

if (get_attributo(t4, "a1", &valore) == OP_NO_ATTRIBUTE_ERROR)
      printf("non c'e' l'attributo a1 in t1 (ok)\n");
   else    printf("c'e' l'attributo a1 in t1 (problema)\n");
-- StefanoCaruso - 04 May 2007

inizializzazione liste di NEW_TEXT_NODE e NEW_TAG_NODE

Salve, nell'inizializzare i campi list dei nodi in queste funzioni dobbiamo usare la funzione new_list(list*)??ma come se questa richiede come parametro un list* mentre abbiamo un list nella nostra struttura nodo??

-- AntonioMiranda - 04 May 2007

Re: tutte le ultime domande

Ragazzi, venite lunedì a lezione così discutiamo i vari problemi. La lezione è strettamente correlata al progetto.

-- RobertoNavigli - 04 May 2007

Re: Re: tutte le ultime domande
Scusi professore,ma io non seguo,non sono a Roma e non posso venire a lezione,potrebbe chiarire il mio dubbio?

-- AntonioMiranda - 05 May 2007

Re: funzioni in tempo costante GianclucaSquarcia

è cos' difficile riuscire a ottenere tempo costante? nella add_first come riesci ad ottenerlo? non potresti fare in modo che la add_last si comporti allo stesso modo? guarda che se ci pensi un attimo è facile!

-- SimoneMori - 05 May 2007

Re: inizializzazione liste di NEW_TEXT_NODE e NEW_TAG_NODE

Questo non è un problema di progetto, è un problema di puntatori. Consiglio un bel ripasso...

-- RobertoNavigli - 05 May 2007

main della prima parte

ciao, per far stampare anke la "e" ho dovuto aggiungere una printf dopo il ciclo di stampa. è un errore mio o del main?
while(has_next(i))
   {
      char *s = (char *)next(i);
      printf("%s,", s);
   }
   char *s = (char *)next(i);
      printf("%s,", s);
-- StefanoGuglielmo - 05 May 2007

NON ARRIVA LA MAIL DI CONFERMA DELLA CONSEGNA

c'è qualche motivo per cui non arriva la conferma? ho provato più volte...

-- SimoneMori - 05 May 2007

Re: main della prima parte

Stefano è un errore tuo.. nella funzione has_next prova a verificare che "list" = NULL e non "list"->next smile

-- FlavioPietrelli - 05 May 2007

Inserire Valori Nei Nodi

Salve a tutti. Ho un problema nelle funzioni di creazione dei nodi new_text_node e new_tag_node: ottengo un errore di segmentation fault quando tento di accedere ad uno dei campi della struttura node, come nell'esempio di codice qui riportato (l'errore vale per qualunque campo della struttura puntata da node). Evidentemente mi sfugge qualcosa..e ora come ora non capisco cosa! smile

int new_tag_node(node *n, char *name)
{
   //controllo che gli argomenti passati siano corretti
   (*n)->type=TAG_NODE;

-- ElenaAgostini - 05 May 2007

Re: Inserire Valori Nei Nodi

Elena devi allocare la struttura node prima...

-- GiuseppeSantaMariaSosso - 06 May 2007

Re: NON ARRIVA LA MAIL DI CONFERMA DELLA CONSEGNA

In effetti il suo progetto non è arrivato. Può provare con un'altra email? Oppure riprovare. Ho appena provato il form e funziona tutto bene. Accertatevi che sia caricata la pagina successiva dove viene detto che "la consegna è avvenuta correttamente" e che l'email inserita sia corretta.

-- RobertoNavigli - 06 May 2007

main2b.c ---- warning: implicit declaration of function ‘strcmp’

Salve professore, stavo compilando il main2b.c e ho notato che da un warning. Esso si riferisce al fatto che nel main non viene incluso <string.h>. Il file string.h lo includo nel file xsml_node.c. Volevo sapere se devo includerlo nel main2b.c o verra' incluso poi da voi per eseguire i test.

 if (get_attributo(t4, "a1", &valore) == OP_NO_ATTRIBUTE_ERROR)
                printf("non c'e' l'attributo a1 in t4 (problema)\n");
        else
   {
      printf("c'e' l'attributo a1 in t4 (ok)\n");
-->          if (!strcmp(valore, "10")) printf("il suo valore e' \"10\" (ok)\n");
      else printf("il suo valore e' != \"10\" (problema)\n");
   }

-- MarcoRotiroti - 06 May 2007

Accesso elementi struttura con puntatore void

Ho una domanda.. utilizzando la struttura e il puntatore void ptr riportati sotto, come è possibile accedere agli elementi della struttura? Facendo ptr = prova; e poi ptr->a; dice che "a" nn è un elemento di una struttura o di un'unione, lo stesso utilizzando un cast tipo: (prova *)ptr = prova; Grazie
void * ptr;

typedef struct prova *prova;
struct prova {
char * a;
char b;
};
-- FlavioPietrelli - 06 May 2007

Set_attributo Segmentation fault

Salve professore, innanzitutto vorrei scusarmi per la domanda fattagli in precedenza..aveva perfettamente ragione,sono stato piuttosto sciocco.Ora ho completato i file però nel testarli tramite il main2b mi succede questo:la funzione set_attributo funziona perfettamente invocata sul primo nodo(nodo t4 nel main),anche invocandola più volte e facendo dei test che verifichino il corretto valore dei parametri settati,ma chiamandola su un secondo nodo,quale è t5,il programma mi da un errore di segmentation fault.Premetto ke compilo con djgpp su windows xp.Di quale tipo potrebbe essere l'errore?Se fosse dovuto ai puntatori,non dovrebbe ripetersi allo stesso modo per ogni chiamata?Perchè questo errore si presenta solo qualora cambio nodo??

-- AntonioMiranda - 06 May 2007

problemi con il main2a.c

io ho fatto le mie strutture list e iterator con le relative funzioni. faccio vari esperienti sulle liste e funziona. Il problema è che non riesco a capire come funziona questa riga di codice del main (vedi sotto). come fa a funzionare questa conversione? La mia struttura iterator (potendola fare come preferiamo) ha al suo interno un solo campo, che è un puntatore a liste. come faccio a far copiare in *s una stringa, tramite la funzione next(i) ??

confido nella risposta di qualcuno.

grazie

char *s = (char *)next(i);
-- JacopoSciarra - 06 May 2007

Re: main2a.c

vorrei aggiungere che la funzione next(i) dentro al ciclo while mi funziona perche fa scorrere l'iteratore in avanti, infatti la lunghezza della lista è giusta. solo che mi stampa 5 caratteri errati invece di quelli giusti.. aiuto!!

-- JacopoSciarra - 06 May 2007

Re: problemi con il main2a.c

la funzione next(i) ritorna un puntatore a void.per eseguire questa assegnazione ad s che è un puntatore a char devi fare un casting...questo è il motivo per cui c'è (char*). spero di essere stato chiaro nella spiegazione

-- StefanoGuglielmo - 06 May 2007

Re: (senza titolo)

si.. capisco che serve il casting.. pero non riesco a capire come avviene la conversione dal tipo iteratore a stringa.. considerando che ognuno puo aver fatto l'iteratore con una struttura diversa.. non riesco a capire infatti prche mi stampa dei carattari strani..

-- JacopoSciarra - 06 May 2007

main2a.c

stando strettamente alle specifiche la funzione next ritorna il PROSSIMO elemento e non quello corrente. Quindi usando il file main2a.c non stamperà mai il primo carattere (cioe "a") ma partirà dal secondo. A meno che non si faccia la funzione in modo tale che ritorna il valore corrente ma che contemporanemante sposti l'iteratore al successivo elemento. Io l'avrei fatto in tutti e due i modi ma qual'è il modo giusto di procedere?

-- JacopoSciarra - 07 May 2007

Funzione IsEmpty

Sarebbe possibile modificare le specifiche della funzione in oggetto e piu' precisamente i valori di ritorno per ritornare anche dei codici di errore per valori diversi da 0 ed 1 ?

-- AlbertoRivelli - 07 May 2007

Re: main2b.c ---- warning: implicit declaration of function ‘strcmp’

Sì, non vi preoccupate.

-- RobertoNavigli - 07 May 2007

Re: Accesso elementi struttura con puntatore void

Non riesco a capire proprio la domanda. Come faccio a fare ptr = prova??

-- RobertoNavigli - 07 May 2007

Re: Set_attributo Segmentation fault

Antonio, sembra un problema di puntatori e accesso a memoria non allocata. Questi problemi sono i più difficili da scovare proprio perché il comportamento non è mai lo stesso (dipende da come è disposta la memoria in quel momento se vado o no a scrivere in una zona di memoria non libera).

-- RobertoNavigli - 07 May 2007

Re: main2a.c

Jacopo, la funzione next restituisce il prossimo elemento valido, quindi nella situazione iniziale restituisce il primo elemento, non il secondo!!!

-- RobertoNavigli - 07 May 2007

Re: Funzione IsEmpty

No, non potete modificare i prototipi, nel modo più assoluto.

-- RobertoNavigli - 07 May 2007

attributes

non ho capito bene se il campo attributes deve essere una lista di nodi attributi, se cosi fosse i valori li devo mettere nel campo attributes del nodo attribute???

-- ValerioMassimi - 08 May 2007

set_attributo, get_attributo e TXT_NODE + altro

3 domande: - Un nodo di tipo TXT non ha attributi. La set_attributo o la get_attributo di un nodo di tipo TXT deve quindi esser considerata OP_GENERIC a priori? - sembra dal main di esempio che il doppio puntatore char** value nella get_attribute debba puntare a un vettore di caratteri inizializzato DENTRO la get_attribute con la malloc, è così?

domanda meno legata al modulo specifico: - nei moduli successivi dovremo riutilizzare il codice scritto da noi nei moduli precedenti? Nel mio caso non avendo fatto il modulo1 è necessario che lo svolga anche senza consegnarlo?

Grazie in anticipo,

Luca Lollobrigida


-- LucaLollobrigida - 08 May 2007

Re: attributes

Valerio, attributes è una lista con puntatori void. ogni nodo di Attributes deve avere un nome e un valore. il tipo di dato "nodo attributo" che contiene nome e valore non esiste.


-- SimoneMori - 08 May 2007

Re: Re: attributes
professore, il tipo di dato "nodo attributo" naturalmente dobbiamo farlo noi?? altrimenti ho sbagliato.

-- MarcoMarinangeli - 08 May 2007

puntatore?

ho notato che in main2a.c, riga 6 c'è una dichiarazione di variabile di tipo list che poi alla riga 26 passa alla get iterator, che in realtà si aspetta un puntatore... è normale? grazie

-- MirkoSquitieri - 08 May 2007

Re: Funzione IsEmpty

...non è proprio una modifica, è soltanto dire che solamente 1 è vero e non tutto ciò che è diverso da zero

-- AlbertoRivelli - 08 May 2007

Re: puntatore?

ops mi correggo, la get iterator si aspetta proprio un dato di tipo list. ora il problema è proprio questo... smile

-- MirkoSquitieri - 08 May 2007

TEXT_NODE

Mi chiedevo perchè il text_node debba avere dei children ?

-- AlbertoRivelli - 08 May 2007

risultati && main2b.c t1 text node ???

Salve prof, innanzitutto le volevo chiedere se i risultati del primo modulo usciranno prima della consegna del secondo.

Poi ho notato che nel main2b.c t1 (che e' inizializzato come TEXT_NODE) viene chiamato come argomento di get_attributo e set_attributo. Cosa dobbiamo fare? Se consentiamo che un TEXT_NODE abbia in via eccezionale qualcosa dentro list attributes il main stampa allora anche l'ultimo controllo sull'attributo a1 (dicendo ok a1 = 10), altrimenti ritoriniamo l'errore ma il main non stampa l'ultimo controllo e ritorna (nel mio caso) OP_NO_ATTRIBUTE_ERROR. Come ci dobbiamo comportare?

Grazie


-- MatteoLatini - 08 May 2007

Re: risultati && main2b.c t1 text node ???

matteo ti rispondo io. devi scaricarti il main aggiornato.

-- MarcoMarinangeli - 09 May 2007

list attributes

il tipo di dato che mettiamo dentro la lista attributes deve essere definito da noi? per adesso io ho usato la struttura nodo per memorizzare gli attributi ma non sono caonvinto sia la strada giusta.

-- ValerioMassimi - 09 May 2007

problemone con la set_attribute

non riesco a far funzinare la set_attribute. da quello che ho capito questa funzione va a scorrere la lista attributes del nodo n. se trova un elemento cha ha il campo nome uguale a *attribute, ne sovrascrive il campo valore con *value. altrimenti crea un nuovo elemento di tipo attributo e lo aggiunge alla lista. tutto chiaro. il problema è che quando vado a inserire il nuovo nodo nella lista, inspiegabilmente, la funzione mi sovrascrive tutti i precedenti nodi e mi viene fuori una lista con tutti gli elementi (di tipo attributo) uguali!!! non riesco a capire il motivo. la funzione tecnicamente è semplice. la funzione add_first o add_last l'ho testata e funziona correttamente. eppure è l'unica funzione che utilizzo dentro alla set... cosa puo esserci d sbagliato?? sono quasi alla disperazione!!!!!!!!

-- JacopoSciarra - 09 May 2007

Re: problemone con la set_attribute

sembrerebbe che l'if dentro il ciclo che scorre la lista di attributi dia sempre true per questo sovrascrivi tutti gli elementi ogni volta...magari è tutt'altra cosa...ma per me è sbagliato quel controllo....

-- GianlucaSquarcia - 09 May 2007

Linkare

Dal momento che xsml_node.c utilizza le funzioni implementate in xsml_list.c.... ci pensate voi a "linkare" al file xsml_node.c il file xsml_list.c e l'eventuale main??? noi dobbiamo solo implementare le funzioni richieste senza aggiungere nient'altro giusto???

-- VincenzoNovino - 09 May 2007

Linkare

Esattamente.


-- RobertoNavigli - 10 May 2007

Problema di Execute e di Debug.

Premetto che uso winXP e compilo con MinGW Developer Studio. Il problema è il seguente, quando vado ad Eseguire il programma .EXE compilato dal mainA visualizza tutto fino alla D (ho provato ad aggiungere altre chiamate ma dopo la D per lui la lista è vuota) mentre con il Debug funziona tutto alla perfezione. La stessa cosa succede con il mainB solo che addirittura mi dice "il programma ha eseguito una operazione nn valida" e si termina con valore 1 (non ho abbastanza memoria per far girare un programmino?). Con il Debug gira perfettamente anche il mainB. Non credo sia problema di allocazione della memoria, è stranissimo e mi è gia' capitato nel modulo 1 (sembrava nn calcolasse la free). Devo cambiare compilatore oppure sono io che sto commettendo degli errori?

-- LucaGiardina - 10 May 2007

Re: Problema di Execute e di Debug.

Luca purtroppo sembra che all'università non viene minimamente calcolato insegnare il debug o ancora peggio valgrind....cmq il tuo problema non è nel compilatore è nel codice infatti sono sicuro che non hai allocato (oppure hai fatto qualche free di troppo) e le tue variabili stanno lì in memoria che "muoiono" per indeterminazione (cioè non sai quando verranno cancellate e quindi sono inutilizzabili perchè non sono affidabili). Se magari butti sto cazzo di xp ti fai pure un favore, infatti su linux c'è valgrind che è un programma (simile ma non proprio a un debugger) che serve proprio a trovare errori di questo tipo. Anzi visto che nessuno qua ce lo spiega vi dico il comando principale:

valgrind --leak-check=full --show-reachable=yes ./main

e con questo controllate oltre agli errori, anche le "perdite" di memoria ovvero la memoria che allocate e non liberate. Se invece la memoria non vi interessa (visto che noi non sappiamo che vuol dire free()):

valgrind --leak-check=no ./main

occhio che il main è l'eseguibile!!!!


-- MatteoLatini - 10 May 2007

Re: Re: problemone con la set_attribute
non puo essere il contrllo if, perche quando fa il contrllo if, se lotrova positivo non aggiunge un nodo, ma sovrascrive solo quello preso in esmae dall'if. e infatti cosi fa. quando invece il contrllo è negativo, deve mettere un altro nodo. ed è qui il problema. invece di inserirlo e basta (in testa o in coda) mi sovrascrive anche tutti gli altri. non riesco a capire perche si comporta cosi, visto che l'unica cosa che usa, in pratica è la add_first, che ho testato in tutti i modi e funziona correttamente..

-- JacopoSciarra - 10 May 2007

Re: Re: Re: problemone con la set_attribute
gdb

-- MatteoLatini - 10 May 2007

Re: set_attributo, get_attributo e TXT_NODE? + altro

1) sarebbe buona norma farlo, 2) sì, 3) no, vi forniremo le nostre implementazioni

-- RobertoNavigli - 10 May 2007

Re: list attributes

Sì, dovete definirlo voi!!! node non c'entra niente...

-- RobertoNavigli - 10 May 2007

Funzioni in tempo costante

Ho finito il progetto, ma non ho considerato il fatto delle funzioni in tempo costante. Qualcuno potrebbe consigliarmi un manuale o una guida online che spieghi in modo semplice come ottenerle? grazie

-- MarcoMarinangeli - 10 May 2007

Re: Funzioni in tempo costante

Non c'è bisogno di un manuale: basta realizzare le due funzioni add_first e add_last il modo che non scorrano l'intera lista per inserire un elemento in test o in coda rispettivamente.

-- RobertoNavigli - 10 May 2007

Errore da trattare?

Devo trattare i possibili errori che si otterrebbero passando alle funzioni che ricevono una lista come argomento (es: add_first) una lista non iniziallizata mediante la funzione new_list? Oppure considero che se viene passata una lista e` sempre inizializzata a NULL od ha almeno un elemento?

-- ManueleTamburrano - 10 May 2007

Problema in struct node

Ho dichiarato così il tipo di dato list: typedef struct list_node *list ora il problema è che se lascio la struct node come l'avete implementata voi (caso 1) delle volte mi da un errore in compilazione: mi dice "error before 'list'","no semicolon at end of struct". Se invece utilizzo il modo 2 non ho problemi eppure dovrebbero essere equivalenti. A)Da cosa può dipendere?? B)Posso implementare la struct node come il caso 2????

1)
struct node {
char *name;
node_type type;
list attributes;
list children;
} ;
2)
struct node {
char *name;
node_type type;
struct list_node *attributes;
struct list_node *children;
} ;
-- MarcoMarinangeli - 10 May 2007

Re: Errore da trattare?

Dove è possibile restituire il codice d'errore, sarebbe bene farlo.

-- RobertoNavigli - 10 May 2007

Re: Problema in struct node

Attenzione: Non devo ridefinire il tipo list!!!! Il tipo list viene definito solo in xsml_list.h. Non devo definire un tipo list ad hoc per i nodi...

Comunque il problema sembra essere dovuto al fatto che typedef si trova dopo la struttura. Non vedo altre possibilita'.

-- RobertoNavigli - 10 May 2007

Re: Re: Problema in struct node
La mia typedef struct list_node *list non è ad hoc per i nodi..è quella che utilizzo per le liste ed è dichiarata in xsml_list.h. Forse quando il prog. non funziona è perchè prova a compilare il file xsml_node.h prima di xsml_list.h non riconoscendo il tipo "list".. posso modificare il tipo node mettendo "struct list_node *attributes" al posto dell'equivalente (alemno dovrebbe) "list attributes"??

-- MarcoMarinangeli - 10 May 2007

Re: Re: Re: Problema in struct node
Non si può!!! Il tipo list deve essere quello originario, non posso modificarlo. Non vedo dove sia il problema. Semplicemente includo prima xsml_list.h e quindi definisco struct node { ... } che ha due liste di tipo list tra i suoi campi...

Se il problema è l'inclusione multipla dello stesso file .h, basta utilizzare le direttive del preprocessore:

#ifdef, #define, #endif (come abbiamo fatto nel definire xsml_lex.h nel modulo 1).


-- RobertoNavigli - 10 May 2007

Re: Re: Re: Problema in struct node
Professore penso di aver risolto. Penso che il mio problema era dovuto al fatto che includevo xsml_node.h nel file xsml_list.h. quindi il compilatore andava a vedere prima xsml_node.h e trovava questo tipo list non ancora dichiarato. Grazie molte per la disponibilità.

-- MarcoMarinangeli - 10 May 2007

Re: Re: Funzioni in tempo costante
professore, per implementare la funzione add_last in modo da eseguirla in tempo costante, ho usato una variabile di classe static che mantiene il puntatore alla coda. questo metodo va bene solo se però non vengono eseguite cancellazioni, e secondo le specifiche non sono previste... è un modo corretto di fare o devo trovare un altro metodo?

-- StefanoGuglielmo - 10 May 2007

Re: Re: Errore da trattare?
ok, ma il problema e` questo: come fa una funzione a capire se il contenuto di l e` un list o un dato casuale assegnatogli dlla dichiarazione? Per assurdo l potrebbe anche contenere NULL o una struct list, quindi i controlli fatti su l risulterebbero errati.

Il C permette in qualche modo di controllare se un dato e` stato solo dichiarato e non inizializzato o qualcosa del genere?


-- ManueleTamburrano - 10 May 2007

Funzione add_last

Forse la mia domanda è banale ma volevo sapere se la funzione add_last deve inserire un elemento anche se la lista è vuota.

-- GioacchinoMendola - 10 May 2007

op_errors

la maggior parte delle funzioni da implementare ritornano un OP_OK o un errore vorrei chiedere come gestire i casi d'errore....

se ad esempio i puntatori passati alle varie funzioni anziche puntare alle locazioni utili puntano a NULL posso retstituire OP_GENERIC giusto??? poi quale altri errori possono verificarsi???(tralasciando OP_NO_ATTRIBUTE_ERROR, che lo usiamo solo in get attribute)Si devono gestire altre situazioni d'errore???Quali potrebbero essere i casi in cui usiamo OP_MEM_ERROR??? grazie


-- VincenzoNovino - 10 May 2007

MainA e MainB

Finalmente ho risolto il problema con la compilazione. Adesso però ne è sorto un altro.. quando compilo con il MainA lui passa come nodi della lista dei (void *)char che nn sono contenuti in nessun puntatore e quindi ho bisogno di allocare e copiare i dati nella lista.. nel MainB io passo alla lista dei puntatori a struttura che aggiungo tramite il puntatore.. sto sbagliando qualcosa nell'implementazione oppure è giusto che funzioni solo il MainB dopo l'implementazione di xsml_node.c?

-- LucaGiardina - 10 May 2007

Re: op_errors

mem_error è subordinato alla malloc/calloc che sia.. quando hai allocato memoria al puntatore restituisce NULL se è finita.

if(!punt=mall bla bla bla)
 return op_mem_erccecc.
-- LucaGiardina - 10 May 2007

Come ritorno gli errori in casi particolari?

Salve a tutti. Per le funzioni che non ritornano un intero, ma un puntatore, come devo comportarmi per controllare errori che si possono presentare?Ritorno comunque un intero oppure uso una exit?Non posso tralasciare certi errori..altrimenti avrei dei segmentation fault.

-- ElenaAgostini - 10 May 2007

Come ritorno gli errori in casi particolari?

Salve a tutti. Per le funzioni che non ritornano un intero, ma un puntatore, come devo comportarmi per controllare errori che si possono presentare?Ritorno comunque un intero oppure uso una exit?Non posso tralasciare certi errori..altrimenti avrei dei segmentation fault.

-- ElenaAgostini - 10 May 2007

Re: Funzioni in tempo costante

Non è un metodo corretto: impedisce di lavorare su più liste contemporaneamente!!!

-- RobertoNavigli - 10 May 2007

Re: Funzioni in tempo costante

Non è un metodo corretto: impedisce di lavorare su più liste contemporaneamente!!!

-- RobertoNavigli - 10 May 2007

Re: Re: Re: Errore da trattare?
No, non c'è nessun modo in C di controllare ciò. Non vi preoccupate troppo di questi problemi, è responsabilità anche del chiamante.

-- RobertoNavigli - 10 May 2007

Re: Funzione add_last

Sì.

-- RobertoNavigli - 10 May 2007

Re: Come ritorno gli errori in casi particolari?

Elena, quando non e' previsto di restituire un codice d'errore si puo' agire come si crede: lasciare che il segmentation fault venga emesso oppure stampare l'errore e uscire.

-- RobertoNavigli - 10 May 2007

Re: Re: Come ritorno gli errori in casi particolari?
quindi posso scrivere un qualcosa come nel codice riportato sotto?
if(i == NULL) { fprintf(stderr, "Errore di allocazione della memoria\n"); exit(-1); }

-- ElenaAgostini - 11 May 2007

conflitto sul typedef

118 j:\modulo2\second~1.cpp conflicting types for `typedef struct node * node'

in fase di compilazione, mi da problemi se uso NODE come nome del tipo puntatore alla struct node.

Che faccio?


-- ManueleTamburrano - 11 May 2007

Re: conflitto su typedef

Se il problema non è colpa sua, quando compileremo con gcc non ci sarà questo conflitto (cio' significherebbe che il suo compilatore utilizza delle librerie predefinite dove node e' gia' definito). Se invece il problema e' suo, allora viene caricata due volte la definizione di node per qualche ragione (problema importante). Consiglio di compilare con gcc sotto linux o sotto windows (DJGPP).

-- RobertoNavigli - 11 May 2007

nome del file da consegnare

leggo nella pagina della consegna che il nome va chiamato modulo.tar.gz va bene cosi o va chiamato modulo2.tar.gz ??

scusate la pignoleria ma non si sa mai...


-- JacopoSciarra - 11 May 2007

Re: nome del file da consegnare

credo sia indifferente (io l'ho chiamato diversamente), tanto alla consegna ho visto che viene modificato e zippato con il tuo nome twiki.

-- VladLupascu - 11 May 2007

Re: nome del file da consegnare

si infatti.. pero non si sa mai.. non vorrei buttare ore di lavoro per una sciocchezza..

-- JacopoSciarra - 11 May 2007

MODULO III

Prof. oggi lo mette il terzo modulo online?

-- MarcoMarinangeli - 15 May 2007

3 Modulo.

Buonasera, non sono potuto essere presente alla lezione di lunedì. Volevo sapere quando sarà possibile avere le specifiche del 3°modulo? I risultati dei precedenti due moduli, quando saranno disponibili?

Saluti, RigersYlli


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

-- RobertoNavigli - 23 Apr 2007

Edit | Attach | Watch | Print version | History: r156 < r155 < r154 < r153 < r152 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r156 - 2007-05-15 - RigersYlli






 
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