1

関数を指すポインタがあります。私はしたいと思います:

  if (mode == 0)
  {
  const unsigned char *packet = read_serial_packet(src, &len);

  } else {
  const unsigned char *packet = read_network_packet(fd, &len);
  }

しかし、コードの後半で最初にポインターを使用するときにコンパイラーが文句を言うので、それはできません。

   error: 'packet' undeclared (first use in this function)

変ですね。if ステートメントがなくても機能しましたが、プログラムがさまざまなソースからデータを取得できるようにする必要があります。これを行うことは可能ではありませんか?そう思います。そうでない場合、私がしようとしているものを取得する他の簡単な方法はありますか?

どうもありがとう。

4

8 に答える 8

16

ブロック複合ステートメント、または変数のスコープの概念を確認する必要があります。

複合ステートメント ( {, }) で変数を宣言すると、変数はその正確なスコープでのみ宣言されます。

したがって、コードを次のように変更します

const unsigned char *packet = NULL;
if (mode == 0)
{
   packet = read_serial_packet(src, &len);
} else {
   packet = read_network_packet(fd, &len);
}

// Now you can perform operations on packet. 
于 2010-03-21T18:19:38.303 に答える
10

for、while、ifのような構造でなくても、どのような種類の角かっこも範囲外になります。

すなわち

{
    int num = 2;
}
num++; // error: out of scope!

また、あなたはそれを三元化することができます:

const unsigned char *packet = (mode == 0) ? read_serial_packet(src, &len) : read_network_packet(fd, &len);
于 2010-03-21T18:23:12.307 に答える
7

ブロック内で宣言された変数は、ブロック外には表示されません。

  if (mode == 0)
  {
    const unsigned char *packet = read_serial_packet(src, &len);
    // packet can be used here
  } else {
    const unsigned char *packet = read_network_packet(fd, &len);
    // packet can be used here
  }

  // packet can not be used here

packetの前に宣言し、条件に従ってそれをif代入する必要があります。ifelse

const unsigned char *packet;

if (mode == 0)
{
  packet = read_serial_packet(src, &len);
}
else
{
  packet = read_network_packet(fd, &len);
}

// packet can be used here
于 2010-03-21T18:19:24.890 に答える
3

これは、中括弧{ }が新しいスコープを作成するためです。これは、これらの中括弧の間に定義されたすべての変数がスコープ内で定義されているため、スコープ外では表示されないことを意味します。

*packetそれを機能させるには、if-elseの前に定義する必要があります。

const unsigned char *packet = 0;
if (mode == 0)
{
    packet = read_serial_packet(src, &len);
} 
else {
    packet = read_network_packet(fd, &len);
}
于 2010-03-21T18:21:32.650 に答える
2

変数を定義する場合、定義されたスコープ内でのみ使用できます。

{
    const unsigned char *packet = read_serial_packet(src, &len);

    // packet goes out of scope when the block ends
} 

したがって、定義を必要な最大のスコープに移動する必要があります。

{
    const unsigned char *packet;

    {
        packet = read_serial_packet(src, &len);

    }

    // packet still in scope here

}

// and packet is no longer in scope here 
于 2010-03-21T18:19:51.460 に答える
2

ifステートメントの前にポインターを次のように宣言します。

const unsigned char *packet;
if (mode == 0) {
    packet = read_serial_packet(src, &len);

} else {
    packet = read_network_packet(fd, &len);
}
于 2010-03-21T18:19:53.890 に答える
2

if ステートメント内で変数を宣言して後で使用することはできません。これは、プログラムのパスによっては存在しないメモリ ロケーションになるという単純な理由からです。

編集:それを以前に宣言してください。

于 2010-03-21T18:18:44.860 に答える
1

if ステートメント句内のポインターの宣言は、if ステートメントの最後までスコープを設定します。if ステートメントの外側でポインターを宣言し、内側で代入を行う必要があります。

于 2010-03-21T18:19:38.800 に答える