C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

このエラーを解消したいです。

[トピック内 29 記事 (1 - 20 表示)]  << 0 | 1 >>

■102868 / inTopicNo.1)  このエラーを解消したいです。
  
□投稿者/ みか (1回)-(2024/01/18(Thu) 23:40:41)

分類:[VB.NET/VB2005 以降] 

Dim y() As Double
Dim N As Integer = 5
Dim M As Integer = 2
Dim result As Double

  result = SGFilter(y(), N, M) 'resultに「エラーBC30188宣言が必要です。」が出ます。

Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
End Function
引用返信 編集キー/
■102869 / inTopicNo.2)  Re[1]: このエラーを解消したいです。
□投稿者/ くま (22回)-(2024/01/19(Fri) 01:24:06)
No102868 (みか さん) に返信
> Dim result As Double
> 
>   result = SGFilter(y(), N, M) 'resultに「エラーBC30188宣言が必要です。」が出ます。
> 
> Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()

落ち着いて見てみましょう。
resultでエラーになっているので、関数「SGFilter」の戻り値の問題ですよね?
関数「SGFilter」の戻り値は「Double()」配列指定ですね。
受け取る側の変数resultは「Double」単一指定ですね。
どちらかに揃えてあげましょう。

参考までに
http://hachisue.blog65.fc2.com/blog-entry-170.html

引用返信 編集キー/
■102870 / inTopicNo.3)  Re[2]: このエラーを解消したいです。
□投稿者/ 魔界の仮面弁士 (3746回)-(2024/01/19(Fri) 08:04:19)
No102869 (くま さん) に返信
> ■No102868 (みか さん) に返信
> resultでエラーになっているので、関数「SGFilter」の戻り値の問題ですよね?
> 関数「SGFilter」の戻り値は「Double()」配列指定ですね。
> 受け取る側の変数resultは「Double」単一指定ですね。
> どちらかに揃えてあげましょう。

うーん。確かにそれもあるんですが、今回の本質は、もっと根本的なミスに見えます。


現在のエラー「BC30188 宣言が必要です。」が生じるケースというのは、
SGFilter の呼び出し処理を、メソッドの外側で行おうとしているような場合です。
つまり、Module や Class の直下に記述されている状況ですね。


エラー BC30188 が示す「宣言」というのは、SGFilter の呼び出しが、
変数宣言と同時に(変数の初期化子として)受け渡そうとしている構文とみなされるものの、
その行の result が変数宣言の形式になっていないという事を意味します。

Module や Class の直下で呼び出すのであれば、「Dim result As Double」の行は削って、
その後に書かれた
 result = SGFilter(……)
の部分を、
 Private result As Double() = SGFilter(……)
あるいは
 Dim result As Double() = SGFilter(……)
といった記法にすることが要求されます。


ただしおそらくは、そもそもメソッドの外側で呼び出そうとしていること自体が実装ミスでしょう。
今回のケースでは、result = SGFilter(……) な呼び出しを、何らかのメソッドの中に移動させるべきです。
――たとえば Sub Main() や Sub Button1_Click(sender As Object, e As EventArgs) の中に。

※ちなみに、Module や Class の外側に書いた場合は、別のエラー(BC30689)になります。

https://learn.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/error-messages/declaration-expected
https://learn.microsoft.com/ja-jp/dotnet/visual-basic/misc/bc30689


そして、呼び出し部をメソッド内に移動したとしても、くまさんが指摘された点を直さないと、
「BC30311 型 'Double()' の値を 'Double' に変換できません。」になってしまいます。


さらに加えて、元のコードにはもうひとつ文法違反があります。
このケースでは、
 result = SGFilter(y(), N, M)
ではなく、
 result = SGFilter(y, N, M)
と書かねばならない、ということです。前者のままだと、result を Double() 型にしたとしても、
「BC30105 インデックスの数がインデックス付き配列の次元数より少ない値です。」に陥ってしまうことでしょう。
引用返信 編集キー/
■102875 / inTopicNo.4)  Re[3]: このエラーを解消したいです。
□投稿者/ みか (2回)-(2024/01/19(Fri) 23:21:12)
2024/01/20(Sat) 22:15:44 編集(投稿者)
No102869 (くま さん) に返信
■No102870 (魔界の仮面弁士 さん) に返信

