/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Konvertere std::string til (byte*, DWORD)
Fra : Khuong Dinh Pham


Dato : 20-08-05 18:03

Hej

Jeg har indholdet af et billede i form af en std::string variable.
Hvordan kan jeg få et CxImage objekt udfra den type.

Parameterne til CxImage er følgende:

CxImage(byte* data, DWORD size)


På forhånd tak.

 
 
Bertel Brander (20-08-2005)
Kommentar
Fra : Bertel Brander


Dato : 20-08-05 19:08

Khuong Dinh Pham wrote:
> Hej
>
> Jeg har indholdet af et billede i form af en std::string variable.
> Hvordan kan jeg få et CxImage objekt udfra den type.
>
> Parameterne til CxImage er følgende:
>
> CxImage(byte* data, DWORD size)

Måske:
std::string Image = Whatever();
CxImage((byte *)Image.data(), Image.size());

Som sædvanligt er et cast tegn på potentielle problemer,
men hvis du er sikke på at CxImage ikke ændrer på
data skulle der ikke kunne være de store problemer

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Ivan Johansen (20-08-2005)
Kommentar
Fra : Ivan Johansen


Dato : 20-08-05 22:59

Bertel Brander wrote:
> Måske:
> std::string Image = Whatever();
> CxImage((byte *)Image.data(), Image.size());
>
> Som sædvanligt er et cast tegn på potentielle problemer,
> men hvis du er sikke på at CxImage ikke ændrer på
> data skulle der ikke kunne være de store problemer

Et C-style cast er specielt farligt her hvor det rent faktisk gør to
ting. Hvis CxImage rent faktisk ikke ændrer på data ville jeg skrive det
sådan for at synliggøre at der rent faktisk er to casts:
CxImage(const_cast<byte*>(reinterpret_cast<const byte*>(Image.data())),
Image.size());

Men da CxImage sandsynligvis ændrer på data (ellers ville data være af
typen const byte*) ville jeg skrive sådan:
std::string Image = Whatever();
std::vector<byte> Data(Image.begin(), Image.end());
CxImage(&Data[0], Data.size());


Ivan Johansen

Bertel Brander (21-08-2005)
Kommentar
Fra : Bertel Brander


Dato : 21-08-05 01:34

Ivan Johansen wrote:
> Men da CxImage sandsynligvis ændrer på data (ellers ville data være af
> typen const byte*) ville jeg skrive sådan:
> std::string Image = Whatever();
> std::vector<byte> Data(Image.begin(), Image.end());
> CxImage(&Data[0], Data.size());

Nu ved vi (i.e. jeg) jo ikke om CxImage ændrer data
(det kunne også være at den der har lavet CxImage aldrig
har hørt om const), og vi ved heller ikke om det er meningen
at den skal ændre på data.
Hvis den skal ændre på data er det nok ikke nogen god idé at
lave et kopi.
Jeg har lidt svært ved at se hvorfor det er mere sikkert
at give den adressen på data i en vector end adressen på
data i en string.
Man kunne bruge &Image[0], der sjovt nok giver en char *
og ikke Image.data() der af (for mig) ukendte årsager
giver en const char *

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Ivan Johansen (21-08-2005)
Kommentar
Fra : Ivan Johansen


Dato : 21-08-05 10:08

Bertel Brander wrote:
> Nu ved vi (i.e. jeg) jo ikke om CxImage ændrer data
> (det kunne også være at den der har lavet CxImage aldrig
> har hørt om const), og vi ved heller ikke om det er meningen
> at den skal ændre på data.

Nej, det er meget svært at vide, men som udgangspunkt antager jeg at at
hvis der ikke står const ændres data.

> Hvis den skal ændre på data er det nok ikke nogen god idé at
> lave et kopi.

Jo, så er det netop en god ide.

Bemærk også at der ikke er nogen garanti for at data() returnere en
pointer til de faktiske data men måske en kopi som senere bliver nedlagt
igen. Hvis std::string er reference counted kan du risikere at ændre i
data for flere forskellige instanser.

> Jeg har lidt svært ved at se hvorfor det er mere sikkert
> at give den adressen på data i en vector end adressen på
> data i en string.

Fordi det ikke er tilladt at ændre på data i en string gennem en pointer
mens det er tilladt i en vector. §21.3.6/4 i standarden siger om
std::string::data():
"Requires: The program shall not alter any of the values stored in the
character array. Nor shall the program treat the returned value as a
valid pointer value after any subsequent call to a nonconst member
function of basic_string that designates the same object as this."

> Man kunne bruge &Image[0], der sjovt nok giver en char *
> og ikke Image.data() der af (for mig) ukendte årsager
> giver en const char *

Her er problemet så at du ikke er garanteret at Image[1] ligger på
adressen efter Image[0]. Du antager at std::string er implementeret på
samme måde som std::vector, men det er ikke garanteret. Den kan lige så
godt være implementeret som std::deque.

Ivan Johansen

