Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Google ha appena rinnovato la sua celebre serie A con il Pixel 10a, lo smartphone della serie più conveniente se consideriamo il rapporto tra costo e prestazioni. Con il chip Tensor G4, un design raffinato soprattutto sul retro e l'integrazione profonda di Gemini, il colosso di Mountain View promette un'esperienza premium a un prezzo accessibile. E il retro non ha nessuno scalino
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
Al MWC Qualcomm annuncia una coalizione industriale per lanciare il 6G entro il 2029 e introduce agenti IA per la gestione autonoma della RAN. Ericsson, presente sul palco, conferma la direzione: le reti del futuro saranno IA-native fin dalla progettazione
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air è un ultraleggero da 1 kg con Ryzen 5 6600H, display 14" 16:10 e 16 GB LPDDR5. Offre buona portabilità, autonomia discreta e costruzione in alluminio, ma storage PCIe 3.0 e RAM saldata limitano l'espandibilità. A 549 euro sfida brand più noti nella stessa fascia di mercato.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-04-2009, 14:32   #1
Davidino.gbr91
Member
 
L'Avatar di Davidino.gbr91
 
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
[c++]Eliminazione elementi doppi da lista ordinata

salve nn riesco a capire dove sbaglio....
ho bisogno di variare questa parte di programma in modo che la funzione mi cancelli gli elementi nel caso in cui ce ne siano 2 dello stesso nome:
Codice:
void eliminazione()
{
string nome;
persona *p;
persona *prec = NULL;
cout <<"inserire nome da cancellare: ";
cin >> nomec;
if ( pt == null)
{
cout <<"lista vuota!";
return;
}
for (p=pt;p!=NULL && p -> nome !=nomec)
{
prec = pi;
}
if (p==NULL)
{
cout <<"nome non trovato!";
return;
}
if (prec == NULL)
{
pt == p -> succ;
delete p;
}
else 
{
prec -> succ= p -> succ;
delete p;
}
}
Davidino.gbr91 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 15:53   #2
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Se la lista è ordinata in base al contenuto degli elementi è sufficiente confrontare un elemento col successivo e se sono uguali chiamare una funzione che elimina un elemento e ripristina la catena dei puntatori.

Codice:
struct elem {
 int cont;
 elem* next;
}

void elimina(elem*, elem*);

int main(void) {
elem* testa;
elem* temp;

[...] inizializzazioni varie

for(temp = testa; temp->next == NULL; temp = temp->next)
 if(temp->cont == temp->next->cont) elimina(testa, temp->next);

return 1;
}

void elimina(elem* t, elem* e) {
elem* temp;

for(temp = t; temp->next == NULL; temp = temp->next)
if(temp->next == e) {
 temp->next = temp->next->next;
 delete temp->next;
}
}
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 15:54   #3
Davidino.gbr91
Member
 
L'Avatar di Davidino.gbr91
 
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
si ma io vorrei modificare la funzione che ho postato nn me ne serve un'altra
io cerco di partire da quella
Davidino.gbr91 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 15:55   #4
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Leggi bene quella che ti ho postato io e incorpora quanto ci trovi di buono allora...
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 15:56   #5
Davidino.gbr91
Member
 
L'Avatar di Davidino.gbr91
 
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
era proprio quello il problema
Davidino.gbr91 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 16:06   #6
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579


Non ci trovi nulla di buono?

Purtroppo il codice da te postato ha parecchi errori di forma e concettuali, non saprei proprio come modificarlo in maniera ortodossa... Per imparare non c'è niente di meglio che guardare del buon codice, capirne i concetti e farli propri.

Una domanda, ma usi C o C++? Perchè se usi C++ è sconsigliato usare NULL per motivi di consistenza dei tipi.

Inoltre in una funzione void è meglio evitare l'uso di return vuote, è un purismo ma in grossi software complessi garantisce solidità.

es.
Codice:
if(a!=0) {
 ...
 return 1;
}
... qualcos'altro alternativo all'if
return 5;
andrebbe cambiato in:

Codice:
if(a!=0) {
...
} else {
... alternativo
}

return x;
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 16:19   #7
Davidino.gbr91
Member
 
L'Avatar di Davidino.gbr91
 
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
uso il dev c++!
Davidino.gbr91 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 16:22   #8
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da Davidino.gbr91 Guarda i messaggi
uso il dev c++!
Ok, quello è l'ambiente ma sviluppi con C o C++?

Per un semplice programma procedurale come la gestione di liste è meglio usare C. Se usi C puoi usare NULL ma devi usare printf e scanf per l'I/O che fanno parte delle librerie C standard.
Se usi C++ devi usare 0 al posto di NULL o un valore specifico che indica il valore neutro per il tipo, e devi usare cout e cin per leggere e scrivere stream dalle periferiche I/O attraverso le librerie standard C++.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 16:27   #9
Davidino.gbr91
Member
 
L'Avatar di Davidino.gbr91
 
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
ah te dici il linguaggio
no no è c++!
Davidino.gbr91 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 16:35   #10
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Allora evita l'uso di NULL, è ovvio che al livello di questo programma non cambia niente, ma è una pratica che prima si perde meglio è.
Soprattutto quando poi si sviluppano programmi con una tipizzazione più complessa.

uno può essere tentato di fare questo errore
es.
Codice:
string x;
int y;

x = NULL;
y = NULL;

if(x == y) ???
Codice:
string x;
int y;

x = "";
y = 0;

if(che ci scrivo?) non mi viene nemmeno
E evito pure eventuali problemi di cast e tipizzazione dinamica.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2009, 23:50   #11
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4907
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
Allora evita l'uso di NULL, è ovvio che al livello di questo programma non cambia niente, ma è una pratica che prima si perde meglio è.
Ma anche no... NULL se usato solo per i puntatori va benissimo, poi ovvio che se uno inizia a usarlo invece dello 0 è sbagliato.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 13:33   #12
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da ||ElChE||88 Guarda i messaggi
Ma anche no... NULL se usato solo per i puntatori va benissimo, poi ovvio che se uno inizia a usarlo invece dello 0 è sbagliato.
Sbaglio o stiamo dicendo la stessa cosa?
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 15:06   #13
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4907
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
Sbaglio o stiamo dicendo la stessa cosa?
Cosa c'è di sbagliato nell'uso di NULL nel primo post? E' usato con dei puntatori...
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 18:40   #14
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da ||ElChE||88 Guarda i messaggi
Cosa c'è di sbagliato nell'uso di NULL nel primo post? E' usato con dei puntatori...
In C va ancora bene ma in C++ il libro di Bjarne Stroustrup recita il fatto che NULL può essere usato su vari tipi (non sto parlando dei puntatori) e in fase di esecuzione (quindi in stato dinamico) se questo è passato ad una funzione e questa ne esegue il cast non sapendo il tipo di partenza possono succedere casini.

Per quanto riguarda i puntatori dedica un paragrafo apposta e un suggerimento alla fine del capitolo 5 del "C++, linguaggio, libreria standard, principi di programmazione":
"la costante zero è un int. Grazie alle conversioni standard, 0 può essere utilizzato come costante di qualsiasi tipo intero, di un tipo virgola mobile, di un tipo puntatore o di un tipo puntatore a membro. Il tipo della costante 0 viene determinato dal contesto (io aggiungerei: a differenza di NULL che è una macro del preprocessore e non ha intrinsecamente legato un tipo particolare in fase di esecuzione, mentre 0 si porta dietro il suo "contesto"). Lo zero viene rappresentato da una serie di bit nulli della misura appropriata.
Nessun oggetto viene allocato con l'indirizzo 0. Perciò 0 può essere usato anche come una costante puntatore, a indicare il fatto che il puntatore non si riferisce ad alcun oggetto (io aggiungo: ma a differenza di NULL ne viene determinato il tipo in fase di parsing, evitando errori subdoli). A causa del controllo stringente del C++ sui tipi, l'uso di zero puro può comportare meno problemi."

Ultima modifica di _Claudio : 21-04-2009 alle 19:43.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 19:45   #15
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
In C va ancora bene ma in C++ il libro di Bjarne Stroustrup recita il fatto che NULL può essere usato su vari tipi (non sto parlando dei puntatori) e in fase di esecuzione (quindi in stato dinamico) se questo è passato ad una funzione e questa ne esegue il cast non sapendo il tipo di partenza possono succedere casini.

