• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB2008: 構造体の配列の初期化の方向性にアドバイスを!)

構造体の配列の初期化の方向性にアドバイスを!

このQ&Aのポイント
  • 構造体の配列の初期化について、VB2008での実装方法を知りたいです。
  • 構造体の配列の初期化についてのアドバイスをお願いします。
  • VB2008で配列の初期化を行う際のベストプラクティスについて教えてください。

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

  • ベストアンサー
  • KG_
  • ベストアンサー率62% (34/54)
回答No.3

解決したようでなによりです。 Dim SMTab As SecondaryMaterial() = {... もしくは Dim SMTab As New SecondaryMaterial() = {... で、Strict ON でもOKな気がします。 ご参考までに。

noname#140971
質問者

お礼

本当に出来ました! これで、無事に先に進めます。 入門書も入門サイトも見ないでOKWaveだけを頼りの自学自習。 本当にありがとうございました。

その他の回答 (2)

  • KG_
  • ベストアンサー率62% (34/54)
回答No.2

なんどもすみません。 >配列初期化子は配列にのみ有効 ということであれば、 Dim SMTab = ... を Dim SMTab() = ... に変更してもダメでしょうか? #検証環境が欲しい。。。

noname#140971
質問者

お礼

エラーの原因がわかりました。 厳密なオプションを宣言していたことが原因。 多分、クラスにすれば厳密でもOKかと思っています。 Option Explicit On 'Option Strict On <----------- これでエラーは回避できました! Option Compare Binary Option Infer Off ' ========================== ' 各付属の使用頻度を数える ' ========================== Module theTEST   Private Const SMMAX As Integer = 5   Private Structure SecondaryMaterial     Dim aName As String     Dim iCount As Integer   End Structure   Sub Main()     Dim I As Integer     Dim iNow As Integer     Dim iNext As Integer     Dim aLine As String     Dim SMTab() = { _       New SecondaryMaterial With {.aName = "付属1_A", .icount = 0}, _       New SecondaryMaterial With {.aName = "付属1_B", .icount = 0}, _       New SecondaryMaterial With {.aName = "付属2_A", .icount = 0}, _       New SecondaryMaterial With {.aName = "付属2_B", .icount = 0}, _       New SecondaryMaterial With {.aName = "付属3_A", .icount = 0}, _       New SecondaryMaterial With {.aName = "付属3_B", .icount = 0} _       }     Do       iNow = iNext       aLine = ReadLine("D:\Temp\MaterialList.csv", iNow, iNext)       If aLine = "" Then Continue Do       For I = 0 To SMMAX         SMTab(I).iCount += If(aLine.Contains(SMTab(I).aName), 1, 0)       Next     Loop Until iNext = -1     For I = 0 To SMMAX       Debug.Print(Printf(SMTab(I).aName & " = 000", SMTab(I).iCount.ToString, 右詰め, "0"c))     Next I   End Sub End Module さて、厳密である限り不能であれば、それはそれで構いません。 「関数での初期化を考えなさい!」みたいなMSDNの記述が最有力であることが確定するならそれで構いません。 60日余の初学者ですから余りにも無知。 そういう意味で質問に至ったわけです。 ありがとうございました。

  • KG_
  • ベストアンサー率62% (34/54)
回答No.1

参考URLの記事を見つけたのですが、VB9.0(VB2008)から使用できるようです。 下記の様なコードで出来ないでしょうか?VB2008の検証環境がないので あてずっぽうではありますが。。 ---------------------------------------- Dim sm = { SMTab With { .aname = "付属1_A", .count = 0 },       ・       ・       ・      SMTab With { .aname = "付属3_B", .count = 0 }} ---------------------------------------- #いつまでもVB2005やってる場合じゃないなぁ、、

参考URL:
http://msdn.microsoft.com/en-us/library/ms364068(VS.80).aspx#vb9overview_topic4
noname#140971
質問者

お礼

Sub Main()   Dim I As Integer   Dim iNow As Integer   Dim iNext As Integer   Dim aLine As String   Dim SMTab(SMMAX) As SecondaryMaterial   SMTab(0).aNmae = "付属1_A"   SMTab(1).aNmae = "付属1_B"   SMTab(2).aNmae = "付属2_A"   SMTab(3).aNmae = "付属2_B"   SMTab(4).aNmae = "付属3_A"   SMTab(5).aNmae = "付属3_B"   Do     iNow = iNext     aLine = ReadLine("D:\Temp\MaterialList.csv", iNow, iNext)     If aLine = "" Then Continue Do     For I = 0 To SMMAX       SMTab(I).iCount += If(aLine.Contains(SMTab(I).aNmae), 1, 0)     Next   Loop Until iNext = -1   For I = 0 To SMMAX     Debug.Print(Printf(SMTab(I).aNmae & " = 000", SMTab(I).iCount.ToString, 右詰め, "0"c))   Next I End Sub 今、書き上げたコードはこのようです。 しかし、余りにも初期化が原始的です。 Dim SMTab = { _   New SecondaryMaterial With {.Name = "付属1_A", .icount = 0}, _   New SecondaryMaterial With {.Name = "付属1_B", .icount = 0}, _   New SecondaryMaterial With {.Name = "付属2_A", .icount = 0}, _   New SecondaryMaterial With {.Name = "付属2_B", .icount = 0}, _   New SecondaryMaterial With {.Name = "付属3_A", .icount = 0}, _   New SecondaryMaterial With {.Name = "付属3_B", .icount = 0} _ } で、このやり方の類は昨日から試し続けています。 し、しかし、 >配列初期化子は配列にのみ有効! というエラーが出て原始的初期化の対案が見つかりません。 VB6.0 ではない VB2008を知って60日余のプログラマではない単なるデザイナ。 構造体で四苦八苦しています。 しかし、ご紹介のサイトでエラー自体は当然だとわかりました。 ありがとうございました。 しかし、何とかこのエラーを回避する工夫ってのがないものでしょうか? ウーンです。

関連するQ&A