あちこちから引っ張って来てつくりました。
何も分かっていません。
身の程知らずですみません。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim y() As Double            'データが入る配列
        Dim N As Integer = 5
        Dim M As Integer = 2
        Dim result As Double
        result = SGFilter(y(), N, M)
    End Sub

    Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
        Dim i As Integer, j As Integer, k As Integer
        Dim w(0 To N, 0 To M) As Double
        Dim sum As Double
        Dim y2() As Double

        ReDim y2(0 To UBound(y))

        For i = 0 To UBound(y)
            sum = 0
            For j = -N To N
                For k = 0 To M
                    w(N + j, k) = ((j + k) ^ (2 * M))
                Next k
                sum = sum + w(N + j, 0)
            Next j
            For j = -N To N
                For k = 0 To M
                    w(N + j, k) = w(N + j, k) / sum
                Next k
            Next j
            For j = -N To N
                sum = 0
                For k = 0 To M
                    sum = sum + w(N + j, k) * y(i + j)
                Next k
                y2(i) = y2(i) + sum
            Next j
        Next i
        SGFilter = y2
    End Function


引用返信 編集キー/
■102876 / inTopicNo.5)  Re[4]: このエラーを解消したいです。
□投稿者/ shu (1回)-(2024/01/21(Sun) 19:49:31)
>
> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
> Dim y() As Double       'データが入る配列
> Dim N As Integer = 5
> Dim M As Integer = 2
> Dim result As Double


ここまでにyの配列に値を設定する処理が入る?

> result = SGFilter(y(), N, M)
result = SGFilter(y, N, M) ※既出の回答通り多分これ

> End Sub
>
> Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
> Dim i As Integer, j As Integer, k As Integer
> Dim w(0 To N, 0 To M) As Double
> Dim sum As Double
> Dim y2() As Double
>
> ReDim y2(0 To UBound(y))
下でいきなり足し算を行っているでのy2の中身を初期化する処理があった方がよい

>
> For i = 0 To UBound(y)
> sum = 0
> For j = -N To N
> For k = 0 To M
> w(N + j, k) = ((j + k) ^ (2 * M))
> Next k
> sum = sum + w(N + j, 0)
> Next j
> For j = -N To N
> For k = 0 To M
> w(N + j, k) = w(N + j, k) / sum
> Next k
> Next j
※1
> For j = -N To N
> sum = 0
y2(i)がこのループで変動しない為※1に移動した方がよい

> For k = 0 To M
> sum = sum + w(N + j, k) * y(i + j)
※i+jがyのインデックス最大値を超える為エラーとなる。ifなどでインデックスチェックが必要

> Next k
> y2(i) = y2(i) + sum
y2(i)がこのループで変動しない為※2に移動した方がよい

> Next j
※2

> Next i
> SGFilter = y2
> End Function
>
>
引用返信 編集キー/
■102879 / inTopicNo.6)  Re[4]: このエラーを解消したいです。
□投稿者/ kiku (398回)-(2024/01/22(Mon) 15:10:45)
No102875 (みか さん) に返信
> 2024/01/20(Sat) 22:15:44 編集(投稿者)
>
> ■No102869 (くま さん) に返信
> ■No102870 (魔界の仮面弁士 さん) に返信
>
> あちこちから引っ張って来てつくりました。
> 何も分かっていません。
> 身の程知らずですみません。
>
> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
> Dim y() As Double       'データが入る配列
> Dim N As Integer = 5
> Dim M As Integer = 2
> Dim result As Double
> result = SGFilter(y(), N, M)
> End Sub
>
> Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
> Dim i As Integer, j As Integer, k As Integer
> Dim w(0 To N, 0 To M) As Double
> Dim sum As Double
> Dim y2() As Double
>
> ReDim y2(0 To UBound(y))
>
> For i = 0 To UBound(y)
> sum = 0
> For j = -N To N
> For k = 0 To M
> w(N + j, k) = ((j + k) ^ (2 * M))
> Next k
> sum = sum + w(N + j, 0)
> Next j
> For j = -N To N
> For k = 0 To M
> w(N + j, k) = w(N + j, k) / sum
> Next k
> Next j
> For j = -N To N
> sum = 0
> For k = 0 To M
> sum = sum + w(N + j, k) * y(i + j)
> Next k
> y2(i) = y2(i) + sum
> Next j
> Next i
> SGFilter = y2
> End Function

上記ソースの実現したい機能はなんだろうと考え、
勝手な想像ですが、たぶん「Savitzky-Golay法による平滑化」を
行いたいのではないかと思いました。

上記ソースと一致しているかどうかは検証はしていませんが、
下記が計算式に参考にしているサイトではないでしょうか?
https://chaos-kiyono.hatenablog.com/entry/2022/08/19/004312

この推測はあっていますでしょうか?
引用返信 編集キー/
■102880 / inTopicNo.7)  Re[5]: このエラーを解消したいです。
□投稿者/ kiku (399回)-(2024/01/22(Mon) 15:44:07)
No102879 (kiku さん) に返信
> ■No102875 (みか さん) に返信
>>2024/01/20(Sat) 22:15:44 編集(投稿者)
>>
>>■No102869 (くま さん) に返信
>>■No102870 (魔界の仮面弁士 さん) に返信
>>
>>あちこちから引っ張って来てつくりました。
>>何も分かっていません。
>>身の程知らずですみません。
> 上記ソースの実現したい機能はなんだろうと考え、
> 勝手な想像ですが、たぶん「Savitzky-Golay法による平滑化」を
> 行いたいのではないかと思いました。
>
> 上記ソースと一致しているかどうかは検証はしていませんが、
> 下記が計算式に参考にしているサイトではないでしょうか?
> https://chaos-kiyono.hatenablog.com/entry/2022/08/19/004312
>
> この推測はあっていますでしょうか?
重み係数の計算方法が、ソースと一致していないようなので
違うみたいですね。
どんな計算式を実現したいのかをここに書いて頂ければ
回答が付きそうです。
引用返信 編集キー/
■102885 / inTopicNo.8)  Re[6]: このエラーを解消したいです。
□投稿者/ みか (3回)-(2024/01/23(Tue) 18:34:01)
No102880 (kiku さん) に返信
1年以上前のものです。
あやふやなとこもありますが、はい、たぶんあってる思います。
計算式も分かっていません。
ここがあるのを知って、もしかしてと思いました。
すみません。

引用返信 編集キー/
■102887 / inTopicNo.9)  Re[7]: このエラーを解消したいです。
□投稿者/ kiku (400回)-(2024/01/24(Wed) 10:20:18)
No102885 (みか さん) に返信
> ■No102880 (kiku さん) に返信
> 1年以上前のものです。
> あやふやなとこもありますが、はい、たぶんあってる思います。
> 計算式も分かっていません。
> ここがあるのを知って、もしかしてと思いました。
> すみません。

計算式がわかっていないとはびっくりです。
仮に表題にあるようにエラーが解消されたとしても
そのエラー解消方法が間違っていた場合
計算結果が違う結果になることも充分に考えられると思うのですが、
大丈夫なのでしょうか?
心配です。
やはり、どんな結果を得たいのかは明確にするべきと思います。
引用返信 編集キー/
■102891 / inTopicNo.10)  Re[8]: このエラーを解消したいです。
□投稿者/ みか (4回)-(2024/01/25(Thu) 23:30:58)
No102887 (kiku さん) に返信

結果に何が出てくるかも分かっていません。
でもとにかく動かしてみたかったのです。
そこでまた考えるという安易なものでした。



引用返信 編集キー/
■102892 / inTopicNo.11)  Re[9]: このエラーを解消したいです。
□投稿者/ kiku (402回)-(2024/01/26(Fri) 08:39:53)
No102891 (みか さん) に返信
> ■No102887 (kiku さん) に返信
>
> 結果に何が出てくるかも分かっていません。
> でもとにかく動かしてみたかったのです。
> そこでまた考えるという安易なものでした。