Per quanto riguarda i puntatori dedica un paragrafo apposta e un suggerimento alla fine del capitolo 5 del "C++, linguaggio, libreria standard, principi di programmazione":
"la costante zero è un int. Grazie alle conversioni standard, 0 può essere utilizzato come costante di qualsiasi tipo intero, di un tipo virgola mobile, di un tipo puntatore o di un tipo puntatore a membro. Il tipo della costante 0 viene determinato dal contesto (io aggiungerei: a differenza di NULL che è una macro del preprocessore e non ha intrinsecamente legato un tipo particolare in fase di esecuzione, mentre 0 si porta dietro il suo contesto e certi cast sono vietati). Lo zero viene rappresentato da una serie di bit nulli della misura appropriata.
Nessun oggetto viene allocato con l'indirizzo 0. Perciò 0 può essere usato anche come una costante puntatore, a indicare il fatto che il puntatore non si riferisce ad alcun oggetto (io aggiungo: ma a differenza di NULL ne viene determinato il tipo in fase di parsing, evitando errori subdoli). A causa del controllo stringente del C++ sui tipi, l'uso di zero puro può comportare meno problemi."
Non sono ancora del tutto convinto che usare uno 0 sia una tecnica migliore... NULL è un ((void*)0), quindi non capisco cosa ci sia di male nell'usarlo con la testa. È sicuramente più chiaro che inizializzare tutte le variabili a 0 e poi non sapere più se era un intero o un puntatore, a metà del codice. La leggibilità viene prima di tutto, IMHO.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 20:22   #16
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Non sono ancora del tutto convinto che usare uno 0 sia una tecnica migliore... NULL è un ((void*)0), quindi non capisco cosa ci sia di male nell'usarlo con la testa. È sicuramente più chiaro che inizializzare tutte le variabili a 0 e poi non sapere più se era un intero o un puntatore, a metà del codice. La leggibilità viene prima di tutto, IMHO.
E cosa cambia dall'inizializzare tutto con 0 o con NULL come leggibilità?
La differenza fondamentale è che 0 non è una macro del preprocessore.
Inoltre cosa è NULL varia da macchina a macchina, normalmente equivale (coattivamente per standard) a 0 (o (void*)0)) ma non è detto.
Poi se si usa con la testa NULL allora tutto è possibile, anche la giustizia nel mondo
Poi se lo dice chi ha inventato il C++... nel caso ancora non vogliate credermi... fare un atto di fede come tributo non sarebbe male...
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 20:29   #17
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
E cosa cambia dall'inizializzare tutto con 0 o con NULL come leggibilità?
Che evidenzi subito il tipo, assegnando zero ad una variabile o confrontandola non puoi dire che tipo di "numero" sarebbe (int, float, puntatore, etc).
Quote:
Inoltre cosa è NULL varia da macchina a macchina
Hmm, questa me la devi spiegare, o è una macro del preprocessore o è legata ad un'architettura hardware.
Quote:
Poi se lo dice chi ha inventato il C++... nel caso ancora non vogliate credermi... fare un atto di fede come tributo non sarebbe male...
Che significa, anche Aristotele aveva detto che la terra è al centro dell'universo, e per 2000 anni tutti hanno fatto di sì con la testa perché "ipse dixit".
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 22:32   #18
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Che evidenzi subito il tipo, assegnando zero ad una variabile o confrontandola non puoi dire che tipo di "numero" sarebbe (int, float, puntatore, etc).
E assegnandogli NULL?

Quote:
Hmm, questa me la devi spiegare, o è una macro del preprocessore o è legata ad un'architettura hardware.
Il preprocessore fa parte del compilatore e il compilatore spesso è fatto ad hoc per l'hardware... o sbaglio? O per lo meno le librerie che definiscono l'ambiente cambiano e con esse il valore della macro #define NULL. Cioè posso sempre programmare usando gcc ma specifico che sto programmando codice per dispositivi embedded e uso librerie particolari.

