Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Arrivato sul mercato italiano a fine marzo, la serie Boox Go 10.3 (Gen II) offre Android 15, penna da 4096 livelli e retroilluminazione opzionale (nel modello da noi provato, Lumi, presente). La serie si compone di due tablet ePaper che fanno da e-reader, blocco note digitale e persino browser, tutto a un prezzo che fa dimenticare i prodotti di brand più blasonati
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
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


Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con ...
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
American Express pronta ad acquisire The...
Batterie liquide senza metalli: scoperto...
FRITZ!, devolo, LANCOM e TDT danno vita ...
Quanto tempo passiamo online? In Italia ...
Fox Corporation si compra Roku per 22 mi...
AMD resuscita Zen+: due nuovi processori...
Debutto cinematografico per HONOR Robot ...
Copilot+ PC, ogni PC con una GPU dedicat...
Dreame taglia i prezzi: come orientarsi ...
L'Italia entra nell'era dei 2 nanometri!...
Stranger Than Heaven rivoluziona il comb...
Honor X80 Pro Max: svelata la data di la...
Chiuso finanziamento da 21 milioni: Orbi...
E-commerce in crescita in Italia: entro ...
Capcom non si ferma più: un Resid...
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:21.


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