構造体と多次元配列について


F  2007-02-16 22:28:24  No: 135314

お世話になります
構造体内に多次元配列の構造体を持たせたらエラーが出てしまっていて
色々調べてはいるのですが、こういう事例が見つからないため質問します

テストソース

'* テスト構造体1
Type a1
    bbb      As Integer
    ccc()    As Byte
    ddd()    As Long
End Type

'* テスト構造体2
Type a2
    AAA(1 To 5, 1 To 5) As a1
End Type

Public qqq(1 To 10) As a2

Private Sub ts()
    qqq(1).AAA(1,1).bbb=1
End Sub

という風に、
qqq(1).AAA(1,1).bbb  と使いたいのですが、
「メソッドまたはデータメンバが見つかりません」
とエラーが出てしまいます。

ここで、
Type a2
    AAA(1 To 5) As a1
End Type

と、配列の次元を変えてみたところ、問題なく使用することができました

ここで、a2 という構造体に多次元配列を持たすことができないのか?
という疑問が発生したのですが、”使える”とも”使えない”とも書いてある記事が見つかりませんでした

私の試したとおり、使えないのがVBの仕様なのか?それとも私の書き方がおかしいのか?

ご教授お願いします。


F  2007-02-16 22:29:51  No: 135315

環境忘れました。

winXP pro 
vb6 sp5 
です。


魔界の仮面弁士  2007-02-16 22:50:36  No: 135316

>     qqq(1).AAA(1,1).bbb=1
(中略)
> qqq(1).AAA(1,1).bbb  と使いたいのですが、
> 「メソッドまたはデータメンバが見つかりません」
> とエラーが出てしまいます。

提示されたコードそのままで、エラーもなく「1」が代入されましたけど…?

'--- 標準モジュールのみで、フォームの無いプロジェクトを用意して実験。
Option Explicit

Type a1
    bbb      As Integer
    ccc()    As Byte
    ddd()    As Long
End Type

Type a2
    AAA(1 To 5, 1 To 5) As a1
End Type

Public qqq(1 To 10) As a2

Private Sub ts()
    qqq(1).AAA(1, 1).bbb = 1
End Sub

Private Sub Main()
    Call ts
    MsgBox "完了"
End Sub

> それとも私の書き方がおかしいのか?
単に、変数のスコープが間違っていた、という事はありませんか?
すべてのコードに、"Option Explicit" を付けてあるかどうかをチェックしてみてください。


F  2007-02-16 23:16:54  No: 135317

>魔界の仮面弁士様
早速のお返事ありがとうございます

すみません、上記コードだとエラー出ませんね。
エラー出ているのは私が、書いているほうのソースです。
が、構造は一緒なのでなぜエラーが出るか模索している最中なのです

不思議なのは、
qqq(1).AAA(1, 1).
ここでインテリセンスが効かないのと、
qqq(1).AAA(1, 1).bbb 
のbbb でShift+F2で定義の確認ができないことです。

先ほど言いました通り、構造は一緒なので書き始めた頃はエラーが発生していませんでした。
インテリセンスは効いていなかった覚えがあります

今日突然エラーを出してきたので、その原因を突き詰めている状態です

うっかり変数がダブっていないかとか、スコープが間違っていないかとか
色々調べている最中なのです。

Option Explicitは付けています。

考えられる可能性として、ここはこういう風にしてる?とか調べる事項でもありましたら
ご教授ください

よろしくお願いします


魔界の仮面弁士  2007-02-16 23:33:22  No: 135318

> うっかり変数がダブっていないかとか、スコープが間違っていないかとか

あるいは、型名の重複はありませんか?
それと、最近追加したコントロールや参照設定が無いか、とか。

> 調べる事項でもありましたら

Type a2
    AAA(1 To 5, 1 To 5) As Project1.Module1.a1
End Type

Public qqq(1 To 10) As Project1.Module1.a1

のように、型名をフルネームで指定してみてはどうでしょう?


F  2007-02-16 23:43:39  No: 135319

>のように、型名をフルネームで指定してみてはどうでしょう?
試してみましたが、エラーは消えません。
shift+f2の定義の参照もできません

>あるいは、型名の重複はありませんか?
現在、それを調べています。Grepで一気に調べてみます

>それと、最近追加したコントロールや参照設定が無いか、とか。
最近コントロール等は追加していないので、(昨日までエラーなし、今日突然発生)
多分大丈夫かと思いますが、これも確認してみます

a1のメンバに対してインテリセンス等が効かないのが個人的に??なのですが?


魔界の仮面弁士  2007-02-17 01:00:43  No: 135320

> a1のメンバに対してインテリセンス等が効かないのが個人的に??なのですが?
現象を再現できない以上、お役に立てそうもありませんが、実行時に
ローカルウィンドウやウォッチ式を用いて、それぞれの変数の
型や内容を調べてみたりとか。

> 最近コントロール等は追加していないので
あとは、内部予約語を使ってしまい、VB が誤動作している可能性とか…。

# たとえば、フォームに LockControls という名前のメソッドや
# 変数などを追加していたりとか。

> (昨日までエラーなし、今日突然発生)
Visual SourceSafe 等をお使いであれば、昨日以前のソースコードを
取得して、それらを確認・比較してみるとか。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加