Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Con un prezzo di 2.999 euro, il Panasonic Z95BEG entra nella fascia ultra-premium dei TV OLED: pannello Primary RGB Tandem, sistema di raffreddamento ThermalFlow, audio Technics integrato e funzioni gaming avanzate lo pongono come un punto di riferimento
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
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
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


Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Nilox svela la sua nuova gamma: ci sono ...
Juventus-Inter, novità storica: l...
SAP presenta il suo cloud sovrano per l'...
Google riduce i costi di Veo 3: i video ...
Signal introduce i backup in cloud: grat...
Pure Loop 3 FX, da be quiet! un modo sem...
Hollow Knight: Silksong, scoperto un cod...
AMD espande il supporto di FSR 4 a oltre...
Tesla lancia Megablock e Megapack 3: bat...
Sciopero della fame: una serie di attivi...
Sfida Nintendo in tribunale senza avvoca...
GEEKOM entra nel settore dei notebook co...
Il giudice blocca l'accordo da 1,5 milia...
Non solo creativi: le app business che r...
Amazon questa mattina è scatenata...
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: 13:32.


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