Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-05-2007, 17: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, 18: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, 12: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, 14: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, 17: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, 17: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, 17: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, 17: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, 18: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, 18: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, 22: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 07-05-2007, 00: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 : 07-05-2007 alle 00:35.
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
La capsula SpaceX Dragon CRS-33 ha acces...
La NASA è sempre più vicin...
Crisi delle memorie: ASUS torna al passa...
Le console next-generation potrebbero es...
Gemini cresce ancora: la quota di mercat...
Samsung sfida TSMC: la capacità produtti...
Iliad alza il prezzo della fibra ottica ...
Il prossimo low cost di POCO sarà il più...
The Elder Scrolls VI: ecco le ultime sul...
Ecco i saldi di fine anno Amazon, 34 off...
iPhone Fold: scorte limitate al lancio m...
OpenAI porterà la pubblicità in ChatGPT ...
TSMC aumenterà ancora i prezzi: nel 2026...
Marvel pubblica anche il secondo teaser ...
Nuovo accordo tra xAI e il Pentagono: l'...
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: 16:57.


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