Bertel Brander (21-08-2005)
Kommentar
Fra : Bertel Brander


Dato : 21-08-05 13:33

Ivan Johansen wrote:
> Bemærk også at der ikke er nogen garanti for at data() returnere en
> pointer til de faktiske data men måske en kopi som senere bliver nedlagt
> igen. Hvis std::string er reference counted kan du risikere at ændre i
> data for flere forskellige instanser.

Kender du implementationer hvor det er tilfældet?

> Her er problemet så at du ikke er garanteret at Image[1] ligger på
> adressen efter Image[0]. Du antager at std::string er implementeret på
> samme måde som std::vector, men det er ikke garanteret. Den kan lige så
> godt være implementeret som std::deque.

Kender du implementationer hvor Image[1] ikke ligger lige
efter Image[0] ?

Jeg ved godt at der er langt fra garanti til "hvad kompilere
normalt gør". Jeg var ikke klar over at std::string kune lade
være med at gemme data i et array/vector eller at den kunne
finde på at lave et kopi når man kalder data() (og vel også c_str() ?)

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (21-08-2005)
Kommentar
Fra : Mogens Hansen


Dato : 21-08-05 13:57


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:4308747a$0$1216$edfadb0f@dread11.news.tele.dk...
> Ivan Johansen wrote:
>> Bemærk også at der ikke er nogen garanti for at data() returnere en
>> pointer til de faktiske data men måske en kopi som senere bliver nedlagt
>> igen. Hvis std::string er reference counted kan du risikere at ændre i
>> data for flere forskellige instanser.
>
> Kender du implementationer hvor det er tilfældet?

Reference counting og copy on write (COW) har været almindeligt brugt, men
er ikke vist ikke længere så almindeligt.

Hvis man står med 2 mulige løsninger:

1. Een som man _ved_ virker altid
2. Een som man _ved_ ikke nødvendigvis virker, og hvor man skal caste
const væk for at få det til at oversætte

så skal der vist alvorligt gode argumenter til for at vælge løsning 2.

Venlig hilsen

Mogens Hansen



Kent Friis (21-08-2005)
Kommentar
Fra : Kent Friis


Dato : 21-08-05 15:57

Den Sun, 21 Aug 2005 14:56:40 +0200 skrev Mogens Hansen:
>
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:4308747a$0$1216$edfadb0f@dread11.news.tele.dk...
>> Ivan Johansen wrote:
>>> Bemærk også at der ikke er nogen garanti for at data() returnere en
>>> pointer til de faktiske data men måske en kopi som senere bliver nedlagt
>>> igen. Hvis std::string er reference counted kan du risikere at ændre i
>>> data for flere forskellige instanser.
>>
>> Kender du implementationer hvor det er tilfældet?
>
> Reference counting og copy on write (COW) har været almindeligt brugt, men
> er ikke vist ikke længere så almindeligt.
>
> Hvis man står med 2 mulige løsninger:
>
> 1. Een som man _ved_ virker altid
> 2. Een som man _ved_ ikke nødvendigvis virker, og hvor man skal caste
> const væk for at få det til at oversætte

Det bliver da først rigtigt sjovt når det virker idag, men når
programmet lige skal recompiles om et par år, og man bruger en
nyere compiler, så begynder det pludselig at fejle, fordi C++ compilere
i 2008 ikke nødvendigvis følger hvad man plejede at gøre i 2005.

Mvh
Kent
--
Hard work may pay off in the long run, but laziness pays off right now.

Bertel Brander (21-08-2005)
Kommentar
Fra : Bertel Brander


Dato : 21-08-05 16:06

Mogens Hansen wrote:

> Hvis man står med 2 mulige løsninger:
>
> 1. Een som man _ved_ virker altid
> 2. Een som man _ved_ ikke nødvendigvis virker, og hvor man skal caste
> const væk for at få det til at oversætte
>
> så skal der vist alvorligt gode argumenter til for at vælge løsning 2.

Så som "det ser ud til at virke" og "jeg er doven, gider ikke kopiere
frem og tilbage".

Men nu har jeg også lært noget nyt om std::string.

Man kan undre sig over at OP har et "billede" i en std::string, der
er måske mere velegnede steder at opbevare billeder.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (21-08-2005)
Kommentar
Fra : Mogens Hansen


Dato : 21-08-05 16:36


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:43089846$0$22141$edfadb0f@dread11.news.tele.dk...

[8<8<8<]
> Man kan undre sig over at OP har et "billede" i en std::string, der
> er måske mere velegnede steder at opbevare billeder.

Ja, helt klart.
Der er nogen der bruger std::string (og lignende klasser) som char buffer.
Det er måske ikke så underligt, hvis man har C baggrund, hvor man ikke kan
på typen kan skelne brugen:
char receive_buffer[1024]; // large enough!!! (I hope)
char text[256];


std::vector<char> er en samling af enkelte char der hver især har en værdi,
i modsætning til std::string som i sig selv har netop een værdi (ligesom
int).

Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste