Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Mentre Ubisoft vorrebbe chiedere agli utenti, all'occorrenza, di distruggere perfino le copie fisiche dei propri giochi, il movimento Stop Killing Games si sta battendo per preservare quella che l'Unione Europea ha già riconosciuto come una forma d'arte. Abbiamo avuto modo di parlare con Daniel Ondruska, portavoce dell'Iniziativa Europa volta a preservare la conservazione dei videogiochi
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Abbiamo provato il nuovo Galaxy S25 Edge, uno smartphone unico per il suo spessore di soli 5,8 mm e un peso super piuma. Parliamo di un device che ha pro e contro, ma sicuramente si differenzia dalla massa per la sua portabilità, ma non senza qualche compromesso. Ecco la nostra prova completa.
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
Pensato per il professionista sempre in movimento, HP Elitebook Ultra G1i 14 abbina una piattaforma Intel Core Ultra 7 ad una costruzione robusta, riuscendo a mantenere un peso contenuto e una facile trasportabilità. Ottime prestazioni per gli ambiti di produttività personale con un'autonomia lontano dalla presa di corrente che permette di lavorare per tutta la giornata
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-03-2010, 17:26   #1
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
[Visual C++] Errore nel linker

Ciao, ho questo pezzo di codice:
Codice:
std::string config;
std::wstring tmp;
getline(conf_file, config);
tmp=string_wstring(config);
MessageBoxW(NULL, tmp.c_str(), L"Testo", MB_OK);
e string_wstring() è così definita:
Codice:
std::wstring string_wstring(std::string input)
{
	std::wstring output(sizeof(input), L'');
	std::copy(input.begin(), input.end(), output.begin());
	return output;
}
Ottengo questo errore del linker:
Codice:
Programma.obj : error LNK2005: "class std::basic_string,class std::allocator > __cdecl string_wstring(class std::basic_string,class std::allocator >)" (?string_wstring@@YA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) già definito in stdafx.obj
Se tolgo c_str() sparisce l'errore, ma non ho trovato nessuna valida alternativa per poter levare questa funzione.
Da qualche parte avevo letto di forzare il linker a definire più volte la classe, ma vorrei trovare una soluzione migliore. Cosa posso fare?
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2010, 19:28   #2
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Hai dimenticato qualche #pragma once in testa ad un header?

Comunque per convertire da string a wstring dovresti usare mbstowcs
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2010, 19:58   #3
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Hai dimenticato qualche #pragma once in testa ad un header?
No, c'è ._.
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Comunque per convertire da string a wstring dovresti usare mbstowcs
What??? O_o
Come funziona?
Mi sono accorto ora che ho bisogno pure della conversione da wstring a string. Questo mbstowcs può sempre essere utile?
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2010, 22:34   #4
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da MrModd Guarda i messaggi
What??? O_o
Come funziona?

Mi sono accorto ora che ho bisogno pure della conversione da wstring a string. Questo mbstowcs può sempre essere utile?
Da wstring a string c'è wcstombs (wide char to multi byte string). wcstombs e mbstowcs sono funzioni standard C (esistono anche le equivalenti API di Windows che hanno qualche funzionalità in più).

Essendo funzioni C lavorano su array e si usano in 2 fasi, nella prima si richiede la dimensione che dovrà avere il buffer di uscita, e nella seconda viene eseguita la conversione:

Codice:
string original;
int requiredSize = mbstowcs(NULL, original.c_str(), 0);
char dest[requiredSize];
mbstowcs(dest, original.c_str(), requiredSize);
del tutto analogo il codice per wcstombs.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2010, 22:50   #5
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12815
Che orrore
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2010, 22:59   #6
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Da wstring a string c'è wcstombs (wide char to multi byte string). wcstombs e mbstowcs sono funzioni standard C (esistono anche le equivalenti API di Windows che hanno qualche funzionalità in più).

Essendo funzioni C lavorano su array e si usano in 2 fasi, nella prima si richiede la dimensione che dovrà avere il buffer di uscita, e nella seconda viene eseguita la conversione:

Codice:
string original;
int requiredSize = mbstowcs(NULL, original.c_str(), 0);
char dest[requiredSize];
mbstowcs(dest, original.c_str(), requiredSize);
del tutto analogo il codice per wcstombs.
Beh mi aspettavo qualcosa di più semplice, a questo punto tanto vale che mi tengo le mie funzioni, funzionano e non mi danno problemi.

Piuttosto quello che mi serve è una soluzione per il problema del linker. Idee?
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Che orrore
Te la potevi risparmiare...
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2010, 23:17   #7
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12815
Hai ragione perdonami ma un linguaggio che ha 400 tipi di dato mi fa quest'effetto , così come me lo fanno i messaggi del debugger, tipo questo:

error LNK2005: "class std::basic_string,class std::allocator > __cdecl string_wstring(class std::basic_string,class std::allocator >)" (?string_wstring@@YA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) già definito in stdafx.obj

Neanche fosse C offuscato. Cmq prometto solennemente di non interferire più. Chiedo scusa a tutti.

Ultima modifica di WarDuck : 02-03-2010 alle 23:27.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2010, 23:27   #8
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da MrModd Guarda i messaggi
Beh mi aspettavo qualcosa di più semplice, a questo punto tanto vale che mi tengo le mie funzioni, funzionano e non mi danno problemi.
Sei sicuro che funzionino? A me risulta che quella conversione sia errata.
Certo che se le usi per convertire solo caratteri ascii allora torna tutto.
Hai provato con stringhe veramente wide char?

Quote:
Piuttosto quello che mi serve è una soluzione per il problema del linker. Idee?
header precompilati?
Il fatto che la ritrovi duplicata in stdafx.obj mi fa sospettare di questa opzione.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 03-03-2010, 00:02   #9
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Sei sicuro che funzionino? A me risulta che quella conversione sia errata.
Certo che se le usi per convertire solo caratteri ascii allora torna tutto.
Hai provato con stringhe veramente wide char?



header precompilati?
Il fatto che la ritrovi duplicata in stdafx.obj mi fa sospettare di questa opzione.
Eh si, ho creato un progetto Win32 con Visual C++ già bello e pronto

Non mi servono stringhe wide char. Mi serve solo la conversione di testo semplice per poterlo poi passare a MessageBox.
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 03-03-2010, 07:45   #10
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da MrModd Guarda i messaggi
Eh si, ho creato un progetto Win32 con Visual C++ già bello e pronto

Non mi servono stringhe wide char. Mi serve solo la conversione di testo semplice per poterlo poi passare a MessageBox.
Allora vai sulle proprietà del progetto Configuration Properties->General->Character Set e impostalo su Not Set.

Altrimenti puoi usare solo wstring (wcout ecc...) e per le stringhe costanti dichiararle facendole precedere da L
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 12:56   #11
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
Non funziona ._.
Mi sa tanto che mi tengo i warning...
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003

Ultima modifica di MrModd : 04-03-2010 alle 13:15.
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 13:25   #12
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Codice:
string original;
int requiredSize = mbstowcs(NULL, original.c_str(), 0);
char dest[requiredSize];
mbstowcs(dest, original.c_str(), requiredSize);
Comunque questo codice non funziona. Non capisco perchè Visual C++ non accetta come dichiarazione della dimensione di un array una variabile O.o vuole per forza un numero
EDIT: Tra l'altro sempre VS mi dice che è sconsigliato l'uso di mbstowcs e raccomanda invece mbstowcs_s. Ma ho visto che cambiano i parametri della chiamata di funzione...
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003

Ultima modifica di MrModd : 04-03-2010 alle 13:28.
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 14:27   #13
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da MrModd Guarda i messaggi
Comunque questo codice non funziona. Non capisco perchè Visual C++ non accetta come dichiarazione della dimensione di un array una variabile O.o vuole per forza un numero
Si formalmente quello è C99 che non è supportato da VS.
Prova con vector:
Codice:
string original;
int requiredSize = mbstowcs(NULL, original.c_str(), 0);
vector<wchar_t>dest(requiredSize);
mbstowcs(&dest[0], original.c_str(), requiredSize);
wstring output(dest.begin(), dest.end());
Quote:
EDIT: Tra l'altro sempre VS mi dice che è sconsigliato l'uso di mbstowcs e raccomanda invece mbstowcs_s. Ma ho visto che cambiano i parametri della chiamata di funzione...
Si dovresti definire _CRT_SECURE_NO_WARNINGS, quasi tutte le funzioni C praticamente sono state marcate come non sicure per via di possibili buffer overflow e ne hanno fatto la versione "sicura" *_s
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 17:30   #14
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
Ah quindi dici che si possono ancora usare le funzioni "deprecated"?
Nel frattempo avevo usato un modo alternativo che usava la funzione raccomandata, ma c'era sempre quel problema della dichiarazione di array. Nel mio programma molto spesso ricevevo uno stack overflow per via della dimensione troppo piccola dell'array creato.
Questo è il codice:
Codice:
std::wstring string_wstring(std::string input)
{
	size_t origsize = strlen(input.c_str())+1;
    const size_t newsize = 10000;
    size_t convertedChars = 0;
    wchar_t output[newsize];
	mbstowcs_s(&convertedChars, output, origsize, input.c_str(), _TRUNCATE);
	return output;
}

std::string wstring_string(std::wstring input)
{
	const size_t newsize = 10000;
    size_t convertedChars = 0;
    char output[newsize];
	wcstombs_s(&convertedChars, output, origsize, input.c_str(), _TRUNCATE);
	return output;
}
_CRT_SECURE_NO_WARNINGS come si definisce? Semplicemente con un #define _CRT_SECURE_NO_WARNINGS?

EDIT: Non mi riconosce il comando vector...
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003

Ultima modifica di MrModd : 04-03-2010 alle 17:47.
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 19:00   #15
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da MrModd Guarda i messaggi
_CRT_SECURE_NO_WARNINGS come si definisce? Semplicemente con un #define _CRT_SECURE_NO_WARNINGS?
Si ma più comodamente lo puoi definire tra le proprietà del progetto, così viene definito globalmente per tutti i file del progetto.

Quote:
EDIT: Non mi riconosce il comando vector...
#include <vector>
e
using namespace std;
o
std::vector
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 05-03-2010, 11:51   #16
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924

Quanto mi mandano in bestia gli errori sui tipi di variabili!!!!!
Con vector non funziona perchè mbstowcs_s vuole un wchar_t* mentre vede in ingresso un std::vector<_Ty>.
Mi sa che mi tengo la soluzione del copy(), è la più semplice.
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 05-03-2010, 12:14   #17
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da MrModd Guarda i messaggi

Quanto mi mandano in bestia gli errori sui tipi di variabili!!!!!
Con vector non funziona perchè mbstowcs_s vuole un wchar_t* mentre vede in ingresso un std::vector<_Ty>.
Mi sa che mi tengo la soluzione del copy(), è la più semplice.
Come glielo hai passato il vector?
Devi passare l'indirizzo del primo elemento: &dest[0]
La soluzione copy è sbagliata. E comunque se non ti servono i caratteri unicode perchè non modifichi le impostazioni del progetto come ti avevo suggerito?
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 05-03-2010, 14:59   #18
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Come glielo hai passato il vector?
Devi passare l'indirizzo del primo elemento: &dest[0]
La soluzione copy è sbagliata. E comunque se non ti servono i caratteri unicode perchè non modifichi le impostazioni del progetto come ti avevo suggerito?
Perché ho altre funzioni che mi ritornano delle string quindi ad ogni modo qualche conversione c'è da fare. Ad esempio getline().

Questo è il codice che ho fin'ora:
Codice:
std::wstring string_wstring(std::string input)
{
	size_t origsize = strlen(input.c_str())+1;
    size_t convertedChars = 0;
	std::vector<wchar_t>output(origsize);
	mbstowcs_s(&convertedChars, &output[0], origsize, input.c_str(), _TRUNCATE);
	return output;
}
Questa è la risposta:
impossibile convertire il parametro 1 da 'std::vector<_Ty>' a 'std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it'
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003

Ultima modifica di MrModd : 05-03-2010 alle 15:02.
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 05-03-2010, 15:39   #19
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da MrModd Guarda i messaggi
Perché ho altre funzioni che mi ritornano delle string quindi ad ogni modo qualche conversione c'è da fare. Ad esempio getline().
Si ma se modifichi le impostazioni del progetto non ne hai bisogno.

