Please have a look at the followng header file
#pragma once
class MissileLauncher
{
public: MissileLauncher(void);
private: byte abc[3];
};This generated the error
Error 1 error C2143: syntax error : missing ';' before '*' I tried to do it in this way
byte *abc;but it also failed, same error. However, I noticed I can call other built in tyes arrays in this way for an example, an int array. Why this is happening to byte array? How to solve this? I would like to assign the values in cpp file. Any ideas?
27 Answers
Try
class MissileLauncher
{
public: MissileLauncher(void);
private: unsigned char abc[3];
};or
using byte = unsigned char;
class MissileLauncher
{
public: MissileLauncher(void);
private: byte abc[3];
};**Note: In older compilers (non-C++11) replace the using line with typedef unsigned char byte;
If you want exactly one byte, uint8_t defined in cstdint would be the most expressive.
3Maybe you can leverage the std::bitset type available in C++11. It can be used to represent a fixed sequence of N bits, which can be manipulated by conventional logic.
#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;
}Compiling using gcc 4.7.2
g++ example.cpp -std=c++11I get:
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 1 Byte is not a standard type in C or C++. Try char, which is usually and at least 8 bits long.
2Byte is not a standard data type in C/C++ but it can still be used the way i suppose you want it. Here is how: Recall that a byte is an eight bit memory size which can represent any of the integers between -128 and 127, inclusive. (There are 256 integers in that range; eight bits can represent 256 -- two raised to the power eight -- different values.). Also recall that a char in C/C++ is one byte (eight bits). So, all you need to do to have a byte data type in C/C++ is to put this code at the top of your source file: #define byte char So you can now declare byte abc[3];
You could use Qt which, in case you don't know, is C++ with a bunch of additional libraries and classes and whatnot. Qt has a very convenient QByteArray class which I'm quite sure would suit your needs.
1Byte is not a standard type in C/C++, so it is represented by char.
An advantage of this is that you can treat a basic_string as a byte array allowing for safe storage and function passing. This will help you avoid the memory leaks and segmentation faults you might encounter when using the various forms of char[] and char*.
For example, this creates a string as a byte array of null values:
typedef basic_string<unsigned char> u_string;
u_string bytes = u_string(16,'\0');This allows for standard bitwise operations with other char values, including those stored in other string variables. For example, to XOR the char values of another u_string across bytes:
u_string otherBytes = "some more chars, which are just bytes";
for(int i = 0; i < otherBytes.length(); i++) bytes[i%16] ^= (int)otherBytes[i]; 7