- ベストアンサー
C#の構造体に関する初歩的な質問
- C#の構造体で配列を宣言し、初期化しようとしていますが、エラーが発生します。
- 配列の初期化については理解していますが、構造体との組み合わせがわかりません。
- 修正方法を教えてください。初心者の質問ですが、よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>しかし、ここの部分はどういう事でしょうか? >public void init(int int次元数) >int int次元数とは??? 「1+1はなぜ2なの?」 というぐらいの質問です。答えようがありません。 単に「理解してください」としか言えません。 一行ずつステップ実行しましょう。 aaa.init(5); を実行する前と、後の「aaa.a」の状態の確認や aaa.init(6); などの、引数を変更した場合などの違いも、自分で調査してみてください。 言葉で説明を求めるより、自分なりの考察や分析を行わないと、理解に結びつきません。 >また、仮にテーブルからレコードを取得して、その値をごっそり構造体に格納したいというような事をした場合、先に配列の大きさは決められません。 取得部分はどのように行っているかを載せないと、アドバイスの使用がありません。 今後は、最初の質問と異なる質問を行う場合、別スレッドでお願いします。 >仮にテーブル DBからの取得ですね?(DB種類や接続方法は不明だが。。。) 仮に取得結果がデータテーブル形式で得られているとしたら、DataTable.Rows.Countで、取得件数は求められます。 その後に構造体の初期化を行ったらよいです。 そもそもテーブルからの取得結果を、配列に収めるという作り自体が、C#向きの作りであるとは思えません。 DataSet DataTable DataRow これに関係した取得方法であれば、そのオブジェクトをそのまま使うことをお勧めします。 「c# .net DB 取得」 これで調べたら、サンプルはいくらでも転がっています。 以上
その他の回答 (4)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
>この初期化の中身をもう少し詳しく 見たままですが^^; string[] aという宣言は、「aが配列だ」と言っているだけで、配列の大きさまでは定まりません。 new string[int次元数]; によって、配列の大きさを与えてあげているだけです。 仮に構造体の中ではない文字列配列であっても、要素数が定まっていない文字列配列は、同様な手続きを行わないと、使用できません。
お礼
ご回答ありがとうございました!! 配列の大きさを与えてあげるのは良くわかりました。 しかし、ここの部分はどういう事でしょうか? >public void init(int int次元数) int int次元数とは??? また、仮にテーブルからレコードを取得して、その値を ごっそり構造体に格納したいというような事をした場合、 先に配列の大きさは決められません。 構造体の中での大きさの指定と、メインの中での大きさ指定 で、指定の数が異なっても問題はないでしょうか???? 度々の質問で大変申し訳ありません。 もう少しだけ 教えて下さい。
- rk_les
- ベストアンサー率63% (23/36)
こんにちは。 こういった場合はコレクションを使うのが一般的です。 ArrayListを使いましょう。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
struct test { public string[] a; //初期化関数 public void init(int int次元数) { this.a = new string[int次元数]; } } //おまけの構造体 struct test2 { public System.Collections.ArrayList a; //初期化関数 public void init() { this.a = new System.Collections.ArrayList(); } //文字列配列として利用する場合のプロパティ public string[] list { get {return (string[])this.a.ToArray(typeof(string));} } } class Program { static void Main(string[] args) { test aaa = new test(); //初期化してから aaa.init(5); //設定 aaa.a[0] = "ABC"; //おまけの構造体の利用 test2 aaa2 = new test2(); //初期化してから aaa2.init(); //追加 aaa2.a.Add("ABC"); aaa2.a.Add("CDE"); aaa2.a.Add("EFG"); aaa2.a.Add("GHI"); Console.WriteLine(aaa2.list.Length.ToString() + "件登録されている"); } }
お礼
ご回答ありがとうございます。 知識不足で申し訳ありません。 //初期化関数 public void init(int int次元数) { this.a = new string[int次元数]; } } この初期化の中身をもう少し詳しく教えて頂けないでしょうか。。。 よろしくお願いします。
- Tacosan
- ベストアンサー率23% (3656/15482)
aaa.a の領域を確保してないのでは?
お礼
早速のご回答ありがとうございます。 領域の確保という事ですが、実際にどのように記述すれば 良いでしょうか。。。 構造体の中では初期化はできず、、、 初歩的な質問で申し訳ありません。 教えて下さい。
お礼
1から勉強しなおします。 ありがとうございました。