Quote:
Questo è il codice che ho fin'ora:
Codice:
std::wstring string_wstring(std::string input)
{
	size_t origsize = strlen(input.c_str())+1;
    size_t convertedChars = 0;
	std::vector<wchar_t>output(origsize);
	mbstowcs_s(&convertedChars, &output[0], origsize, input.c_str(), _TRUNCATE);
	return output;
}
Questa è la risposta:
impossibile convertire il parametro 1 da 'std::vector<_Ty>' a 'std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it'
Scusa ma te stai facendo il return di un vector mentre il metodo dovrebbe ritornare una wstring.
Devi prima costruire la wstring a partire dal vector. L'esempio completo te l'avevo già postato prima.

E poi perchè mai stai usando le funzioni non standard di Microsoft?

Comunque ripeto se cambi le impostazioni di progetto non hai bisogno di questi metodi.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 05-03-2010, 16:00   #20
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Si ma se modifichi le impostazioni del progetto non ne hai bisogno.



Scusa ma te stai facendo il return di un vector mentre il metodo dovrebbe ritornare una wstring.
Devi prima costruire la wstring a partire dal vector. L'esempio completo te l'avevo già postato prima.

E poi perchè mai stai usando le funzioni non standard di Microsoft?

Comunque ripeto se cambi le impostazioni di progetto non hai bisogno di questi metodi.
Hai ragione, scusa, mi ero scordato di quella riga
Perché dici funzioni non standard? A dire il vero sto facendo di tutto per mantenermi il più possibile entro i limiti dello standard C++. Ho usato la libreria fstream.
EDIT: Aspetta, cosa intendi per modificare le impostazioni del progetto?

PS. Tra l'altro, non essendo abituato al Visual C++, non riesco a trovare dove poter definire quello che mi avevi detto nelle proprietà del progetto... Dove va messo???

EDIT2:
Ora è perfetta la conversione *_* Prima avevo problemi con alcuni caratteri tipo le lettere accentate, ora non più.
Ecco il codice:
Codice:
//Converte una variabile da string a wstring
std::wstring string_wstring(std::string input)
{
	size_t origsize = strlen(input.c_str())+1;
    size_t convertedChars = 0;
	std::vector<wchar_t>vec(origsize);
	mbstowcs_s(&convertedChars, &vec[0], origsize, input.c_str(), _TRUNCATE);
	std::wstring output(vec.begin(), (vec.end()-1));
	return output;
}

//Converte una variabile da wstring a string
std::string wstring_string(std::wstring input)
{
	size_t origsize = wcslen(input.c_str())+1;
	size_t convertedChars = 0;
	std::vector<char>vec(origsize);
	wcstombs_s(&convertedChars, &vec[0], origsize, input.c_str(), _TRUNCATE);
	std::string output(vec.begin(), (vec.end()-1));
	return output;
}
L'ultima riga l'ho dovuta modificare perché altrimenti mi ritornava una variabile che aveva alla fine un valore nullo e nelle uguaglianze con testo o altre variabili sbagliava.
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003

Ultima modifica di MrModd : 05-03-2010 alle 16:21.
MrModd è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Le 18 offerte Amazon del weekend, senza ...
Galaxy S25 Ultra 512GB sotto i 1.000€ su...
Vi piace l'iPhone nero? Su Amazon sono s...
MacBook Air M4 16GB/256GB e 16GB/512GB s...
4 portatili per risparmiare tanto ed ess...
San Marino multa TikTok: non controllano...
Dreame e Roborock in saldo su Amazon: ro...
Pazzesco su Amazon: crollano i prezzi de...
La Corea del Sud vorrebbe costruire una ...
Rilasciati i primi risultati delle anali...
Robot umanoidi low cost? Unitree ci prov...
Non solo Rocket Lab, anche Avio potrebbe...
Chips Act UE: 41,5 milioni di euro a Eph...
Ryzen Threadripper 9000 al debutto il 31...
Nuovi coupon nascosti Amazon (aggiorname...
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: 22:06.


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