Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-05-2007, 16:37   #1
fz6
Member
 
Iscritto dal: Mar 2006
Messaggi: 46
[c] scorrimento di liste tramite un iteratore- help!!

ho un problema nel far scorrere un elemento di tipo iteratore lungo una lista. l'elemento di tipo iteratore non è altro in pratica che pun puntatore alla lista.

le strutture sono queste:

Codice:
struct NodoLista {
void *value;
struct NodoLista *next;
};

typedef struct NodoLista *list;



struct nodoIt {
list *punt;
};

typedef struct nodoIt *iterator;
tramite la funzione get_iterator si assegna a un iteratore una lista
Codice:
iterator get_iterator(list l) {

iterator I;
I = malloc(sizeof(struct nodoIt));
if (!l) return NULL;
I->punt = l;
return I;
}
ora a me serve una funzione che faccia semplicemente scorrere l'iteratore di una posizione avanti. L'ho fatta in qyesto modo:
Codice:
void *next(iterator i) {

list t = NULL;
t = (list *) i->punt;
            if (t->next == NULL) return NULL;
t = t->next;
i->punt = t;

}
effettivamente la funzione mi fa scorrere l'iteratore avanti pero quando la lista finisce mi va in segmentation default.. come posso fare??
fz6 è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2007, 17:30   #2
lucas87
Bannato
 
Iscritto dal: Oct 2006
Messaggi: 170
CIAO TECNOLOGIA INFORMATICA O INFROMATICA PROGETTO PROGRAMMAZIONE 2, TI VA MALE è?
lucas87 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2007, 11:03   #3
fz6
Member
 
Iscritto dal: Mar 2006
Messaggi: 46
abbastanza male via.. eheh

anche a vedere su twiki sta funzione next ha dato piu di qualche problemino...

mi sai dare qualche suggerimento?
fz6 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2007, 13:28   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Io avrei fatto così (codice non testato!):
Codice:
typedef struct node
{
    void        *value;
    struct node *next;
} NODE, *PNODE;

typedef struct
{
    PNODE head;
} LIST, *PLIST;

typedef struct
{
    PNODE node;
} ITERATOR, *PITERATOR;


PITERATOR getIterator (PLIST pl)
{
    PITERATOR pi;

    pi = (PITERATOR) malloc (sizeof (ITERATOR));

    if (pi != NULL)
        pi->node = pl->head;

    return pi;
}


PNODE next (PITERATOR pi)
{
    PNODE pn;

    pn = pi->node;

    if (pn != NULL)
        pi->node = pn->next;

    return pn;
}
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2007, 16:36   #5
fz6
Member
 
Iscritto dal: Mar 2006
Messaggi: 46
Quote:
Originariamente inviato da VeeJ Guarda i messaggi
Ci provo

Con l'istruzione t = (list *) i->punt; stai assegnando a t (di tipo list) il valore di una variabile di tipo puntatore a list.

Quindi se non sbaglio dovresti fare t=*(i->punt), e alla fine, al posto di i->punt = t; dovrebbe esserci i->punt = &t;

Inoltre la funzione next in un caso ritorna qualcosa (se t->next==NULL), nell'altro caso non ritorna niente!

Comunque non ho provato a farlo girare con queste modifiche... fammi sapere
ho provato a fare le modifiche che mi hai detto, che tra l'altro mi sebrano correttissime..la funzione diventa cosi..

void *next(iterator i) {
// sposta l'iteratore avanti di una posizione sulla lista
list t = NULL;
t=*(i->punt);

if (t->next == NULL) i->punt = NULL;
else {
t = t->next;
i->punt = &t;
}

}

pero in questo modo m va in segmentation default alla sua prima chiamata, mentre prima mi ci andava solo quando era a fine lista...
fz6 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2007, 16:39   #6
fz6
Member
 
Iscritto dal: Mar 2006
Messaggi: 46
Quote:
Originariamente inviato da andbin Guarda i messaggi
Io avrei fatto così (codice non testato!):
Codice:
typedef struct node
{
    void        *value;
    struct node *next;
} NODE, *PNODE;

typedef struct
{
    PNODE head;
} LIST, *PLIST;

typedef struct
{
    PNODE node;
} ITERATOR, *PITERATOR;


PITERATOR getIterator (PLIST pl)
{
    PITERATOR pi;

    pi = (PITERATOR) malloc (sizeof (ITERATOR));

    if (pi != NULL)
        pi->node = pl->head;

    return pi;
}


PNODE next (PITERATOR pi)
{
    PNODE pn;

    pn = pi->node;

    if (pn != NULL)
        pi->node = pn->next;

    return pn;
}
non posso cambiare i prototipi delle funzioni perche sono obbligato dalle specifiche del prof...
fz6 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2007, 16:41   #7
fz6
Member
 
