IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

FillChar de Delphi pour C++Builder ?


Sujet :

C++Builder

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2009
    Messages : 55
    Points : 41
    Points
    41
    Par défaut FillChar de Delphi pour C++Builder ?
    Bonjour,
    Une nouvelle demande d'aide SVP...
    FillChar de Delphi à remplacer pour C++Builder.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    void __fastcall TForm1::InitializeBitmapInfoHeader(HBITMAP Bitmap, tagBITMAPINFOHEADER &BI, int Colors)
    {
      TDIBSection DS;
      int Bytes = 0;
      DS.dsBmih.biSize = 0;
      Bytes = GetObject(Bitmap, sizeof(DS), &DS);
      if (Bytes == 0) InvalidBitmap();
      else
    	if((Bytes >= (sizeof(DS.dsBm) + sizeof(DS.dsBmih))) && (DS.dsBmih.biSize >= ((DWORD) sizeof(DS.dsBmih))))
    	  BI = DS.dsBmih;
    	else
    	{
    	 // "COMMENT" remplacer FillChar de Delphi pour C++Builder. Aide de Delphi: FillChar(var X; Count: Integer; Value: Ordinal);
    	 FillChar(BI, sizeof(BI), 0);
    	}
      if (Colors != 0)
    	switch ( Colors )
    	{
    	  case 2:        BI.biBitCount = 1;  break;
    	  case 16:       BI.biBitCount = 4;  break;
    	  case 256:      BI.biBitCount = 8;  break;
    	  case 65536:    BI.biBitCount = 16; break;
    	  case 16777216: BI.biBitCount = 24; break;
    	}
      else  BI.biBitCount = DS.dsBm.bmBitsPixel * DS.dsBm.bmPlanes;
      BI.biPlanes = 1;
      if (BI.biSizeImage == 0 )
    	 BI.biSizeImage = BytesPerScanline(BI.biWidth, BI.biBitCount, 32) * Ceil((const double)BI.biHeight);
    }
    Merci par avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    En C++ pour remplir un conteneur, il y a les fonctions std::fill() et std::fill_n(), celles ci gèrent un remplissage dont le type est vérifié.
    On peut "forcer" une écriture en mode octet, mais c'est extrêmement déconseillé, ça donnerait le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::fill_n( static_cast<char*>(&BI) , sizeof BI , 0 ); // écriture forcée sous forme d'octets
    Le code ci-dessus devrait être refusé par le compilateur exigeant un reinterpret_cast<>() au lieu du static_cast<>() ce qui montre bien l'aspect plus très très "unsafe".
    Sinon pour un code propre pour un objet du type std::array<TypeQuelconque,N> ou un TypeQuelconque[N] ou même un ConteneurQuelconque<TypeQuelconque>, on peut écrire un code qui lui est tout à fait sain :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    using  std::begin;
    using  std::end;
    std::fill( begin(BI) , end(BI) , ValeurQuelconque ); // remplit de 0 le tableau BI

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2009
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    using  std::begin;
    using  std::end;
    std::fill( begin(BI) , end(BI) , ValeurQuelconque ); // remplit de 0 le tableau BI
     
    E2268 Appel à une fonction non définie 'begin'
    E2272 Identificateur attendu
     
    // Et non plus pour...
    std::fill_n( static_cast<char*>(&BI) , sizeof BI , 0 ); // écriture forcée sous forme d'octets

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    std::begin est dans #include <iterator> et n'existe "que" depuis le C++11
    std::fill_n est dans #include <algorithm> et n'existe "que" depuis le C++03

  5. #5
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    salut
    bien que ce soit du 'C' il existe la bonne fonction 'memset'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void* memset( void* str, int ch, size_t n);
    Parameters
    str[] : Pointer to the object to copy the character.
    ch : The character to copy.
    n : Number of bytes to copy.
    Return value :
    The memset() function returns str, the pointer to the destination
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2009
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Bonjour,
    Désolé mais toujours le même problème...
    Il est très possible que j'ai raté quelque chose
    en cours de traduction du logiciel avec les: void *
    et les: tagBITMAPINFOHEADER &BI.
    Je vais laisser mariner un peu et reprendrais plus tard.
    Merci...

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/07/2009, 18h52
  2. Réponses: 2
    Dernier message: 08/06/2009, 22h25
  3. Réponses: 4
    Dernier message: 21/04/2009, 00h17
  4. DLL Delphi pour utilisation sous C++ Builder
    Par kurul1 dans le forum Langage
    Réponses: 8
    Dernier message: 25/06/2008, 10h54
  5. Réponses: 0
    Dernier message: 25/07/2002, 11h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo