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

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

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

構造体の演習の締めに付属リストを数えるプログラムを考えました。 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 なら軽いもんだが私にはそうではないということ。 色々と調べましたが、配列ではない構造体の初期化は見つかりました。 が、配列の初期化のアイデアというか確たる手法は見つかりませんでした。 「それは、こういう方向性でアプローチしたらよい!」 そのようなアドバイスが頂けたらありがたいと思って質問します。 宜しくお願いします。

noname#140971
noname#140971

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

  • ベストアンサー
  • 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

  • VB.NETにおける構造体の初期化

    お世話になります。VB2005を使用しています。 C言語では、以下のように変数宣言時に配列の初期化が 出来ますが、VB.NETではできないのでしょうか? typedef struct{  short a1;  short a2; } TEST; int main(void) {  // ここのところをVBで実現したいです  TEST stTest[] = {{0, 10}, {1, 10}};  return 0; }

  • 配列を含んだ構造体への値設定について教えて下さい。

    配列を含んだ構造体への値設定について教えて下さい。 下記のような構造体の定義があります。 typedef struct A_T { UINT64 a1; UINT32 a2; } A_t; typedef struct B_T { UINT32 b1; A_t b[8]; } B_t; 構造体B_tを関数の引数で渡し、A_tのa1とa2に値を設定したいのですが、プログラミング初心者の為、どのように作ればよいのかわかりません。 どうぞ教えて下さい。

  • 構造体配列の一部初期化!!!

    はじめまして@ 今、下のような構造体があるとします。 ----------------------------------------------- Type TableColumn  sName As String  sKana As String End Type Type a_2  C(100) as TableColumn End Type Type a_1  B(3) as a_2 End Type global A(5) as a_1 ----------------------------------------------- ちなみに図で表すとこんな感じです。 A(5) |-B(3)  |-C(100)   |-sName   |-sKana このとき、この構造体の配列を初期化するときは普通でしたら、  Erase A とやることによってすべての配列の中身が初期化されると思うのですが、 今回は一部を消去したいのです。 たとえば、A(0).B(0)以下の中身は初期化しないで、A(0).B(1)以下は初期化する、といった感じです。 何か良い方法がありましたらぜひご教授お願いいたします。 よろしくお願いします。

  • 動的に作成した構造体配列の中に、さらに動的に構造体配列を作るには?

    はじめまして。 この度、ちょっとした計算プログラムを作ることになったのですが、 タイトルにもありますように、 『動的に作成した構造体配列の中に、さらに動的に構造体配列を作る』 方法がわからずに困っています。 実際には下記のようにプログラムしたいのですが... ------------------------------------------------- 'a'の構造体の中に作られる'b'の配列数は、下記のように 'a'の配列の番号により違い、また'a'の配列数も最初の段階では未定です。 構造体'a'←配列数未定 構造体'b'←配列数未定 a[0]-----b[0]  |    b[1]  |    b[2]  | a[1]-----b[0]  |    b[1]  | a[2]-----b[0]  |    b[1]  .    b[2]  .    b[3]  . ------------------------------------------------- new演算子で'a'の配列は作れたのですが、その中の'b'の数の分だけ 配列を動的に作成する方法がわかりませんでした。 最初は'b'の配列を多めに取って計算すればよいと思っていましたが、 計算過程で'b'の配列数が10000を越えてしまう場合があり、 また'b'の構造体のサイズも大きめなので、断念せざるをえませんでした。 どなたか、このように配列を作成する方法を知っている方がいましたら、 是非教えていただきたいです。 下手な説明ですいません。

  • 動的な構造体配列の初期化

    以下のように構造体を new で動的に確保したときに 構造体の中身(char bbb[10], int ccc)をゼロで初期化したいのですが ZeroMemory を使用するとCArrayのAdd()を使用したときにエラーになってしまいました。 何かよい方法がありましたら教えて下さい。お願いいたします。 # 簡単にイメージですが・・・ typedef struct { CString a; CString b; }aaa_t ; struct s_aaa{ char bbb[10]; int ccc; CArray<aaa_t,aaa_t> m_aaaArray ; } s_aaa *StructB; StructB = new s_aaa [10];

  • VB6でやると構造体の配列になる変数をVB2008では何で作ればいいか

    VB6でプログラムを作っていたときは 値のセットが配列になるとき 構造体を動的配列で宣言してデータを足して作りました。 VB2008で開発をすることになり 同じようなことをしたいのですが もっと便利なやり方が登場したりするのでしょうか? クラスで挑戦したのですが動的配列はできないようでした。

  • データ数の多い構造体配列について

    visual c++で配列をメンバーに持つ構造体配列を定義したいと思っています。 しかし、以下のように定義してもプログラムが実行されません。 配列の容量が大きいのかもしれませんが、 大量のデータを扱いたいので容量を小さくはしたくありません。 大量のデータを扱うのに何かいい方法はないでしょうか。 struct X { double A[1000]; }; : : : struct X B[10000];

  • 構造体での2次元配列の宣言について

    構造体で2次元配列を初期化したいのですがうまくいきません。どうすればいいでしょうか? #include<stdio.h> struct student{ long gakusekino; char name[20]; char clas[5]; long age; }seito[10] = {2004001,"Aクン","sskk",20},        {2004001,"Bクン","ssdd",20}; /*下記はコンパイルが成功する例ですが上記の記述がうまくいかないしだいです。 struct student seito[10] = { {2004001,"Aクン","sskk",20},   {2004001,"Bクン","ssdd",20}; };

  • ポインタを使って構造体の配列を戻り値にするには

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 a0 = 2 a1 = 4198512 a2 = 4329332 と表示されてしまいa1,a2がうまくゆきません。 ********************************************* #include<stdio.h> struct test{ int a; }; struct test *func(void); void main(void) { struct test *data;//構造体ポインタ int i; data = func(); //ポインタにtest関数の戻り値(アドレス)を代入 for(i=0;i<=2;i++){   printf("a%d = %d\n",i,(data+i)->a); //構造体要素を表示 } } struct test *func(void) { struct test data[3]={1,2,3}; //構造体配列を定義 return (&data[0]); //構造体配列の先頭アドレスを返す } ************************************************* test関数から受ける取ったアドレス(&data[0])をポインタ(data)に代入して1づつずらして表示させれば a0=1,a1=2,a=3 となると思ったのですがどこが間違っているのでしょうか? よろしくお願いします。

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

専門家に質問してみよう