• ベストアンサー

C#で構造体の配列を持った構造体を使いたいのですが

C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

質問者が選んだベストアンサー

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

C# では、配列は「単なる連続したメモリ領域」ではなくて「添字によってオブジェクトを格納できるオブジェクト」であることに注意しなくてはいけません。つまり、C では配列は一種の構造体でしたが、C# では配列は参照型のオブジェクトです。 よって、C のように予めサイズを固定しておくということは基本的にできません。配列の大きさは配列のインスタンスが作られるときに動的に決まります。 C# では、参照型のオブジェクトを構造体のメンバにすることはあまりありません。null 値の扱いが面倒だからです。 また、C# では構造体の大きさは大きくとも 20 バイト程度までにします。C# では基本的に「構造体へのポインタ」はありません。巨大な構造体をそのまま扱うのはメモリの使い方の観点からいって非効率的です。 今回の件では、構造体ではなくクラスにするのがよいかと思われます。

n2n
質問者

補足

回答ありがとうございます クラスを用いるようにした場合 クラスがクラスの配列を持つようにしたいわけですが この場合もやはり 予めサイズを固定できず インスタンスを動的に生成するようにするわけですよね? クラスにした方が良いのは回答の後半部の理由があるという事でよろしいのでしょうか? 重ねて質問申し訳ありません

その他の回答 (3)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.4

> この場合もやはり 予めサイズを固定できず インスタンスを動的に生成するようにするわけですよね? クラスにした方が良いのは回答の後半部の理由があるという事でよろしいのでしょうか? はい、そういうことです

n2n
質問者

お礼

大変参考になりました ありがとうございました

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

C#の勉強のつもりで書いてみましたが、あんまり美しくなかったり: public struct Xyz { public struct Abc { public int a, b, c; }; public int index; public Abc[] _abc; }; class Program { static void Main( string[] args ) { Xyz[] _xyz = new Xyz[8]; for ( int i = 0; i < _xyz.Length; i++ ) { _xyz[i]._abc = new Xyz.Abc[32]; } _xyz[0]._abc[3].b = 1; } } C#の構造体は、クラスと違って値型なので、new[]した時点でインスタンス化されるけど、その際、引数なしのコンストラクタを構造体は定義できないので、結局、各要素ごとにインスタンス化しないといけないみたい。 いったん作成したものを捨てるのは忍びないので、代入にしてみてみたけど、中身が露呈しているのがなんとも。

n2n
質問者

お礼

大変 参考になりました 同じことは すんなりとは 出来ないようですね ありがとうございました

  • ko_kinta
  • ベストアンサー率39% (43/109)
回答No.1

構造体を宣言している順番はここに書いてある通りですか? struct abcはstruct xyzより前で宣言しなければいけませんよ。 このエラーはstruct xyzのメンバーの型であるabcが見つからないと警告しているのではないですか?

n2n
質問者

お礼

例えのコードを きちんとチェックしてませんでした ご指摘ありがとうございました

n2n
質問者

補足

構造体を宣言している順番ですが実際は逆です このコードは 質問を分かりやすくするために いいかげん書いたコードで 最後に順序は入れ換えるのを忘れてました 申し訳ありません 今回の問題はそれとは無関係のようです

関連するQ&A