Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 17:36 Der er 26 kommentarer

std:string til (const wchar_t *)

Jeg har et array af std::string, som jeg skal føde til en funktion der tager en parameter af typen (const wchar_t *)

En simpel typecast fungerer ikke lige... Nogen gode forslag?
Avatar billede arne_v Ekspert
21. juli 2009 - 17:50 #1
Avatar billede arne_v Ekspert
21. juli 2009 - 17:51 #2
dinstring.c_str() giver dig en char* som ovenstaaende saa kan konvertere til wchar_t*.
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 18:32 #3
Mjaeh, det virker ikke helt...

Dette er problemet i en nøddeskal:

LPCWSTR    myStr = MultiCharToUniChar("fil.jpg");
const wchar_t *file = (const wchar_t *)myStr;
const wchar_t *otherFile = (const wchar_t *)("fil.jpg");

indhold af variablen file: "fil.jpg"
indhold af variablen otherfile: "####g"

men det er inholdet af otherfile variablen der virker mens det andet er noget snot ifølge den funktion der skal bruge variablene...

Så hvordan oversætter jeg lige det?
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 18:36 #4
Til ovenstående skal lige tilføjes at funktionen MultiCharToUniChar ser således ud:

LPCWSTR MultiCharToUniChar(char* mbString)
{
    int len = strlen(mbString) + 1;
    wchar_t *ucString = new wchar_t[len];
    mbstowcs(ucString, mbString, len);
    return (LPCWSTR)ucString;
}
Avatar billede arne_v Ekspert
21. juli 2009 - 18:44 #5
Og hvordan checker du indholdet af de variable ?

Er du sikker paa at du skal bruge en wchar_t* ?

Hvis du skal bruge en konstant wchar_t* kan du bare bruge:

L"fil.jpg"
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 18:54 #6
Det er i debuggeren det ser sådan ud. Der er en adresse, og indholdet af adressen præsenterer debuggeren som de ovenstående variable.
Det er som om at strengen skal formatteres anderledes...

Jeg kommer ikke udenom at skulle bruge const wchar_t *... Signaturen på metoden der skal bruge den ser således ud:

ILAPI ILboolean ILAPIENTRY ilLoadImage(ILconst_string FileName);

og det står desværre ikke til at ændre.

L foran giver samme resultat. Det er læseligt for mig i debuggeren, men åbenbart ulæseligt for den metode jeg anvender.
Avatar billede arne_v Ekspert
21. juli 2009 - 18:59 #7
Og ILconst_string er wchar_t fordi ?
Avatar billede arne_v Ekspert
21. juli 2009 - 19:00 #8
http://sfii90.rubyforge.org/svn/src/graphics/image/devil/il.h

siger

#ifdef _UNICODE
    #ifndef _WIN32_WCE
        #include <wchar.h>
    #endif
    //if we use a define instead of a typedef,
    //ILconst_string works as intended
    #define ILstring wchar_t*
    #define ILconst_string  wchar_t const *
#else
    //if we use a define instead of a typedef,
    //ILconst_string works as intended
    #define ILstring char*
    #define ILconst_string char const *
#endif //_UNICODE

d.v.s. at den er char* eller wchar_t* afhaengig af om UNICODE er defineret eller ej.
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 19:07 #9
Shiny :)

Det er så endnu et område jeg er blank på.

Skal jeg så skrive
#define _UNICODE false

i mine deklarationer i min klasse, eller hvor retter jeg det?
Avatar billede arne_v Ekspert
21. juli 2009 - 19:15 #10
Du kan goere et af foelgende:

* kalde funktionen med en char*

* kalde funktionen med en wchar_t* lavet saa den ser OK ud i debugger og saa i toppen af dit program have:

#define UNICODE
#define _UNICODE
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 20:21 #11
Kan jeg ikke liiige få til at virke....

hvis jeg kalder funktionen med en char* brokker compileren sig over at den ikke kan konvertere char* til en const wchar_t *

Jeg har det skidt med at tage så meget af din tid på noget så banalt. Du må hellere snart smide et svar :)
Avatar billede arne_v Ekspert
21. juli 2009 - 20:25 #12
Formaalet med E er jo at hjaelpe, saa det skal du ikke have daarlig samvitighed over.

Hvad sker der hvis du putter:

#define UNICODE
#define _UNICODE

aller oeverst i dit program og kalder med wchar_t ?
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 20:31 #13
Troede det var wchar_t jeg skulle undgå?
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 20:34 #14
der er iøvrigt ingen ændring. compileren brokker sig stadig over at jeg prøver at smide en char* ind fremfor en const wchar_t *
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 20:38 #15
Men den kommer med følgende Warnings:
Warning    1    warning C4005: 'UNICODE' : macro redefinition   
Warning    2    warning C4005: '_UNICODE' : macro redefinition
Avatar billede arne_v Ekspert
21. juli 2009 - 20:53 #16
Med de 2 defines og saa sender du en wchar_t* over ikke en char*.
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 21:01 #17
ok, men den vil stadig gerne have en const wchar_t* og ikke den wchar_t* jeg sender ind :(

Jeg får ikke lov til at compile med wchar_t*
Avatar billede arne_v Ekspert
21. juli 2009 - 21:11 #18
Du kan caste den med:

(const wchar_t *)whatever
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 21:11 #19
error C2664: 'ilLoadImage' : cannot convert parameter 1 from 'wchar_t' to 'const wchar_t *'
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 21:17 #20
Ok, nu fik jeg det til at du efter dine foreskrifter, men problemet er det samme som tidligere, at det virker kun hvis jeg hardcoder en tekststreng ind i metoden men ikke når jeg konverterer til en wchar_t *

:(
Avatar billede oddi Nybegynder
21. juli 2009 - 21:41 #21
Et skud:

std::wstring widestr = std::wstring(str.begin(), str.end());
wchar_t* widecstr = widestr.c_str();
Avatar billede kneppepoliti Nybegynder
21. juli 2009 - 21:45 #22
oddi: Desværre, det giver stadig samme problem som i indlæg #3 :(
Avatar billede kneppepoliti Nybegynder
22. juli 2009 - 08:51 #23
Igen problemet kan ses i nedenstående billede:
http://img268.imageshack.us/img268/4664/variabelproblemer.jpg

Inholdet af otherfile variablen er det der får det til at spille, selvom den er totalt uforståelig, det lader til at den har smækket hver to karakterer sammen til en, så hver andet char er bit-forskudt ind i den forrige.

Dette er en copy/paste fra mit watch:
+        otherFile    0x0044ca44 "&#28265;&#25959;&#27182;&#26480;"    const wchar_t *
+        file    0x00ca8618 "inge.jpg"    wchar_t *


Nogen der kender en funktion, der kan pakke karaktererne korrekt ind?
Avatar billede kneppepoliti Nybegynder
29. juli 2009 - 12:48 #24
Arne_v, jeg har fundet ud af det med hjælp fra de kommentarer du har skrevet. Vil du have point?
Avatar billede arne_v Ekspert
29. juli 2009 - 12:57 #25
OK
Avatar billede arne_v Ekspert
22. august 2009 - 17:11 #26
Så mangler du bare at acceptere svaret.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester