0

プログラムの状態に応じて、同じ変数の2つの異なる値を必要とするプログラムがあります。

関数はヘッダー(test.inc)で宣言されています:

void function_a(int pr)
{
    if (pr == 1)
    enum{
      a = 5,
      b = 5,
      c = 5,
    };
    else
    enum{
      a = 2,
      b = 2,
      c = 2,
    };
}

そしてプログラム:(main.c)

int main() {
    function_a(1);        
    printf("%d",a);
    return (EXIT_SUCCESS);
}

コンパイルした後、次のように言います。

main.c:26:エラー: `a'が宣言されていません(この関数で最初に使用)
main.c:26:エラー:(宣言されていない各識別子は1回だけ報告されます
main.c:26:エラー:関数ごとに表示されます。 )。

ヘッダーにある関数の列挙型を使用してグローバル宣言を行う方法は?
ありがとうございました

4

5 に答える 5

2

ここでは列挙型は必要ありません。3 つのグローバル変数が必要で、それらを設定するだけです。

int a,b,c;

void function_a(int pr)
{
    if (pr == 1) {
      a = 5,
      b = 5,
      c = 5,
    } else {
      a = 2;
      b = 2;
      c = 2;
    }
}

int main() {
    function_a(1);        
    printf("%d",a);
    return (EXIT_SUCCESS);
}
于 2012-11-22T13:04:09.867 に答える
2

あなたに2つの提案があります:

1) 列挙型の代わりに構造体を使用する

struct test_struct {
   int a;
   int b;
   int c;
} test;
void function_a(int pr)
{
    if (pr == 1)
    test = {
      .a = 5,
      .b = 5,
      .c = 5,
    };
    else
    test = {
      .a = 2,
      .b = 2,
      .c = 2,
    };
}

そしてプログラム:(main.c)

int main() {
    function_a(1);        
    printf("%d",test.a);
    return (EXIT_SUCCESS);
}

2) 単純変数の使用

int a,b,c;

void function_a(int pr)
{
    if (pr == 1) {
      a = 5;
      b = 5;
      c = 5;
    }
    else {
      a = 2;
      b = 2;
      c = 2;
    }
}

そしてプログラム:(main.c)

int main() {
    function_a(1);        
    printf("%d",a);
    return (EXIT_SUCCESS);
}
于 2012-11-22T13:09:07.343 に答える
1

あなたが正しく理解しているなら、プログラムの部分に応じて x という名前の変数に異なる値を持たせたいと考えています。変数は、同時に 2 つの異なる値を参照することはできませんが、特定の時点で代入によって変数の値を変更することはできます。

本当に必要なのは関数だと思います。関数を呼び出すと (最も大まかな意味で)、値がそのパラメーターにバインドされます。

しかし、enum の不自然な使い方を見て、一歩下がって、C に関する優れた本を手に取りたいと思うかもしれません。こちらのリストを参照してください。

于 2012-11-22T13:02:27.693 に答える
1

私はこれを使用します

void function_a(int pr)
{
    if (pr == 1)
    { //make them local
    enum{
      a = 5,
      b = 5,
      c = 5,
    };
     common_function(); // move common functionality inside a function and call it
    }
    else
    {  // make them local
      enum{
      a = 2,
      b = 2,
      c = 2,
    };
common_function(); // move common functionality inside a function and call it
}
}

内ではcommon_function、列挙値を使用します

于 2012-11-22T13:06:19.653 に答える
1

コンパイラがシンボルを探しているために発生するコンパイル時エラーa

関数呼び出しは実行時に発生するため、実行時function_1(1)に呼び出されaてから存在します。aただし、コンパイラはコンパイル時にシンボルまたはトークンを解決する必要があるため、このエラーが発生します。

コンパイラ エラーは、構文エラーが原因で発生します。そして、ここにa宣言されていないものがあります。

注: 1 つの翻訳単位で使用されるすべてのシンボルは、適切に宣言する必要があります。compile timeそうしないと、コンパイラがエラーをスローします。

これは、関数呼び出しの代わりにマクロ呼び出しを使用することで解決できます。マクロは前処理されているためです。または、#define定数を実行します。

于 2012-11-22T13:06:34.887 に答える