Veuillez consulter le fichier d'en-tête suivant
#pragma once
class MissileLauncher
{
public:
MissileLauncher(void);
private:
byte abc[3];
};
Cela a généré l'erreur
Error 1 error C2143: syntax error : missing ';' before '*'
J'ai essayé de le faire de cette façon
byte *abc;
mais il a également échoué, même erreur. Cependant, j'ai remarqué que je peux appeler d'autres tableaux de types intégrés de cette manière pour un exemple, un tableau int. Pourquoi cela arrive-t-il au tableau d'octets? Comment résoudre ça? Je voudrais attribuer les valeurs dans le fichier cpp. Des idées?
Essayer
class MissileLauncher
{
public:
MissileLauncher(void);
private:
unsigned char abc[3];
};
ou
using byte = unsigned char;
class MissileLauncher
{
public:
MissileLauncher(void);
private:
byte abc[3];
};
** Remarque: dans les anciens compilateurs (non C++ 11), remplacez la ligne using
par typedef unsigned char byte;
Si vous voulez exactement un octet, uint8_t défini dans cstdint serait le plus expressif.
Vous pouvez peut-être tirer parti de std::bitset
type disponible en C++ 11. Il peut être utilisé pour représenter une séquence fixe de N
bits, qui peut être manipulée par la logique conventionnelle.
#include<iostream>
#include<bitset>
class MissileLauncher {
public:
MissileLauncher() {}
void show_bits() const {
std::cout<<m_abc[2]<<", "<<m_abc[1]<<", "<<m_abc[0]<<std::endl;
}
bool toggle_a() {
// toggles (i.e., flips) the value of `a` bit and returns the
// resulting logical value
m_abc[0].flip();
return m_abc[0];
}
bool toggle_c() {
// toggles (i.e., flips) the value of `c` bit and returns the
// resulting logical value
m_abc[2].flip();
return m_abc[2];
}
bool matches(const std::bitset<3>& mask) {
// tests whether all the bits specified in `mask` are turned on in
// this instance's bitfield
return ((m_abc & mask) == mask);
}
private:
std::bitset<3> m_abc;
};
typedef std::bitset<3> Mask;
int main() {
MissileLauncher ml;
// notice that the bitset can be "built" from a string - this masks
// can be made available as constants to test whether certain bits
// or bit combinations are "on" or "off"
Mask has_a("001"); // the zeroth bit
Mask has_b("010"); // the first bit
Mask has_c("100"); // the second bit
Mask has_a_and_c("101"); // zeroth and second bits
Mask has_all_on("111"); // all on!
Mask has_all_off("000"); // all off!
// I can even create masks using standard logic (in this case I use
// the or "|" operator)
Mask has_a_and_b = has_a | has_b;
std::cout<<"This should be 011: "<<has_a_and_b<<std::endl;
// print "true" and "false" instead of "1" and "0"
std::cout<<std::boolalpha;
std::cout<<"Bits, as created"<<std::endl;
ml.show_bits();
std::cout<<"is a turned on? "<<ml.matches(has_a)<<std::endl;
std::cout<<"I will toggle a"<<std::endl;
ml.toggle_a();
std::cout<<"Resulting bits:"<<std::endl;
ml.show_bits();
std::cout<<"is a turned on now? "<<ml.matches(has_a)<<std::endl;
std::cout<<"are both a and c on? "<<ml.matches(has_a_and_c)<<std::endl;
std::cout<<"Toggle c"<<std::endl;
ml.toggle_c();
std::cout<<"Resulting bits:"<<std::endl;
ml.show_bits();
std::cout<<"are both a and c on now? "<<ml.matches(has_a_and_c)<<std::endl;
std::cout<<"but, are all bits on? "<<ml.matches(has_all_on)<<std::endl;
return 0;
}
Compiler avec gcc 4.7.2
g++ example.cpp -std=c++11
Je reçois:
This should be 011: 011
Bits, as created
false, false, false
is a turned on? false
I will toggle a
Resulting bits:
false, false, true
is a turned on now? true
are both a and c on? false
Toggle c
Resulting bits:
true, false, true
are both a and c on now? true
but, are all bits on? false
L'octet n'est pas un type standard en C ou C++. Essayez char, qui est généralement long d'au moins 8 bits.
L'octet n'est pas un type de données standard en C/C++ mais il peut toujours être utilisé comme je suppose que vous le souhaitez. Voici comment: Rappelez-vous qu'un octet est une taille de mémoire de huit bits qui peut représenter l'un des entiers compris entre -128 et 127 inclus. (Il y a 256 entiers dans cette plage; huit bits peuvent représenter 256 - deux élevés à la puissance huit - des valeurs différentes.). Rappelez-vous également qu'un caractère en C/C++ est un octet (huit bits). Donc, tout ce que vous devez faire pour avoir un type de données d'octet en C/C++ est de mettre ce code en haut de votre fichier source: #define byte char Ainsi vous pouvez maintenant déclarer byte abc [3];
Vous pouvez utiliser Qt qui, au cas où vous ne le savez pas, est C++ avec un tas de bibliothèques et de classes supplémentaires et ainsi de suite. Qt a une classe QByteArray très pratique qui, je suis sûr, répondrait à vos besoins.