• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体 要素2次元配列の初期化方法)

構造体 要素2次元配列の初期化方法

このQ&Aのポイント
  • 構造体の要素2次元配列の初期化方法として、ReDimステートメントを使用する方法がありますが、この方法ではnewが必要というエラーが発生します。
  • もう一つの方法として、Forループを使用して各要素を初期化する方法がありますが、2次元配列においてもnewが必要というエラーが発生します。
  • 現在、プログラムが進展しなくて困っており、どなたか詳しい方に指導をお願いしています。

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

  • ベストアンサー
回答No.3

ANo.2です。 こちらでは動いていますよ。 正しいコードかどうかはわかりませんが^^; 新しいプロジェクトに、コードをコピペしてやってみてくださいな。

mokey
質問者

お礼

動作しました。  ループの中のinitializeがループの外にあったので....... そのまま入れてみたら、動作しました。  記述がシンプルで、最高です。 ちなみに、モジュールでは,newを使用せず、ループの中に2行で入れたら動作するようになりました。しかし、ご指導していただいた、記述方法がnewをいくつも記述しないので、最適だと思います。今後この方法を取り入れます。  こころから、有難うございます。 このような文章を、ほかにも記述指定待ったようです  なにかあれば、またよろしくお願いいたします。次からつぎへと出てきます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

ありゃ、そうですか。では、これではいかがでしょうか? ---------- Public Structure Elem Public nr As Integer Public type As Integer Public side()() As Double ' side(Nr.)(x|y|z)== normal vector Public Sub initialize() Dim intCnt As Integer ReDim side(10) For intCnt = 0 To 10 side(intCnt) = New Double(2) {} Next End Sub End Structure Public e_enq As Elem() = New Elem(10) {} ---------- Dim j, k As Integer For k = 0 To 10 With e_enq(k) .initialize() For j = 0 To 10 .side(j)(0) = 0.0 '*** .side(j)(1) = 0.0 .side(j)(2) = 0.0 Next j End With Next k ----------

mokey
質問者

お礼

再度、回答有難うございます。  テストしてみましたが、やはり最後の.side(j)(0) =0.0の箇所で同じエラーが発生します。newを使用とのメッセージがでます。  そちらでは、発生しないのでしょうか?  また、よろしくご指導のほどお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

配列は難しいですね。私もあまり使わないので勉強になります。 2次元配列ということですので、下のようにしてみたら、とりあえず動きました^^; ---------- Public Structure Elem Public nr As Integer Public type As Integer Public side(,) As Double ' side(Nr.)(x|y|z)== normal vector Public Sub initialize() ReDim side(10, 2) End Sub End Structure Public e_enq As Elem() = New Elem(10) {} ---------- Dim j, k As Integer For k = 0 To 10 With e_enq(k) .initialize() For j = 0 To 10 .side(j, 0) = 0.0 '*** .side(j, 1) = 0.0 .side(j, 2) = 0.0 Next j End With Next k

mokey
質問者

お礼