とにかく動かしたいということなら
すでにshuさんから回答がある下記を参照すると良いと思います。
No102876 (shu さん)

引用返信 編集キー/
■102900 / inTopicNo.12)  Re[10]: このエラーを解消したいです。
□投稿者/ みか (5回)-(2024/01/26(Fri) 21:15:39)
No102892 (kiku さん) に返信
No102876 (shu さん) に返信

はい、とにかく動かしたいとはあります。
でもこのどちらにでもエラーが出てもしまうのです。

> result = SGFilter(y, N, M) ※既出の回答通り多分これ
result = SGFilter(y(), N, M)

引用返信 編集キー/
■102904 / inTopicNo.13)  Re[11]: このエラーを解消したいです。
□投稿者/ kiku (404回)-(2024/01/29(Mon) 08:47:26)
No102900 (みか さん) に返信
> ■No102892 (kiku さん) に返信
> ■No102876 (shu さん) に返信
>
> はい、とにかく動かしたいとはあります。
> でもこのどちらにでもエラーが出てもしまうのです。
>
>>result = SGFilter(y, N, M) ※既出の回答通り多分これ
> result = SGFilter(y(), N, M)

すみません。
当方、C#ならすぐに回答できるのですが、VB.NETだと回答できません。
他の方の回答を待ってください。
引用返信 編集キー/
■102905 / inTopicNo.14)  Re[12]: このエラーを解消したいです。
□投稿者/ kiku (405回)-(2024/01/29(Mon) 13:18:05)
No102904 (kiku さん) に返信
> ■No102900 (みか さん) に返信
>>■No102892 (kiku さん) に返信
>>■No102876 (shu さん) に返信
>>
>>はい、とにかく動かしたいとはあります。
>>でもこのどちらにでもエラーが出てもしまうのです。
>>
> >>result = SGFilter(y, N, M) ※既出の回答通り多分これ
>>result = SGFilter(y(), N, M)
>
> すみません。
> 当方、C#ならすぐに回答できるのですが、VB.NETだと回答できません。
> 他の方の回答を待ってください。

回答が付かない原因は、新しい情報をご提供頂けていないことが原因だと思います。

ソースを改変して実験してダメであるならば、
下記を提示しましょう。
・経変したソース
  ・全部提示していないように感じます。yに値を設定しているはず。
  ・どこをどのように変更したのか?
・どこでエラーになったのか?
・どんなエラーが出たのか?

引用返信 編集キー/
■102918 / inTopicNo.15)  Re[1]: このエラーを解消したいです。
□投稿者/ みか (6回)-(2024/02/01(Thu) 21:08:59)
皆さん、ありがとうございます。
どこへ書いていいのか分かりませんのでここにさせて頂きます。

Next k の部分で「インデックスが配列の境界外です。」が出るのは、どこかに矛盾があるのですよね?

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim y8(0 To 100) As Double
        For i = 0 To 100
            y8(i) = i
        Next

        Dim N As Integer = 5
        Dim M As Integer = 2
        Dim result() As Double
        result = SGFilter(y8, N, M)
    End Sub

    Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
        Dim i As Integer, j As Integer, k As Integer
        Dim w(0 To N, 0 To M) As Double
        Dim sum As Double
        Dim y2() As Double

        ReDim y2(0 To UBound(y))

        For i = 0 To UBound(y)
            sum = 0
            For j = -N To N
                For k = 0 To M
                    w(N + j, k) = ((j + k) ^ (2 * M))
                Next k                       ' ※ インデックスが配列の境界外です。
                sum = sum + w(N + j, 0)
            Next j
        Next i
        SGFilter = y2
    End Function

引用返信 編集キー/
■102919 / inTopicNo.16)  Re[2]: このエラーを解消したいです。
□投稿者/ ビール呑み (3回)-(2024/02/02(Fri) 03:42:10)
「Next k」で出ますか?
「w(N + j, k) = ((j + k) ^ (2 * M))」で出るのであればわかるのですが

Dim w(0 To N,[後略]
For j = -N To N
  w(N + j, [後略]

明らかにインデックスが範囲外ですね

引用返信 編集キー/
■102920 / inTopicNo.17)  Re[2]: このエラーを解消したいです。
□投稿者/ kiku (407回)-(2024/02/02(Fri) 10:22:33)
No102918 (みか さん) に返信
> 皆さん、ありがとうございます。
> どこへ書いていいのか分かりませんのでここにさせて頂きます。
>
> Next k の部分で「インデックスが配列の境界外です。」が出るのは、どこかに矛盾があるのですよね?
>
> Dim w(0 To N, 0 To M) As Double

エラーを解消するだけでしたら、
下記に変更すれば良いと思います。
Dim w(0 To 2 * N, 0 To M) As Double

引用返信 編集キー/
■102921 / inTopicNo.18)  Re[3]: このエラーを解消したいです。
□投稿者/ みか (7回)-(2024/02/02(Fri) 20:08:57)
No102919 (ビール呑み さん) に返信
> 「Next k」で出ますか?

> 明らかにインデックスが範囲外ですね
仮にそうとしても、このようなので「Next k」に「インデックスが配列の境界外です。」が出ることはあるのでしょうか?
引用返信 編集キー/
■102922 / inTopicNo.19)  Re[3]: このエラーを解消したいです。
□投稿者/ みか (8回)-(2024/02/02(Fri) 20:39:35)
2024/02/02(Fri) 20:41:44 編集(投稿者)
No102920 (kiku さん) に返信

> エラーを解消するだけでしたら、
> 下記に変更すれば良いと思います。
> Dim w(0 To 2 * N, 0 To M) As Double

小出しですみません。
Copilotで聞いても中々解消しないとこもあります。
SGFilter関数でSavitzky-Golayフィルターを適用し、入力配列 y8 を平滑化し結果を返すものでした。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim y8(0 To 100) As Double
        For i = 0 To 100
            y8(i) = i
        Next

        Dim N As Integer = 5
        Dim M As Integer = 2
        Dim result() As Double
        result = SGFilter(y8, N, M)
    End Sub

    Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
        Dim i As Integer, j As Integer, k As Integer
        Dim w(0 To 2 * N, 0 To M) As Double      'Dim w(0 To N, 0 To M) As Double
        Dim sum As Double
        Dim y2() As Double

        ReDim y2(0 To UBound(y))

        For i = 0 To UBound(y)
            sum = 0
            For j = -N To N
                For k = 0 To M
                    w(N + j, k) = ((j + k) ^ (2 * M))
                Next k     ' ※ ここので「インデックスが配列の境界外です。」は解消しました。
                sum = sum + w(N + j, 0)
            Next j

            For j = -N To N
                For k = 0 To M
                    w(N + j, k) = w(N + j, k) / sum
                Next k
            Next j
            For j = -N To N
                sum = 0
                For k = 0 To M
                    sum = sum + w(N + j, k) * y(i + j)     ' ※ 今度はここに「インデックスが配列の境界外です。」
                Next k
                y2(i) = y2(i) + sum
            Next j
        Next i
        SGFilter = y2
    End Function



引用返信 編集キー/
■102923 / inTopicNo.20)  Re[4]: このエラーを解消したいです。
 
□投稿者/ ビール呑み (4回)-(2024/02/02(Fri) 21:29:51)
2024/02/02(Fri) 21:43:22 編集(投稿者)
※用語が間違っていたかもしれないので修正

> sum = sum + w(N + j, k) * y(i + j)     ' ※ 今度はここに「インデックスが配列の境界外です。」

でしょうね
「For i = 0 To UBound(y)」としているのですから、yのインデックスに「i + j」を指定したら範囲外になるはずです

みかさんは、yのインデックスには何を指定したらいいと思いますか?

引用返信 編集キー/

このトピックをツリーで一括表示

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -