Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI ha appena ufficializzato la serie Lito, la sua nuova gamma di droni entry-level destinata a chi si avvicina per la prima volta alla fotografia aerea. Al centro dell'annuncio ci sono due modelli ben distinti per fascia di prezzo e specifiche tecniche: DJI Lito 1 e DJI Lito X1. Entrambi si collocano sotto la soglia regolamentare dei 249 grammi, che permette di volare con requisiti burocratici più semplici rispetto ai droni più pesanti.
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi
Siamo stati a Londra per la premiazione dei Sony World Photography Awards 2026, l'evento a tema fotografia più prestigioso. Fra sorprese e novità, ne approfittiamo per fare il punto sulla fotografia contemporanea, in cui la didascalia è sempre più necessaria a cogliere il senso della quasi totalità degli scatti.
Una settimana con Hyundai Ioniq 5 N-Line: diverte e convince
Una settimana con Hyundai Ioniq 5 N-Line: diverte e convince
L'elettrica di casa Hyundai propone una versione AWD con estetica derivata dalla famiglia N. L'abbiamo provata per diversi giorni, per scoprire tutti i dettagli e la vera autonomia in autostrada
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-04-2009, 15:24   #1
uaoke_88
Junior Member
 
Iscritto dal: Apr 2009
Messaggi: 18
[c++] problema stringhe in programma classi

salve a tutti mi sono appena registrato al forum e voglio subito sottoporvi il problema che mi ha fatto perdere mezza mattinata...
O creato questo semplice programma che implementa la classe libro, ma durante l'esecuzione dopo aver acquisito i primi due campi stringa si interrompe.
penso sia un problema relativo alle stringhe stesse anche perchè hop provato a farlo partire inserendo solo le variabili int e float e non dava alcun problema...vi posto di seguito i tre file su cui si sviluppa...

//libro.h
#ifndef _Libro_
#define _Libro_
#include <cstdlib>
#include <iostream>
#include <string>

class libro
{
private:
char * titolo;
int numpagine;
float prezzo;
char * genere;
char * autori;

public:
libro();
int get_numpagine() {return numpagine;}
float get_prezzo() {return prezzo;}
char* get_titolo(){return titolo;}
char* get_genere() {return genere;}
char* get_autori() {return autori;}
void set_titolo(char* nome) {titolo=new char[strlen(nome)+1];
strcpy(titolo,nome);}
void set_autori(char* nome) {genere=new char[strlen(nome)+1];
strcpy(autori,nome);}
void set_genere(char* nome) {autori=new char[strlen(nome)+1];
strcpy(genere,nome);}
void set_numpagine(int num) {numpagine=num;}
void set_prezzo(float valore) {prezzo=valore;}
void stampa_scheda(libro l);
libro scrivi_scheda();
~libro() {delete[] titolo;delete[] genere;delete[] autori;}
};
#endif
----------------------------------------------------------------------------------------------------------------------------
//libro.cpp
#include "libro.h"
using namespace std;

libro::libro()
{
numpagine=0;
prezzo=0;
}

libro libro:: scrivi_scheda()
{
libro l;
float valore;
int num;
char* nome=new char[50];
cout<<"Inserimento dati libro \n";
cout<<"Inserisci titolo: ";

cin.getline(nome,50);

l.set_titolo(nome);
cout<<"\nInserisci autore: ";

cin.getline(nome,50);

l.set_autori(nome);
cout<<"\nInserisci il genere: ";

cin.getline(nome,50);

l.set_genere(nome);
cout<<"\nInserisci il numero di pagine: ";
cin>>num;
l.set_numpagine(num);
cout<<"\nInserisci il prezzo: ";
cin>>valore;
l.set_prezzo(valore);
delete [] nome;
return l;

}

void libro:: stampa_scheda(libro l)
{
cout<<"\n Titolo: "<<l.get_titolo();
cout<<"\n Autore: "<<l.get_autori();
cout<<"\n Genere: "<<l.get_genere();
cout<<"\n Numero pagine: "<<l.get_numpagine();
cout<<"\n Prezzo: "<<l.get_prezzo()<<"\n ";
}
----------------------------------------------------------------------------------------------------------------------------
//main.cpp
#include "libro.h"
using namespace std;

int main(int argc, char *argv[])
{
libro opera;
float np; //nuovo prezzo

opera=opera.scrivi_scheda();

system("PAUSE");

opera.stampa_scheda(opera);

cout<<"Modifica prezzo \n";
cout<<"Vecchio prezzo: "<<opera.get_prezzo()<<" \n";
cout<<"Nuovo prezzo: ";
cin>>np;
opera.set_prezzo(np);

system("PAUSE");
return EXIT_SUCCESS;
}

ringrazio anticipatamente tutti coloro che si prodigheranno nel darmi una mano...

Ultima modifica di uaoke_88 : 30-04-2009 alle 16:20.
uaoke_88 è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2009, 15:43   #2
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Ho dato solo una rapida occhiata.... ma qui:

char* nome;
cout<<"Inserimento dati libro \n";
cout<<"Inserisci titolo: ";

cin.getline(nome,50);



manca l'allocazione di *nome... prima di acquisire la stringa.

P.S.
Ma perche' non usi la classe "string" ... visto che hai anche inserito l'include?

BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2009, 16:10   #3
uaoke_88
Junior Member
 
Iscritto dal: Apr 2009
Messaggi: 18
ho messo anche l'allocazione dinamica di nome, ma continua a fare lo stesso problema.
mi dici quali funzioni usare con la classe string per acquisire la stringa,purtroppo sulle slide del professore ho trovato solo quest'alternativa...
inoltre avevo anche un'altro dubbio...dovendo usare sempre lo stesso puntatore(nome) per copiare titolo,autore e genere non dovrei anche pulire il buffer dopo ogni inserimento?? grazie...
uaoke_88 è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2009, 16:18   #4
wizard1993
Senior Member
 
L'Avatar di wizard1993
 
Iscritto dal: Apr 2006
Messaggi: 22462
Codice:
string str;
cin>>str;
cout<<str;
string ha inoltre l'overload per molti operatori e tante funzioni interessanti
http://www.cplusplus.com/reference/string/string/
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza
wizard1993 è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2009, 16:25   #5
uaoke_88
Junior Member
 
Iscritto dal: Apr 2009
Messaggi: 18
purtroppo il testo dell'esercizio diceva esplicitamente di usare dei puntatori a char...comunque,non vorrei farti perdere tempo...però perchè non copi i tre file nel dev??? tanto il programma compila...si blocca dopo l'acquisizione della seconda stringa...infatti ho provato ad acquisire solo le variabili int e float...e una sola stringa con le altre due variabili, e funziona perfettamente fino alla fine...appena provo a inserire '2' stringhe si blocca...cosa può essere??
uaoke_88 è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2009, 16:44   #6
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Nessun problema a usare i char*, soprattutto se hai dei vincoli dettati da un esercizio.

Lo dicevo solo perche' notavo una serie di allocazioni, ma nessuna deallocazione...

Con l'allocazione dinamica, cio' che allochi devi preoccuparti anche a deallocarla...

Cosi' nel'esempio in questione... immagino avrai fatto:

char* nome = new char[50+1];
cout<<"Inserimento dati libro \n";
cout<<"Inserisci titolo: ";

cin.getline(nome,50);


dovrai necessariamente, prima del return scrivere:

delete nome;
return l;



Ma anche le allocazioni fatte con le funzioni:
void set_titolo(char* nome) {titolo=new char[strlen(nome)+1];
strcpy(titolo,nome);}
void set_autori(char* nome) {genere=new char[strlen(nome)+1];
strcpy(autori,nome);}
void set_genere(char* nome) {autori=new char[strlen(nome)+1];
strcpy(genere,nome);}


