J’essaie de comstackr cette bibliothèque en utilisant MSVC10, et cette fonction me donne mal à la tête:
/*! \brief Read bytes from a \c std::istream \param is The stream to be read. \param data A pointer to a location to store the bytes. \param size The number of bytes to be read. */ void _read(std::istream &is, unsigned char *data, int size) { for (int i=0; i < size ; ++i ) is.get(static_cast(data[i])); }
erreur C2664: ‘std :: basic_istream & std :: basic_istream :: get (_Elem &)’: impossible de convertir le paramètre 1 de ‘char’ en ‘char &’
L’original utilisé static_cast, donc j’essaie avec reinterpret_cast comme suggéré ailleurs mais cela échoue aussi:
erreur C2440: ‘reinterpret_cast’: impossible de convertir le caractère ‘unsigned char’ en ‘char’
- comment atsortingbuer une structure longue de 64 bits non signée à 32 bits dans une architecture 32 bits
- Comment définir l’élément dans le tableau sur null dans le programme C
- Écrire des entiers dans un descripteur de fichier en utilisant write?
- Fonctionne bien sous UNIX mais pas dans Visual Studio?
- Comment changer de répertoire en utilisant la commande exec du programme C?
Cette bibliothèque est livrée avec des makefiles Unix. Quel est le meilleur moyen de résoudre cette erreur de compilation?
Parce que reinterpret_cast
ne fonctionne pas de cette façon, par définition.
Pour pouvoir réinterpréter la mémoire, vous devez appliquer reinterpret_cast
aux pointeurs ou aux références. Si vous souhaitez réinterpréter les données de caractère unsigned char
tant que données de type char
, vous devez en réalité convertir en caractères char &
type, et non en caractères.
Dans votre cas, ce serait
is.get(reinterpret_cast(data[i]));
Ou vous pouvez aller sur la route du pointeur et faire
is.get(*reinterpret_cast(&data[i]));
(qui est la même chose).
Parce que vous avez besoin d’un caractère char&
qu’il s’agit d’une référence à char
mais que le résultat de la conversion est une valeur r, et ne peut donc pas être lié à la référence.
Vous avez besoin de quelque chose comme:
is.get(reinterpret_cast(data[i]));
Mais dans ce cas particulier, vous pouvez / static_cast
utiliser static_cast
:
is.get(static_cast(data[i]));
Essayez plutôt ceci:
void _read(std::istream &is, unsigned char *data, int size) { for (int i=0; i < size ; ++i ) is.get(reinterpret_cast(data)[i]); }
En plus des autres réponses au problème du casting:
Pourquoi n’utilisez-vous pas simplement istream::read
pour lire les octets de size
à la fois? Cela évite votre for-loop fabriqué à la main et devrait être plus rapide.
void _read(std::istream &is, unsigned char *data, int size) { is.read(reinterpret_cast(data), size); }