Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS ProArt GoPro Edition è il notebook compatto per chi crea
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
Un notebook sviluppato in collaborazione con GoPro ma che risponde al meglio alle necessità di tutti coloro che creano contenuti video: robustezza, design, potenza di calcolo e funzionalità si abbinano al meglio tra di loro, pur se a prezzo di un costo elevato per via della tanta memoria onboard
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090
Ho affidato ai due modelli lo stesso mestiere ma non lo stesso identico prompt: trasformare una storia illustrata in un video usando una RTX 3090 e modelli locali. Ne sono usciti due film, due applicazioni e due idee opposte di efficienza. Fucina, progettata con Fable 5, colpisce di più nei primi secondi. Storyboard Studio, costruito con ChatGPT/Codex, regge meglio sulla distanza e vince il confronto complessivo, ma di stretta misura
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile
Lenovo ha lanciato il ThinkTab X11 rimettendo piede nel segmento dei tablet Android con il marchio Think dopo oltre un decennio di assenza. Il risultato è un dispositivo che prende una direzione precisa: massima dotazione funzionale, costruzione resistente, autonomia fuori dagli schemi
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


ASUS ProArt GoPro Edition è il notebook compatto per chi crea ASUS ProArt GoPro Edition è il notebook c...
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090 Fable e Sol a confronto: due cartoni animati cre...
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot AMD Advancing AI 2026: l'hardware AMD per le ela...
Tascabile e con Android: BOOX Go 6 Gen II è diverso da tutti gli altri e-reader Tascabile e con Android: BOOX Go 6 Gen II &egrav...
WINDTRE, le offerte di fine luglio: 5G F...
Due scrivanie angolari gaming a prezzi b...
Telecamere e intelligenza artificiale su...
L'ASUS Zenbook di cui tutti parlano torn...
Helios, la piattaforma di Schneider Elec...
Multiverse Computing raccoglie 500 milio...
Videogiochi, social e azzardo: un giovan...
Tre astronauti rientrano dalla ISS: la S...
Kimi K3 ha trovato 19 zero-day in Redis ...
Aggiungere un acceleratore IA per data c...
Debian valuta lo stop totale ai contribu...
Huawei sfida il ban USA: al via la produ...
QNAP lancia i nuovi NAS TS-262A e TS-462...
E4 Computer Engineering e EuroHPC JU uni...
World di Sam Altman raccoglie 52,5 milio...
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: 20:54.


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