Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Abbiamo provato Motorola razr fold, il pieghevole a libro con display interno LTPO da 8,09 pollici, Snapdragon 8 Gen 5 e batteria da 6000 mAh in 243 grammi. Pennino e custodia sopno già nella confezione, per un foldable che si caratterizza per il pannello luminoso, l'autonomia ottima per la categoria e le fotocamere coerenti e ben sfruttabili. Il listino è di 1999 euro, ma in vendita si trova già a molto meno
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente
Google Pixel Watch 5 ha affinato una formula già convincente con hardware più veloce, Gemini offline e nuovi strumenti per sport e benessere. Abbiamo provato la versione LTE da 41 mm, comoda anche di notte e ben proporzionata sui polsi piccoli. Il design resta un punto di forza, ma l'autonomia premia ancora il 45 mm e alcune funzioni AI non sono disponibili in Italia: ecco che cosa cambia rispetto a Watch 4 e quale formato conviene scegliere oggi
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Politica, accademia e industria a confronto su mercato unico, sicurezza e competitività. Nei laboratori di Vimercate, Nokia ha mostrato le nuove generazioni di chip ottici e i test che ogni prodotto deve superare prima di arrivare sul mercato
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


NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica NVIDIA RTX Spark: il PC Windows on ARM costruito...
Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi In sella alla Fiido Nomads Pro: e-bike con motor...
816 CV e 0-300 km/h in 16 secondi: Peuge...
Il Politecnico di Milano ha registrato u...
Samsung lavora al Privacy Display v2: sa...
SBS presenta i nuovi accessori Track Fir...
Castlevania: Belmont's Curse, la caccia ...
Nuova promozione Amazon Haul: 5% di scon...
Netflix taglia circa mille posti di lavo...
Bodywel F20PRO a 759€: e-bike pieghevole...
iPhone Duo, senza AppleCare+ riparare lo...
Amazon, offerte da non perdere oggi: Mac...
1.500 km con una ricarica: CATL e Changa...
Rockstar Games punta a ridurre i tempi d...
Accessori auto su Amazon da 22€: aspirab...
Oltre 436 km senza ricaricare: questa mo...
Samsung Health si aggiorna: il coaching ...
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: 13:10.


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