Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini è uno smartwatch compatto capace di offrire un'esperienza completa di monitoraggio della salute e fitness con una cassa da 43 mm che può adattarsi a qualsiasi tipo di polso, dal più grande al - soprattutto - più piccolo. Con l'architettura dual-chip e un'autonomia che può coprire due giorni con tranquillità, rappresenta la soluzione ideale per chi cerca prestazioni premium in un formato ridotto.
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Dopo il recente lancio della serie Xiaomi 15T di Monaco, vi parliamo oggi della versione più performante della nuova famiglia, ovvero Xiaomi 15 T Pro. Vi raccontiamo la nostra prova nel dettaglio, spiegando perché a questo prezzo e in questa fascia, questo smartphone ha davvero senso tenerlo in seria considerazione.
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento
Acer ha ampliato la sua offerta professionale con il TravelMate P6 14 AI, un notebook ultraleggero e robusto pensato per chi lavora in mobilità. Certificato Copilot+ PC, combina design premium, autonomia elevata e piattaforma Intel Core Ultra Serie 2 con funzionalità AI, garantendo sicurezza, affidabilità e produttività per l'utenza business moderna.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-04-2009, 13: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, 14: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, 14: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, 14: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, 14: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, 15: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, 15: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, 15: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, 15: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, 15: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, 22: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, 12: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, 14: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, 17: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 18:43.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 18: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, 19: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, 19: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, 21: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, 01: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, 10: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


OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla OPPO Watch X2 Mini, lo smartwatch compatto a cui...
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione Xiaomi 15T Pro, è lui il nuovo best buy? ...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Ecco il meglio del Prime Day Amazon: tut...
Sony WH-1000XM5 e altre cuffie a un prez...
Prime Day Amazon: super sconti su robot ...
Scope elettriche al minimo storico su Am...
Festa delle Offerte Prime - TV a prezzi ...
Prime Day da urlo per gli smartphone: re...
Tutte le offerte sui Samsung Galaxy S25 ...
Prime Day Amazon: Apple Watch ai minimi ...
Tutte le offerte Apple per il Prime Day:...
Gli 8 portatili più scontati del ...
Prime Day Amazon: portatili gaming al mi...
Prime Day Amazon: -20% extra su migliaia...
Scarpe che vi faranno correre alla veloc...
MOVA Z60 Ultra Roller Complete: 200€ di ...
Xiaomi SU7 si sposta da sola? Non esatta...
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: 03:25.


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