アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

となってしまいます

A 回答 (4件)

C# では、配列は「単なる連続したメモリ領域」ではなくて「添字によってオブジェクトを格納できるオブジェクト」であることに注意しなくてはいけません。

つまり、C では配列は一種の構造体でしたが、C# では配列は参照型のオブジェクトです。
よって、C のように予めサイズを固定しておくということは基本的にできません。配列の大きさは配列のインスタンスが作られるときに動的に決まります。

C# では、参照型のオブジェクトを構造体のメンバにすることはあまりありません。null 値の扱いが面倒だからです。
また、C# では構造体の大きさは大きくとも 20 バイト程度までにします。C# では基本的に「構造体へのポインタ」はありません。巨大な構造体をそのまま扱うのはメモリの使い方の観点からいって非効率的です。

今回の件では、構造体ではなくクラスにするのがよいかと思われます。

この回答への補足

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

補足日時:2006/05/16 15:06
    • good
    • 0

> この場合もやはり 予めサイズを固定できず インスタンスを動的に生成するようにするわけですよね?


クラスにした方が良いのは回答の後半部の理由があるという事でよろしいのでしょうか?

はい、そういうことです
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/05/17 15:04

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[]した時点でインスタンス化されるけど、その際、引数なしのコンストラクタを構造体は定義できないので、結局、各要素ごとにインスタンス化しないといけないみたい。
いったん作成したものを捨てるのは忍びないので、代入にしてみてみたけど、中身が露呈しているのがなんとも。
    • good
    • 2
この回答へのお礼

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

お礼日時:2006/05/16 15:05

構造体を宣言している順番はここに書いてある通りですか?


struct abcはstruct xyzより前で宣言しなければいけませんよ。

このエラーはstruct xyzのメンバーの型であるabcが見つからないと警告しているのではないですか?

この回答への補足

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

補足日時:2006/05/16 14:56
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/05/16 15:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A