Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
AMD ha aggiornato l'offerta di CPU HEDT con i Ryzen Threadripper 9000 basati su architettura Zen 5. In questo articolo vediamo come si comportano i modelli con 64 e 32 core 9980X e 9970X. Venduti allo stesso prezzo dei predecessori e compatibili con il medesimo socket, le nuove proposte si candidano a essere ottimi compagni per chi è in cerca di potenza dei calcolo e tante linee PCI Express per workstation grafiche e destinate all'AI.
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale
Forte di soluzioni tecniche specifiche, il notebook Acer TravelMate P4 14 abbina dimensioni compatte e buona robustezza per rispondere alle necessità specifiche degli utenti aziendali. La piattaforma AMD Ryzen 7 Pro assicura prestazioni elevate con i tipici ambiti di produttività personale e sul lavoro, mantenendo un'elevata autonomia.
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Dal salotto al giardino, il nuovo proiettore laser di Hisense promette esperienze cinematografiche in qualsiasi contesto: qualità d’immagine, semplicità d’uso, versatilità e prezzo competitivo il suo poker d'assi
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: 12816
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: 12816
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


Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il c...
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Xbox: dal prossimo mese verifica dell'id...
Corsair AI Workstation 300: poco pi&ugra...
Addio a Elio Marioli, un pioniere della ...
L'IA sta già diminuendo il potere...
Guida autonoma? Gli ADAS falliscono e in...
Skechers lancia le scarpe per bambini co...
Revolut e Audi F1: un’alleanza rivoluzio...
Gestione attività di Windows 11 d...
Amazon lancia il nuovo videocitofono Bli...
Robot aspirapolvere al top: i nuovi DEEB...
Opera vs Microsoft: la guerra dei browse...
Router e ripetitori FRITZ! in offerta su...
Spotify vola a quota 700 milioni di uten...
Microsoft pronta ad abbandonare il launc...
Windows 11, arriva una feature multimoni...
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: 04:32.


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