- ベストアンサー
構造体の配列の初期化の方向性にアドバイスを!
- 構造体の配列の初期化について、VB2008での実装方法を知りたいです。
- 構造体の配列の初期化についてのアドバイスをお願いします。
- VB2008で配列の初期化を行う際のベストプラクティスについて教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
解決したようでなによりです。 Dim SMTab As SecondaryMaterial() = {... もしくは Dim SMTab As New SecondaryMaterial() = {... で、Strict ON でもOKな気がします。 ご参考までに。
その他の回答 (2)
- KG_
- ベストアンサー率62% (34/54)
なんどもすみません。 >配列初期化子は配列にのみ有効 ということであれば、 Dim SMTab = ... を Dim SMTab() = ... に変更してもダメでしょうか? #検証環境が欲しい。。。
お礼
エラーの原因がわかりました。 厳密なオプションを宣言していたことが原因。 多分、クラスにすれば厳密でも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)
参考URLの記事を見つけたのですが、VB9.0(VB2008)から使用できるようです。 下記の様なコードで出来ないでしょうか?VB2008の検証環境がないので あてずっぽうではありますが。。 ---------------------------------------- Dim sm = { SMTab With { .aname = "付属1_A", .count = 0 }, ・ ・ ・ SMTab With { .aname = "付属3_B", .count = 0 }} ---------------------------------------- #いつまでもVB2005やってる場合じゃないなぁ、、
お礼
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日余のプログラマではない単なるデザイナ。 構造体で四苦八苦しています。 しかし、ご紹介のサイトでエラー自体は当然だとわかりました。 ありがとうございました。 しかし、何とかこのエラーを回避する工夫ってのがないものでしょうか? ウーンです。
お礼
本当に出来ました! これで、無事に先に進めます。 入門書も入門サイトも見ないでOKWaveだけを頼りの自学自習。 本当にありがとうございました。