[ninux-dev] [C, Alfred] Segmentation fault su linked list

Saverio Proto zioproto at gmail.com
Wed Nov 18 22:13:36 CET 2015


Ciao,

nella tua email non hai dato una URL dove scaricare il tuo codice,
quindi non ho potuto cercare il bug nel dettaglio.

scusa mi pare che stai reinventando la ruota riscrivendo il tuo codice
per le linked lists. Un bellissimo esercizio didattico, ma ad un certo
punto nella vita puoi iniziare ad usare list.h :)

come vedi è gia nel codice di alfred:

http://git.open-mesh.org/alfred.git/blob/HEAD:/list.h

puoi usare queste funzioni per gestire la linked list.

se greppi nel codice di alfred trovi qualche esempio di come usano le
funzioni di list.h per gestire le liste.

Saverio



Il 18 novembre 2015 14:54, Germano Massullo
<germano.massullo at gmail.com> ha scritto:
> Alfred[2] quando stampa la topologia della rete (nei vari formati JSON
> disponibili), fa delle iterazioni leggendo dalla socket UNIX del
> servizio batman, scrivendo di volta in volta su una stessa struct che
> poi da in pasto a delle printf.
> Il formato di output NetJSON che sto tentando di realizzare, elenca
> tutti i link tra i nodi alla fine del file, in separata sede rispetto
> all'elenco delle proprietà degli stessi, perciò occorre modificare tale
> approccio in quanto al termine di una iterazione, se si tenta di
> rieseguire la sopracitata lettura, non si trova alcunché.
> Ora a prescindere da cosa inneschi la comunicazione tra il servizio
> batman ed alfred, dato che a me interessa memorizzare da una parte i
> dati della topologia di rete, ho creato una linked list, dove ogni
> pezzetto è una "passata di lettura" della socket.
>
> Solo dopo esser riuscito a generare un output NetJSON completo allora
> passerò ad una fase di ottimizzazione del codice per renderlo conforme
> allo stile del codice degli sviluppatori Alfred.
>
> Attualmente le chiamate di funzione coinvolte nel problema che sto per
> descrivervi sono:
> main (vis.c:1086) --> vis_get_data (vis.c:959) --> vis_read_answer
> (vis.c:889) --> insert_netjson_entry (vis.c:757)
>
>
> ***************************************
> *descrizione di alcune porzioni di codice*
> ***************************************
>
> (in vis.c) void insert_netjson_entry(struct vis_v1_extended**
> vis_data_collection_tail, struct vis_v1* data)
> prende la struct popolata dalla n-esima passata di lettura dalla socket
> UNIX e ne memorizza i dati su una struct temporanea, dopodiché prende
> quest'ultima e la inserisce nella coda della linked list
>
> (in vis.h) struct vis_v1_extended
> È la versione "linked list" di struct vis_v1 che è la struttura dove
> vengono memorizzati i dati di un singolo nodo durante la "passata di
> lettura" sulla socket UNIX.
>
> ***********
> *problema*
> ***********
> All'indirizzo di StackOverflow [1] trovate una descrizione del piccolo
> problema che sto avendo durante l'inserimento del nuovo oggetto in coda
> alla linked list. Per quanto riguarda la soluzione che mi viene proposta
> non riesco a capirne il senso. Facendo
> p->next = *vis_data_collection_tail;
> si imposta come "next" della struct temporanea, la coda della linked
> list. Io invece vorrei fare proprio il contrario.
>
> Suggerimenti?
>
> [1]:
> http://stackoverflow.com/questions/33779975/segmentation-fault-in-copying-structures-data-into-a-linked-list
> [2]: http://www.open-mesh.org/projects/alfred
>
> _______________________________________________
> ninux-dev mailing list
> ninux-dev at ml.ninux.org
> http://ml.ninux.org/mailman/listinfo/ninux-dev



More information about the ninux-dev mailing list