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

構造体の演習の締めに付属リストを数えるプログラムを考えました。

D:\Temp\SecondaryMaterialList.csv

品番001, 付属1_A, 付属2_A, 付属3_A
品番002, 付属1_A, 付属2_B, 付属3_A
品番003, 付属1_B, 付属2_A, 付属3_A
品番004, 付属1_B, 付属2_A, 付属3_B
品番005, 付属1_A, 付属2_B, 付属3_B

struct SecondaryMaterial {
  char *aname;
  int count;
} SMTab[] = {
 "付属1_A", 0,
 "付属1_B", 0,
 "付属2_A", 0,
 "付属2_B", 0,
 "付属3_A", 0,
 "付属3_B", 0
};

これ位は、VB.Net なら軽いもんだろうと思って色々と構造体の配列の初期化にアタック。
しかし、ことごとく失敗。
多分、VB.Net なら軽いもんだが私にはそうではないということ。

色々と調べましたが、配列ではない構造体の初期化は見つかりました。
が、配列の初期化のアイデアというか確たる手法は見つかりませんでした。

「それは、こういう方向性でアプローチしたらよい!」

そのようなアドバイスが頂けたらありがたいと思って質問します。
宜しくお願いします。

A 回答 (3件)

解決したようでなによりです。



Dim SMTab As SecondaryMaterial() = {...
もしくは
Dim SMTab As New SecondaryMaterial() = {...
で、Strict ON でもOKな気がします。

ご参考までに。
    • good
    • 0
この回答へのお礼

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

本当にありがとうございました。

お礼日時:2009/03/20 16:05

なんどもすみません。


>配列初期化子は配列にのみ有効
ということであれば、

Dim SMTab = ...



Dim SMTab() = ...

に変更してもダメでしょうか?

#検証環境が欲しい。。。
    • good
    • 0
この回答へのお礼

エラーの原因がわかりました。
厳密なオプションを宣言していたことが原因。
多分、クラスにすれば厳密でも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日余の初学者ですから余りにも無知。
そういう意味で質問に至ったわけです。

ありがとうございました。

お礼日時:2009/03/20 15:35

参考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 …
    • good
    • 0
この回答へのお礼

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日余のプログラマではない単なるデザイナ。
構造体で四苦八苦しています。

しかし、ご紹介のサイトでエラー自体は当然だとわかりました。

ありがとうございました。

しかし、何とかこのエラーを回避する工夫ってのがないものでしょうか?
ウーンです。

お礼日時:2009/03/20 11:30

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