Quote:
Che significa, anche Aristotele aveva detto che la terra è al centro dell'universo, e per 2000 anni tutti hanno fatto di sì con la testa perché "ipse dixit".
Sono due cose ben diverse, del moto dei pianeti all'epoca di Aristotele nulla si sapeva, il C++ è stato creato da Bjarne quindi suppongo che lui conosca ogni singolo dettaglio meglio di chiunque altro.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 02:04   #19
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
E assegnandogli NULL?
Espliciti che fai riferimento ad un puntatore.
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
Il preprocessore fa parte del compilatore e il compilatore spesso è fatto ad hoc per l'hardware... o sbaglio? O per lo meno le librerie che definiscono l'ambiente cambiano e con esse il valore della macro #define NULL. Cioè posso sempre programmare usando gcc ma specifico che sto programmando codice per dispositivi embedded e uso librerie particolari.
Come vuoi, ma il discorso non cambia... Ad esempio MSVC++ 8 definisce così il NULL:
Codice:
       /* Define NULL pointer value */
       #ifndef NULL
       #ifdef __cplusplus
       #define NULL    0
       #else
       #define NULL    ((void *)0)
       #endif
       #endif
Quindi semplicemente non vedo il problema pratico.
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
Sono due cose ben diverse, del moto dei pianeti all'epoca di Aristotele nulla si sapeva, il C++ è stato creato da Bjarne quindi suppongo che lui conosca ogni singolo dettaglio meglio di chiunque altro.
Era un esempio, non accetto che mi si venga detto di ricevere le cose per "atto di fede", neanche se fosse Bjarne in persona a dirmele.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 11:54   #20
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Espliciti che fai riferimento ad un puntatore.
A livello di scrittura del codice... ma se uno scrive codice sapientemente si ricorda che quella variabile è un puntatore.
E personalmente do maggior priorità alla correttezza del codice scritto rispetto la sua chiarezza... mi sembra sacrosanto.

Quote:
Come vuoi, ma il discorso non cambia... Ad esempio MSVC++ 8 definisce così il NULL:
Codice:
       /* Define NULL pointer value */
       #ifndef NULL
       #ifdef __cplusplus
       #define NULL    0
       #else
       #define NULL    ((void *)0)
       #endif
       #endif
Quindi semplicemente non vedo il problema pratico.
msvc è un compilatore potente per sistemi mediamente potenti (normalmente pc). Come ti ho già scritto altri compilatori hanno altre implementazioni, se faccio porting dando per scontato che NULL ha quel valore...

Quote:
Era un esempio, non accetto che mi si venga detto di ricevere le cose per "atto di fede", neanche se fosse Bjarne in persona a dirmele.

ciao
L'ho detto provocatoriamente... ovvio. Ma le motivazioni sono evidenti, al di là che lo dica Bjarne o meno.

Il problema è che se uso C++ personalmente cerco di essere il più aderente possibile al linguaggio e alla sua filosofia (che comprende il non usare il più possibile le direttive del preprocessore) e cerco di scrivere programmi il più corretti possibili mettendo in secondo piano la leggibilità. Poi è un mio punto di vista... spero sia condiviso... ma se non lo è amen, spero di non trovarmi mai a lavorare in futuro con del codice leggibilissimo ma che ha errori subdoli come quello riguardante il NULL su compilatori diversi.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso CHUWI CoreBook Air alla prova: design premium, b...
Roborock Saros 20: il robot preciso e molto sottile Roborock Saros 20: il robot preciso e molto sott...
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm ASUS ROG Kithara: quando HIFIMAN incontra il gam...
MacBook Neo: nessuna sorpresa nei primi ...
La serie POCO X8 Pro è pronta al ...
Smartphone: 2026 difficile per il mercat...
Star Wars: Knights of the Old Republic R...
Huang, NVIDIA: OpenClaw ha realizzato in...
Annunciano il recupero di 4,8 milioni di...
Oggi degli ottimi auricolari Sony con ca...
Muffa in casa? Questo deumidificatore da...
Sonos Era 100: il punto d'ingresso per u...
"Non stiamo sostituendo nessuno con...
Tutti i robot in offerta ora: prezzi bas...
Fra 3 giorni, a mezzanotte, Amazon attiv...
Il principale limite del MacBook Neo &eg...
899€ in tutti i colori, crolla il prezzo...
Sempre più pubblicità su Y...
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: 17:11.


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