| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | 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 
 
 
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |