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

わんくま同盟

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

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


■102870 / )  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 インデックスの数がインデックス付き配列の次元数より少ない値です。」に陥ってしまうことでしょう。
返信 編集キー/


管理者用

- Child Tree -