C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 構造体内での配列の宣言


(過去ログ 16 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■6145 / inTopicNo.1)  構造体内での配列の宣言
  
□投稿者/ kou (2回)-(2007/08/02(Thu) 13:47:01)

分類:[C++/CLI] 

こんちには、分からないことがあるので質問させていただきます。

以前まで、Managed C++ でプログラムを作成していたのですが、
それを、C++/CLI に変換しているとこで問題が発生してしまいました.

MC++
--------------
struct s{
int a[10];
int b[10];
}

s p[10];

p[1].a[2]=1;
p[2].a[2]=2;
--------------

C++/CLI
--------------
value struct s{
static array<int>^ a = gcnew a<int>(10);
static array<int>^ b = gcnew b<int>(10);

}

static array<s>^ p = gcnew array<s>(10);

p[1].a[2]=1;
p[2].a[2]=2;
--------------

として中身を確認した時に、
MC++ では、p[1].a[2]=1 となっていたのですが
C++/CLI では、p[1].a[2]=2 となってしまっていました。

こうなってしまう、原因、解決法を教えて頂けたらと思います。
よろしくお願いします。
引用返信 編集キー/
■6146 / inTopicNo.2)  Re[1]: 構造体内での配列の宣言
□投稿者/ Blue (329回)-(2007/08/02(Thu) 13:55:05)
2007/08/02(Thu) 13:59:34 編集(投稿者)
>static array<int>^ a = gcnew a<int>(10);
staticだと用途が違ってしまいます。
コンストラクタを用意してそこでgcnewするようにしないと、MC++と同じような振る舞いにはなりません。

value struct s
{
    array<int>^ a;
    array<int>^ b;

    s()
    {
        a = gcnew array<int>(10);
        b = gcnew array<int>(10);
    }
};

もっとも、MC++のときはマネージドの構造体ではないので、それをマネージドにすること自体
多分違っているんじゃないかなぁと。
(MC++のほうが __value struct となっていれば C++/CLI は value struct になる。
__valueがついていなければ、アンマネージドの構造体であるので、それをマネージドにするの?ってこと)


追記

こうなる原因は、staticなメンバ変数(静的メンバ変数)になっているためです。
具体的な解説は「静的メンバ変数」でWeb検索してみてください。

引用返信 編集キー/
■6147 / inTopicNo.3)  Re[2]: 構造体内での配列の宣言
□投稿者/ Hongliang (159回)-(2007/08/02(Thu) 14:01:26)
Hongliang さんの Web サイト
> コンストラクタを用意してそこでgcnewするようにしないと、MC++と同じような振る舞いにはなりません。
値型だとデフォルトコンストラクタは定義できないような。
引用返信 編集キー/
■6148 / inTopicNo.4)  Re[3]: 構造体内での配列の宣言
□投稿者/ Blue (330回)-(2007/08/02(Thu) 14:06:56)
> 値型だとデフォルトコンストラクタは定義できないような。
あ、そうなのか。

ということで、value型でなくref型にするしかなさそうですね。
(__nogcに対応するものがあればよかったわけですけど。)
# StructLayoutを使えば出来なくもない、、、かな、
# 参考:http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=1243921&SiteID=7
引用返信 編集キー/
■6160 / inTopicNo.5)  Re[4]: 構造体内での配列の宣言
□投稿者/ kou (4回)-(2007/08/02(Thu) 18:12:44)
Blue 様、Hongliang 様


お返事頂きありがとうございます。

御指摘頂いた内容を反映させ、以下のように変更すると、
コンパイルは通ったのですが、
NullReferenceException というメッセージが出てきました。

ref struct s
{
array<int>^ a;
array<int>^ b;

s()
{
a = gcnew array<int>(10);
b = gcnew array<int>(10);
}
};

array<s^>^ p = gcnew array<s^>(10);

p[1]->a[1] = 1; (この部分でエラーが発生していると思われます。)

Web で調べたのですが解決法が分かりませんでした。

解決法をご存知でしたら、教えて下さい。
よろしくお願いします。
引用返信 編集キー/
■6161 / inTopicNo.6)  Re[5]: 構造体内での配列の宣言
□投稿者/ Hongliang (160回)-(2007/08/02(Thu) 18:34:15)
Hongliang さんの Web サイト
参照型(ref型)の配列は、配列を gcnew したとき各要素は nullptr で初期化されます。
それぞれの要素ごとに gcnew する必要があります。
引用返信 編集キー/
■6172 / inTopicNo.7)  Re[6]: 構造体内での配列の宣言
□投稿者/ kou (5回)-(2007/08/03(Fri) 10:37:27)
Hongliang 様

ありがとうございます。
御指摘の通りに変更しましたところ、うまくいきました。

有難うございました
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -