1

この問題に似ていると思われる多くの Q&A を読みましたが、まだ答えが見つかりませんでした: 次のfillbyteように、関数内の動的バイト配列にいくつかの割り当てを行う必要があります。

int Error;
result = fillbyte (&Error);

以下に示す行にコメントすると、すべて正常に動作します。ただし、その行が実行されると、この関数が 2 回目に呼び出されたときにアクセス違反の例外が発生しますが、最初にコードが正しく実行され、すべてがうまくいきます。このコード行または配列にパスワード バイトを入力する別の方法の問題を見つけることができないようです。

Bool fillbyte(int *Error)
{
    byte BCC;
    byte *Packet1 = new byte;
    *Packet1 = 0x01;
    *(Packet1+1) = 'P';
    *(Packet1+2) = '1';
    *(Packet1+3) = STX;
    *(Packet1+4) = '(';
    int add = sizeof(readingprops.password)*2;
    for(int i=0;i<add;i++)
    {
        *(Packet1+(5+i)) = readingprops.password[i];     //this line raises the problem
    }
    *(Packet1+add+5) = ')';
    *(Packet1+add+6) = ETX;
    BCC = calc.CalcBCC(Packet1,add+7);
    *(Packet1+add+7) = BCC;
    SerialPort.Write(Packet1,add+8);
    delete Packet1;
    return true;
}

どんな助けでもいただければ幸いです

4

2 に答える 2

3

どうすればうまくいくのかわかりません。ヒープに 1 バイトを割り当てますが、複数のバイトとして扱います。

byte *Packet1 = new byte;
*Packet1 = 0x01;
*(Packet1+1) = 'P';  // !!!
*(Packet1+2) = '1';  // !!!
*(Packet1+3) = STX;  // !!!
*(Packet1+4) = '(';  // !!!
于 2013-06-26T12:54:09.313 に答える
3

ここでは、 1バイトだけを割り当てます

byte *Packet1 = new byte;

次に、割り当てられたメモリを超えてポインターを使用します

*(Packet1+1) = 'P';
*(Packet1+2) = '1';
*(Packet1+3) = STX;
*(Packet1+4) = '(';

これにより、未定義の動作が発生します。動作する場合もあります。だからあなたは次のようなものが欲しい

byte Packet1 = new byte[size]

ここで、 size はニーズに適しています (おそらくadd + 8、これはその関数で書き込むバイト数であるため)。その後、 で削除しdelete[]ます。スタック割り当てを使用することもできますstd::vector<byte>。これは c++ であるためです。

于 2013-06-26T12:57:54.947 に答える