Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
Analizziamo nel dettaglio DJI RS 5, l'ultimo arrivato della famiglia Ronin progettato per videomaker solisti e piccoli studi. Tra tracciamento intelligente migliorato e ricarica ultra rapida, scopriamo come questo gimbal eleva la qualità delle produzioni.
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D è la nuova CPU gaming di riferimento grazie alla 3D V-Cache di seconda generazione e frequenze fino a 5,6 GHz. Nei test offre prestazioni superiori a 9800X3D e 7800X3D, confermando la leadership AMD nel gaming su PC.
Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-04-2009, 16: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 17:20.
uaoke_88 è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2009, 16: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, 17: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, 17: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, 17: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, 17: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, 17: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 18:03.
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 30-04-2009, 17: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, 17: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, 19: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 RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
Realme 16: il nuovo mid-range che si isp...
DAZN lancia il piano Full Mobile a 19,99...
Samsung Galaxy S26, ormai è tutto...
Smartphone sempre più cari: super...
L'ultima puntata di Falsissimo rimossa d...
NASA Perseverance ha utilizzato percorsi...
Blue Origin sospende per almeno due anni...
Stampanti, Los Angeles verso il divieto ...
Roscosmos Amur: il razzo spaziale riutil...
Robot aspirapolvere per tutte le tasche:...
Accedere alle mail di un lavoratore lice...
Amazon Haul scatenato: migliaia di prodo...
Amazon Seconda Mano rilancia: sconto ext...
Super prezzo Amazon per ECOVACS DEEBOT T...
NVIDIA Shield TV: dieci anni di aggiorna...
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: 16:38.


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