2

私は、 TTK (トリガー ツールキット)を使用してサービスを提供する Debian サーバーをセットアップする任務を負っています。

ただし、ソフトウェアは 1997 年のもののようで、g++メンテナンスされておらず、デフォルトでは GCC () でコンパイルされません (v4.7.2)。

一部のエラーはstd名前空間を指定しなかったことが原因であり、修正しました。

ただし、ハードウェアの互換性のためにソフトウェアに含まれていると思われるクラス、特にそのread機能に問題があります。

私が理解できることから、クラスはハードウェアのエンディアンを抽象化することになっています(または同様の性質のもの):

public:
    Architecture()
    {
      short y = 256;
      short *x=&y;
      alpha_byte_ordering = ( *( (char*) (x) + 1) ) == 1 ? 1 : 0;
      if (alpha_byte_ordering)
        fprintf(stderr, "Architecture: detected alpha byte ordering.\n");
      else fprintf(stderr, "Architecture: detected non-alpha byte ordering.\n");
    }

    int read(istream &is, short *s)
    {
      if (!is.read(s, sizeof(short))) return 0;
      if (!alpha_byte_ordering) reverse_byte_order(s);
      return 1;
    }

他にも多くのオーバーロードreadされた関数があり、それらはすべて次のようなエラーを吐き出します:

Architecture.H: In member function ‘int Architecture::read(std::istream&, short int*)’:
Architecture.H:31:34: error: no matching function for call to ‘std::basic_istream<char>::read(short int*&, long unsigned int)’

このコードは、 andなどのさまざまな型ではなくistream::read、文字配列 ( ) を受け入れる必要があると指定している C++ 標準を知らなかったようです (実際には、標準ではなくhereを読みました)。char *short *double *

このコードを間違って解釈していますか? 規格のこの側面は 1997 年以降変更されていますか? それとも、このコードはそもそも機能しないだけでしたか (それについて書かれた論文があるので、これは非常に疑わしいです)。

最後に、これを修正するにはどうすればよいですか?C スタイルにキャストsするchar *とエラーが解消されるようですが、問題が解決するかどうかはわかりません。

4

1 に答える 1

0

関数は、最初の引数として文字型 (つまり、あなたの場合)readへのポインターを望んでいます。ポインターを正しくキャストするには、char*を使用する必要があります。reinterpret_cast

お気に入り

is.read(reinterpret_cast<char*>(s), sizeof(*s))
于 2013-08-06T11:25:07.237 に答える