web-dev-qa-db-ja.com

C ++でバイト配列を作成する方法は?

次のヘッダーファイルをご覧ください

#pragma once

class MissileLauncher
{
public:
    MissileLauncher(void);

private:
    byte abc[3];
};

これによりエラーが生成されました

Error   1   error C2143: syntax error : missing ';' before '*'  

このようにしてみました

byte *abc;

しかし、それも失敗しました、同じエラー。しかし、たとえばint配列のように、この方法で他の組み込み型配列を呼び出すことができることに気付きました。なぜこれがバイト配列に起こっているのですか?これを解決するには? cppファイルに値を割り当てたいです。何か案は?

9
Soldier

試して

class MissileLauncher
{
public:
    MissileLauncher(void);

private:
    unsigned char abc[3];
};

または

using byte = unsigned char;

class MissileLauncher
{
public:
    MissileLauncher(void);

private:
    byte abc[3];
};

**注:古いコンパイラ(非C++ 11)では、using行をtypedef unsigned char byte;に置き換えます

20
Michael Price

正確に1バイトが必要な場合は、cstdintで定義されたuint8_tが最も表現力があります。

http://www.cplusplus.com/reference/cstdint/

13

std::bitset C++ 11で使用可能なタイプ。 Nビットの固定シーケンスを表すために使用でき、従来のロジックで操作できます。

#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;
}

Gcc 4.7.2を使用したコンパイル

g++ example.cpp -std=c++11

私は得る:

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

Byteは、CまたはC++の標準型ではありません。通常、少なくとも8ビット長のcharを試してください。

6
Joel

ByteはC/C++の標準のデータ型ではありませんが、必要な方法で使用できます。方法は次のとおりです。バイトは8ビットのメモリサイズであり、-128〜127の整数を表すことができます。 (その範囲には256個の整数があります。8ビットは256(2の8乗)の異なる値を表すことができます。)また、C/C++のcharは1バイト(8ビット)であることを思い出してください。したがって、C/C++でバイトデータ型を使用するために必要なことは、このコードをソースファイルの先頭に配置することだけです。#define byte charこれで、バイトabc [3]を宣言できます。

2
Anthony Oyovwe

Qtを使用することもできます。Qtは、知らない場合には、C++であり、追加のライブラリとクラスがたくさんあります。 Qtには非常に便利なQByteArrayクラスがあり、ニーズに合っていると確信しています。

http://qt-project.org/

1
Jared Price