Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Quattro modi di indossarlo, stessa app del Plaud Note Pro e integrazione con il desktop. Il registratore IA da indossare di Plaud eccelle in mobilità, ma resta vincolato all'abbonamento ed è facile da perdere
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro
Xiaomi ha portato Redmi Watch 6 anche sul mercato italiano, puntando su un display AMOLED da 2,07 pollici con picco di luminosità a 2000 nit, frame in alluminio da 9,9mm e un'autonomia dichiarata di 12 giorni. Lo smartwatch gira su HyperOS 3 e integra GPS, Bluetooth 5.4 e oltre 150 sport mode. Il tutto a meno di 100 euro
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Con 22 tasti, il pulsante 5D, lo Shift Mode e il sensore PixArt 3395 da 26.000 DPI, il nuovo mouse wireless di Mad Catz si rivolge in modo preciso ai giocatori di MMO e RPG. Ma chi conosce già il R.A.T. 8+ ADV si accorgerà subito di quanto i due prodotti condividano, e di dove invece divergono
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-05-2005, 17:04   #1
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
[C] Problema esercizio C sulle liste

Ciao, tra 8 giorni ho l'esame...inizio a capirci qualcosa ma mi sono impallato con la soluzione di questo esercizio (messa online dal proff ma mi sembra sbagliata ditemi voi)

L'esercizio chiede di scrivere una funzione che presa in ingresso una lista di char elimini i doppioni e restituisca il puntatore alla lista cos modificata

Il codice della soluzione è questo (è quella del proff...io ho modificato solo la dichiarazione delle variabili e puntatori perchè mi trovo meglioa dichiararli all'inizio del codice anzichè in mezzo al codice...i commenti invece sono i miei, ditemi se ho sbagliato qualcosa):

Codice:
/* La funzione  RipulisciStr() prende in input il puntatore al primo nodo di una
   lista di interi, elimina i duplicati ritorna il puntatore al primo nodo della
   lista così ripulita, gli elementi della lista hanno il seguente tipo:
       
       typedef struct SList{
           char *stringa;
           struct SList *next;
       } SList;
*/
typedef struct SList{
           char *stringa;
           struct SList *next;
       } SList;

SList *RipulisciStr(SList *L){
    
    SList **pL;     /* Dichiaro il doppio puntatore pL che contiene l'indirizzo 
                       della locazione corrente */
    SList *elem;    // Dichiara il puntatore elem
    
    pL = &L;   // Imposta pL con l'indirizzo del primo elemento della lista (?)
    
    while(*pL != NULL){    // Finchè non si è giunti alla fine della lista
           
           elem = *pL;  /* Imposta il valore di elem all'indirizzo del nodo
                           puntato da Pl */
    
           /* Se la funzione TrovaStr restituisce un valore non nullo */                                               
           if(TrovaStr(elem->stringa, elem->next)){
               
               *pL = elem->next; /* Imposta il valore puntatoda da pL con
                                    l'indirizzo del campo next puntato da elem*/
               free(elem->stringa);
               free(elem);
           }
           /* Se non è stato trovato un doppione nella lista pL contiene
              l'indirizzo del prossimo elemento rispetto al campo elem */
           else
             pL = &(elem->next);
    }
    return L;
}

/* Funzione ausiliaria che determina se la stringa str è presente o meno nella
   lista di stringhe */

short TrovaStr(const char *str, const SList *L){
    
    while(L != NULL && strcmp(str, L->stringa) != NULL)
        L = L->next;
    
    return(L != NULL);
}
Ci sono varie cose che non mi tornano:

1) Ma quando faccio pL = &L vuol dire che metto in pL l'indirizzo del puntatore al primo nodo della lista vero? quindi *pL mi dovrebbe dare l'indirizzo del primo nodo....giusto? e **pL che dovrebbe darmi allora?!?!

2) Se trova un doppione libera lo spazio del vettore stringa e poi libera il nodo ma non và a rilinkare i nodi della lista una volta eliminato un nodo...mi pare strano !!!

3) non ho capito bene che restituisce la funzione ausiliaria....

vi prego aiutatemi...ditemi che non sono completamente demente e che in questa soluzione c'è qualcosa che non torna...
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 17:21   #2
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
premessa: il tuo prof ha un pessimo modo di programmare (è talmente ingenuo da far tenerzza...).

Quote:
1) Ma quando faccio pL = &L vuol dire che metto in pL l'indirizzo del puntatore al primo nodo della lista vero? quindi *pL mi dovrebbe dare l'indirizzo del primo nodo....giusto? e **pL che dovrebbe darmi allora?!?!
il nodo stesso, no?

Quote:
2) Se trova un doppione libera lo spazio del vettore stringa e poi libera il nodo ma non và a rilinkare i nodi della lista una volta eliminato un nodo...mi pare strano !!!
hai ragione: si vede che ti ho addestrato io!!! e quello è un errore, ma ce n'è anche un altro!! riesci a trovarlo?

Quote:
3) non ho capito bene che restituisce la funzione ausiliaria....
ragiona: l'operatore != restituisce un valore booleano, cioè restituisce 0 se le due espressioni sono uguali, 1 se sono diverse; quindi la funzione ausiliaria ti restituisce un valore indicativo del fatto che sia stato trovato o meno un doppione: infatti se il doppione non è stato trovato, con l'iterazione L sarà arrivato alla fine (cioè a NULL), quindi "L != NULL" restituirà 0 e la funzione pure (giustamente la funzione restituisce 0 se non trova il doppione, 1 altrimenti).

Quote:
vi prego aiutatemi...ditemi che non sono completamente demente e che in questa soluzione c'è qualcosa che non torna...
e va bene, questa volta te lo sei meritato: non sei completamente demente (anzi!) e in questa soluzione ci sono molte cose che non tornano (e se mi sbaglio pure io allora ad essere dementi saremo in due: contento? ); ma ti dirò di più: con un professore così, capisco perfettamente che tu ti lamenti delle difficoltà con il C e con le liste.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 17:28   #3
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
Quote:
Originariamente inviato da 71104
premessa: il tuo prof ha un pessimo modo di programmare (è talmente ingenuo da far tenerzza...).

il nodo stesso, no?

hai ragione: si vede che ti ho addestrato io!!! e quello è un errore, ma ce n'è anche un altro!! riesci a trovarlo?

ragiona: l'operatore != restituisce un valore booleano, cioè restituisce 0 se le due espressioni sono uguali, 1 se sono diverse; quindi la funzione ausiliaria ti restituisce un valore indicativo del fatto che sia stato trovato o meno un doppione: infatti se il doppione non è stato trovato, con l'iterazione L sarà arrivato alla fine (cioè a NULL), quindi "L != NULL" restituirà 0 e la funzione pure (giustamente la funzione restituisce 0 se non trova il doppione, 1 altrimenti).

e va bene, questa volta te lo sei meritato: non sei completamente demente (anzi!) e in questa soluzione ci sono molte cose che non tornano (e se mi sbaglio pure io allora ad essere dementi saremo in due: contento? ); ma ti dirò di più: con un professore così, capisco perfettamente che tu ti lamenti delle difficoltà con il C e con le liste.

che intendi che mette il nodo stesso in pL?! scusa ma stò un po' fuso ora, ah grazie mille della tua costante disponibilità...ti venero
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 17:35   #4
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1455
Quote:
Originariamente inviato da 71104
premessa: il tuo prof ha un pessimo modo di programmare (è talmente ingenuo da far tenerzza...).
Eh forse sono esempi semplici fatti di proposito. Non capiscono così figuriamoci se volesse complicarli
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 17:39   #5
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
Quote:
Originariamente inviato da beppegrillo
Eh forse sono esempi semplici fatti di proposito. Non capiscono così figuriamoci se volesse complicarli
si vabbè ma che cavolo certe cose sò allucinanti...elimini un nodo dalla lista...devi rilinkare gli altri altrimenti quando vai a fare la scansione sono casini
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 19:17   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da beppegrillo
Eh forse sono esempi semplici fatti di proposito. Non capiscono così figuriamoci se volesse complicarli
non, non hai capito: non mi riferivo alla chiarezza, intendevo dire che il suo prof a programmare è una sega! con quella sedicente "soluzione" in poche righe ha preso tanti di quegli strafalcioni che a pensare a tutti quei poveri studenti in balìa di quel cretino vengono prima i brividi e poi una pena infinita... povero darkangel e poveri i compagni suoi...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 19:22   #7
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da D4rkAng3l
che intendi che mette il nodo stesso in pL?! scusa ma stò un po' fuso ora, ah grazie mille della tua costante disponibilità...ti venero
denghiu' ^^ cmq, prendi questo esempio:

Codice:
typedef _nodo {
//...
} nodo, *pnodo;
.
.
.
nodo n;
pnodo pn = &n;
pnodo *ppn = &pn;
tu hai questo nodo n e un puntatore ad esso che si chiama pn; poi hai anche una variabile ppn che punta a pn; se tu fai il dereferencing di ppn ottieni pn; se fai il dereferencing di pn (cioè *pn) che cosa ottieni? ecco, la stessa cosa la ottieni facendo il doppio dereferencing di ppn, cioé **ppn; quello che ottieni non è un puntatore ad n, ne' è un puntatore a un puntatore ad n: è n stesso, cioè risulta precisamente
Codice:
**ppn == n;
spero di essere stato chiaro.

Ultima modifica di 71104 : 23-05-2005 alle 19:24.
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro Redmi Watch 6 in prova: lo smartwatch con ampio ...
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ...
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC Radeon RX 9070 GRE, AMD la porta in tutto il mon...
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare Reolink OMVI 3i WiFi: videosorveglianza pi&ugrav...
Guild Wars 3 è ufficiale: ArenaNe...
I giocatori voltano le spalle a Linux? L...
Instagram Plus arriva in Italia: cosa in...
XBOX: la nuova CEO non ha ancora le idee...
Intel non ha intenzione di abbandonare i...
La AI Mode sarà attiva di default...
Marvel's Wolverine non sarà un op...
Star Wars Zero Company esce ad agosto: n...
Bonus Decoder: fino al 70% di sconto con...
Virtua Fighter è tornato e non &e...
Il ritorno di Fumito Ueda, autore di Sha...
Cooler Master svela GPU Shield, la nuova...
Samsung Galaxy S27 Pro: sarà lui ...
Così Google ha ottimizzato Chrome...
Xiaomi non cambia idea: il display poste...
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: 14:56.


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