Iscritto dal: Mar 2006
Messaggi: 46
che stia sbagliando la get_itarator in principio? la cosa strana è che cmq finche non si è a fine lista l'iteratore pare funzionare.. è come se non mi riconoscesse il NULL finale...
fz6 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2007, 16:50   #8
fz6
Member
 
Iscritto dal: Mar 2006
Messaggi: 46
in teoria per far spostare avanti di una posizione l'iteratore non basterebe fare la seguetne istruzione?

i->punt = (list *) (*(i->punt))->next;


ps: faccio il casting perche i->punt dev'essere di tipo list, o meglio puntatore a list..

dov'è che sbaglio???
fz6 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2007, 17:18   #9
fz6
Member
 
Iscritto dal: Mar 2006
Messaggi: 46
aaaaaa ho risolto.. la funzione next mi funziona..riesco a scorrere correttamente la lista fino alla fine e non avere errori..

sinceramente non ho ben capito come ho fatto perche la funzione non mi pare di averla cambiata.. (anche se dopo ore e un fine sett ad alto tasso alcolico, tutto è possibile)

fz6 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2007, 17:32   #10
fz6
Member
 
Iscritto dal: Mar 2006
Messaggi: 46
ora peròmi sorge un altro problema

nel main che fornisce il prof c'è un ciclo while fatto cosi:
Codice:
i = get_iterator(l);
	int cont=0;
	/* deve stampare "a, b, c, d, e," */
	while(has_next(i))
	{
		cont++;
		char *s = (char *)next(i);
		printf("%s,", s);
	}
	printf("\nlunghezza lista: %d\n",cont);
usando le mie funzioni, l'iteratore scorre correttamente la lista (la lunghezza fornita è quella giusta) pero non mi stampa i caratteri giusti (quelli nel commento, che sono inseriti sempre nel main) ma dei caratteri che non c'entrano nulla.
mi chiedo.. come puo funzionare quella conversione di stringhe? la next ritorna un void (obbligatorio),e il prof a priori non sa come è fatta la struttura dell'iteratore.. che nel mio caso è:

Codice:
struct nodoIt {
	list *punt;
};

typedef struct nodoIt *iterator;
fz6 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2007, 21:55   #11
fz6
Member
 
Iscritto dal: Mar 2006
Messaggi: 46
il fatto è che se gli faccio ritornare il puntatore poi non mi funziona piu.. cmq essendo una funzione di tipo void è obbligatorio far ritornare qualcosa? io pensavo che fosse sufficente modificare il mio puntatore dentro alla funzione, in modo che la modifica fosse permanente.. senza pero tornare nulla con il return..
fz6 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2007, 23:27   #12
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Codice:
void *next(iterator i) {

list t = NULL;
t = (list *) i->punt;
            if (t->next == NULL) return NULL;
t = t->next;
i->punt = t;

}
Ma sta roba ti si compila??

t = (list *) i->punt; è sbagliato perchè t è di tipo list e i->punt è di tipo list , quindi dovrebbe essere :

t = i->punt;

Inoltre la tua funzione ha poco senso. Non si capisce se vuoi ritornare un valore di ritorno o meno .

il prototipo è del tipo :

void *next(iterator) , dal quale sembrerebbe tu voglia ritornare un tipo "puntatore a tipo sconosciuto" , il problema è che dentro la funzione tu non ritorni proprio nulla , tranne NULL in caso la lista passata alla funzione sia non valida. Inoltre dal fatto che tu passi un tipo "iterator" come parametro che è un puntatore a tipo "struct NodoIt" sembra che tu voglia modificare dalla funzione il valore dei campi della struct puntata da iterator e non ritornare un puntatore al nodo successivo (come invece il valore di ritorno farebbe intendere) .

La mia proposta per la nuova funzione next è :

Codice:
void next(iterator i) {

if (i->punt == NULL) return;

i->punt = i->punt->next;

}
Ciao

PS : Ho appena letto che hai risolto e a quanto sembra la tua funzione deve ritornare qualcosa e sembra un char .... in tal caso bisogna cambiare un bel po' di cose. Guardando il main mi verrebbe in mente :
Codice:
void *next(iterator i) {

void *p = NULL;

if (i->punt == NULL) return NULL;

p = i->punt->value;

i->punt = i->punt->next;

return p;

}
In pratica questa funzione restituisce il valore contenuto nel nodo corrente della lista e come SIDE EFFECT manda in avanti la lista di 1.
Ciao
__________________
GPU Compiler Engineer

Ultima modifica di AnonimoVeneziano : 06-05-2007 alle 23:35.
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
Oppo Find X10, X10 Pro Max e X10 E: conf...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:44.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v