2

コード:

int i;
struct st
{
    int m;
}st_t[2];

void foo()
{
    i = 4;
    st_t[2] = 
    {
       {10},{20}
    };  // it's wrong !!!!  but I don't know how to do.     
}
int main()
{
   foo();
   cout<<i<<endl;          // will output 4;
   cout<<st_t[0].m<<endl;  // this should output 10
   cout<<st_t[1].m<<endl;  // this should output 20

   return 0;
}

関数で構造体配列を定義することは可能ですか? もしそうなら、どうやってこれを行うのですか?前もって感謝します。

PS:
私の英語が下手で申し訳ありません。私は Tetris ゲームを作成しています。Shape クラスがあり、Shape.h で形状構造体配列を宣言し、Shape.cpp の Shape コンストラクター関数で構造体配列に割り当てます。そうですか?または、別の関数で使用できるように構造体配列に割り当てる方法は?

4

4 に答える 4

2

配列が定義されている場所で配列を初期化できます。つまり、定義を関数に移動するか、初期化を関数の外に移動します。

struct st 
{ 
    int m; 
} 
st_t[2] = {{10},{20}};
于 2012-09-11T13:35:36.140 に答える
0

値を直接代入する代わりに、一時変数を初期化し、この変数をグローバル変数にコピーできます。

消去:

 ...
 st_t[2] =  {
      {10},{20}
 };
 ...

そして追加:

 ...
 st tmp[2] = { {10}, {20} };  

 memcpy(st_t, tmp, sizeof st_t);
 ...

補遺:

うまくいかない場合は、コードに別のエラーがある可能性があります。あなたの例から:

#include <iostream>
#include <memory.h>
using namespace std;

 int i;
 struct st { int m; } st_t[2];

 void foo()
{
 i = 4;
 st tmp[2] = { {10}, {20} }; 
 memcpy(st_t, tmp, sizeof st_t); // use: const_addr instead of &const_addr
}

 int main()
{
 foo();
 cout << i << endl;          // will output 4;
 cout << st_t[0].m << endl;  // this should output 10
 cout << st_t[1].m << endl;  // this should output 20
 return 0;
}

期待どおりにすべて正常に動作します。

于 2012-09-11T14:06:38.147 に答える
0

関数で配列を定義する場合 (質問のタイトルとテキストが示すように)、型指定子stを定義に追加します。

st st_t[2] = 
{
   {10},{20}
};

ただし、これはグローバル配列とは別の配列になるため、からの出力はmain()、コメントが言うべきことと一致しません。実際にグローバル配列に割り当てたい場合は、次のようにします。

st_t[0].m = 10;
st_t[1].m = 20;

std::arrayまたは、C++ 11 では、プレーン配列を次のように置き換えると、例と同様の構文を使用できます。

std::array<st, 2> st_t;

void foo() {
    // Note the extra braces - std::array is an aggregate containing an array
    st_t = 
    {{
        {10},{20}
    }};
}
于 2012-09-11T13:39:14.270 に答える
0

関数スコープで変数のみが必要な場合は、

void foo() {
    struct {
        int m;
    } st_t = { {10}, {20} };
    // do something
}
于 2012-09-11T13:58:36.020 に答える