dovrebbero essere gestite da un distruttore di opera.

ancora...

nome puo' essere riutilizzato con piu' di una "getline"... visto che fai la copia del contenuto... e alla successiva getline il contenuto viene sovrascritto.
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2009, 16:57   #7
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Edit

Ultima modifica di BrutPitt : 29-04-2009 alle 17:03.
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 30-04-2009, 16:15   #8
uaoke_88
Junior Member
 
Iscritto dal: Apr 2009
Messaggi: 18
corretto il problema dell'allocazione...ora però dopo aver inserito le stringhe visualizza dei caratteri strani al posto di titolo,autori e genere...non riesco proprio a capire...

ps: inserisco nel mio post le correzioni fatte al programma...
uaoke_88 è offline   Rispondi citando il messaggio o parte di esso
Old 30-04-2009, 16:29   #9
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da uaoke_88 Guarda i messaggi
corretto il problema dell'allocazione...ora però dopo aver inserito le stringhe visualizza dei caratteri strani al posto di titolo,autori e genere...non riesco proprio a capire...

ps: inserisco nel mio post le correzioni fatte al programma...
Provare il debugger?
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 30-04-2009, 18:08   #10
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Se allochi correttamente la memoria in:

void set_autori(char* nome) {genere=new char[strlen(nome)+1];
strcpy(autori,nome);}
void set_genere(char* nome) {autori=new char[strlen(nome)+1];
strcpy(genere,nome);}


In autori allochi genere... e in genere allochi autori.
Ma se avessi usato il debugger, come ha scritto tommino te ne saresti accorto, da solo, tre giorni fa.



Non usare una dichiarazione del genere...

libro libro::scrivi_scheda()
{
libro l;
...
...
return l; //viene chiamato il distruttore di l
}


Su return viene chiamato il distruttore di l... e deallocata la memoria.

scrivi_scheda() e' gia' membro di libro... per cui puoi accedere direttamente ai membri per mofdificarli... per cui, in questo contetso, puo' andar bene un:

void libro::scrivi_scheda()


In alternativa, se ti serve avere una "copia" di libro... la puoi passare via referenza dichiarando la funzione:

void libro::scrivi_scheda(libro &l)

oppure operi un'allocazione dinamica, tipo:

libro* libro::scrivi_scheda()
{
libro *l = new libro;
...
...
return l; //qui il distruttore non viene chiamato, visto che e' allocato dinamicamente... verra' chiamato sul "delete"
}


ma ti devi preoccupare di chiamare delete sull'oggetto restituito da scrivi_scheda().
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla DJI Lito 1 e Lito X1 recensione: i nuovi droni p...
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi Sony World Photography Awards 2026: i premiati, ...
Una settimana con Hyundai Ioniq 5 N-Line: diverte e convince Una settimana con Hyundai Ioniq 5 N-Line: divert...
Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo Recensione OPPO Find X9 Ultra: è lui il c...
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Xbox Game Pass sarà disponibile a...
La serie HONOR 600 avrà presto un...
Mova Viax 250 in prova: il robot tagliae...
Fat e-bike per tutti: sconti Engwe, pi&u...
Google conferma l'arrivo della nuova ver...
Apple ha trovato il modo per abbassare i...
OpenAI vuole tassare l'AI per dare a tut...
MacBook Air 15'' con chip M4 a 1.199€ su...
Samsung Galaxy S25 Edge 12/512GB a 854€ ...
Super offerta sul portatile gaming Acer ...
Nanotubi di carbonio più conduttivi del ...
LG OLED evo C5 48'' a 614€ e G5 83' a 3....
Ricavi record per Samsung ma la division...
TOP 7 Amazon del weekend: gli sconti al ...
Volvo e Design Week: al Volvo Studio di ...
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: 02:23.


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