早速の、回答有難うございます。  残念ながら、この方式を使うには、現在検討中のソフトでは、修正箇所があまりにも多くて、採用できません。他の関数とのやり取りもありますので。  あくまで、ジャグ配列で検討したいと思っています。 また、なにかお気づきになりましたらご指導をお願いいたします。  NETでも調査していますが、いまいちです。 今後もよろしくおねがいいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 構造体配列

    こんにちわ。VB.NET初心者です。伝授お願いします。 VB6では Type Tpn_Index IdxSu As Integer idx(MAXTPN-1) As Integer End Type と定義できますが、VB.netでは構造体の中の配列部分が定義できません。 どのように書けばよろしいでしょうか? Public Structure Tpn_Index Dim IdxSu As Integer Dim idx() As Integer End Structure 上記の Dim idx() As Integer の部分です 宜しくお願いします

  • 構造体 多段階配列について

    Private Structure test Dim a As Integer Dim b As String Dim c as String End Structure Dim a() As test = New test(2) {} Dim b() As test = New test(2) {} Dim c()() As test c = New test()() {a, b} Dim temp() as integer cは多段階配列で、 例えば、c(0)のメンバaのデータをすべて取り出したい 時はどうすればよろしいのでしょうか? //気持ち的にはこのようにしたいのですが、 できません。 temp = c(0).a どなたか、わかるかた、教えてください。 よろしくお願いします。

  • VB.NET2013多次元構造体の初期化について

    Visual Studio2013 VB.NETを始めたばかりです 多次元構造体の初期化で困ってました 内容的には Public Structure ST1 Public a1 As Boolean Public a2 As Integer <VBFixedArray((9), (2)), MarshalAs(UnmanagedType.ByValArray, sizeconst:=30)> _ Public a3(,) As Long Public Sub Initialize() ReDim a3(9, 2) End Sub End Structure Public ss1(0) as ST! Public Sub test() ss1.Initialize() ss1(0).a3(0,0)=0 この状態では、多次元配列は確保されなくNothingで 初期化できない、参照型であると言うのが分かり 色々と調べてみてやっと、 コピーコンストラクタを用意して複製する方法で出来るのが分かりました Public Sub New(ByVal ss As ST1) MyClass.a1 = ss.a1 MyClass.a2 = ss.a2 MyClass.a3 = DirectCast(ss.a3.Clone(), Long(,)) End Sub End Structure Public Sub test() Dim ss0 As ST1 ss0.a1 = True ss0.a2 = 1 ss0.a3 = New Longr(,) {・・・・} Dim ss1(0) As New ss0 ただa3のサイズが大きいため定義するのは大変なので Dim bb(9,2) As Long ss0.a3 = bb としても上手く初期化できるのが分かり そしてステップ実行で中を確認していると あれっと思い 「コピーコンストラクタを用意して複製」 の方法ではなく元のまま Public Sub test() Dim bb(9,2) As Long ss1.Initialize() ss1(0).a3=bb とすると、上手く初期化され ss1(0).a3(0,1) = 100 と処理できるようになりました ただ、これで本当にいいのかが分かりません よろしくお願いします

  • VB2005の構造体で配列を含む構造体へアクセスするプロパティの記述方法

    VB2005の構造体で、以下のように Dantaiという配列を含む構造体があり、 プロパティを記述する方法で困っています。 Structure Person Dim namae As String Dim toshi As Integer end Structure Structure Dantai Dim m_DantaiMei As String Dim m_Hito() As Person Public Sub New(mei As String) m_DantaiMe = mei Redim m_Hito(100) End Sub '団体名 Public Property Dantai_Mei() As String Get Return m_DantaiMei End Get Set(ByVal value As String) m_DantaiMei = value End Set End Property '人 Public Property ???  '???????????? どのようにプロパティを設定したらよいのでしょうか? '???? '???? 配列で、しかも構造体です。 '???? '???? End Property End Structure Dim dantai As New Dantai("A") MessageBox(dantai.Dantai_Mei) MessageBox(人100人を表示させたい) '?????????????????????????? あと、構造体のDimはデフォルトで、PublicでしょうかPrivateでしょうか? VB2005の構造体について、VB6との違い、クラスとの違いなど詳しく書かれている サイトなどご存じの方教えて下さい。

  • 2次元配列の配列

    VisualBasic.NETでプログラムを作っているのですが、2次元配列の配列で行き詰って困っています。 配列1~3を別に定義して、その2次元配列を配列Xという配列にひとまとめにしたいのですが、エラーが出てしまいます。 エラー内容は「配列初期化子の次元が少なすぎます」で、場所は配列Xの第1要素です。 配列1~3以降もどんどん配列を追加していく予定なので、なるべく以下の方法で書いていきたいのですが、解決法はないでしょうか? また、他にいい方法があればご教授ください。 ソースです。 ---------------------------------------- Public 配列1(,) As Integer = _ { _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1} _ } Public 配列2(,) As Integer = _ { _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2} _ } Public 配列3(,) As Integer = _ { _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3} _ } Public 配列X(,)() As Integer = { _ 配列1, _     ←ここにエラーが出る 配列2, _ 配列3 _ } ---------------------------------------- 回答よろしくお願いします。

  • VB2010でのコントロール多次元配列について

    教えてください。 実行中にコントロールを生成したいのですが、 Public Class Form1  Private myTxt(,) As System.Windows.Forms.TextBox  Me.myTxt = New System.Windows.Forms.TextBox(59, 2) {}  Dim i As Integer  Dim j As Integer  Dim h As Integer  Dim p As Integer  h = 10  p = 100  For i = 0 To Me.myTxt.GetLength(0) - 1   For j = 0 To Me.myTxt.GetLength(1) - 1    Me.myTxt(i, j) = New System.Windows.Forms.TextBox    Me.myTxt(i, j).Name = "myTxt" + i.ToString() + j.ToString()    Me.myTxt(i, j).Size = New Size(100, 30)    Me.myTxt(i, j).Location = New Point(p, h)    p = p + 100   Next j   h = h + 30  Next i  Me.myPnl.Controls.AddRange(Me.myTxt) と書くと最後の行が波線になり、 “型 'System.Windows.Forms.TextBox の 2 次元配列' の値を 'System.Windows.Forms.Control' に変換できません。”とエラーになります。 これはAddRangeは多次元配列に使用できないということなのでしょうか? 色々検索してみましたが、コントロールの生成に関する多次元配列が見つけられずに 困っていました。 最後のAddRange(Me.myTxt)をAdd(Me.myTxt(i,j))などと変えたりしても別のエラーになり、 基本的に間違っている気がしますがどこだかがわかりません。 詳しい方、宜しくお願い致します。

  • VB.NET 2次元配列

    二次元配列に関して質問があります。 二次元配列を定義します。 Dim a(,) As Integer = _ {{0, 0, 0, 0, 0, 0, 1, 1, 1}, _ {0, 0, 0, 0, 0, 1, 0, 0, 1}, _ {0, 0, 0, 0, 0, 0, 1, 1, 1}} 一次元配列を定義します。 Dim b() As Integer 一次元配列のb()に二次元配列a(,)の {0, 0, 0, 0, 0, 0, 1, 1, 1}の部分を 入れようとした場合、 どのように記載すればよろしいでしょうか? イメージ的には b = a(0) で出きると思ったのですが、 構文エラーとなってしまいます。 よろしくお願いします。

  • VB6.0 →VB2005 のアップグレードでエラー表示

    VB6.0の標準モジュールでは Private Type typset a As String b As String c As Integer End Type Public make() As typset と記述してエラーもなく正常なのですが、VB2005にアップグレードしたときに、 Option Strict Off Option Explicit On Module Module1 Private Structure typset Dim a As String Dim b As String Dim c As Integer End Structure Public make() As typset←▼エラー▼            End Module 【エラー内容】 'make' は、module 'Module1' をとおして型 'typset' を namespace 'WindowsApplication1' で公開することはできません。 structure部をPublicなどにしてもエラーは消えますが、参照先に影響が出てしまいます。 根本的な解決方法が分かりません。 教えていただけないでしょうか?

  • VBからVCへ渡す構造体の設定について

    VB2005からVCで作られたDLLをコールするときにエラーが出て困ってます。 関数のパラメータに構造体を指定して、構造体のメンバの文字列を渡したいけれど、なんかうまく行かないんですよね。 VB2005だと固定長文字列ってのがサポートされていないとか何とか言うのは分かったけれど、 解決方法が不明となっています。 アドバイスをお願いします。 コードはこんな感じ。 *VC2005******************************************************* typedef struct{  int iTemp;  char cTemp[256]; }tag_strTemp; void __declspec(dllexport) WINAPI TestFunction(tag_strTemp* pstrTemp) {  MessageBox(NULL, pstrTemp->cTemp, "", 0); } *VC2005******************************************************* *VB2005******************************************************* Moduel Module1  Public Structure tag_strTemp   Public iTemp as Integer   Public cTemp as String ←ここの定義に問題があるんだと思ってます。  End Structure End Module Public Class Form1  Private Sub Form1_Load(・・・)   Dim strTemp as tag_strTemp   strTemp.cTemp = "ABCDE"   TestFunction(strTemp)  End Sub End Class *VB2005*******************************************************

  • VB6のTYPE文をVB.NETのStructureに変えるとき

    VB6のTYPE文をVB.NETのStructureに変えるとき 下記VB6のコードをVB.NETのStructureに変える場合 Type kouzou1 i As Integer j As Integer a As String * 20 b As String * 50 End Type を下記にしてみたのですが *20,*50のところは、どのように表現するのでしょうか。 Structure kouzou1 Dim i As Integer Dim j As Integer Dim a As String * 20 <- ステートメントの終わりを示してくださいのエラーになる。 Dim b As String * 50 <- ステートメントの終わりを示してくださいのエラーになる。 End Structure お教え下さい。