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

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

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

値を返さないコードパス

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

■95378 / inTopicNo.1)  値を返さないコードパス
  
□投稿者/ バンクー (1回)-(2020/07/27(Mon) 09:56:32)

分類:[C#] 

Yokogawaのオシロスコープを制御するソフトにチャレンジしてみようと思い
とりあえずマニュアルに記載されていたサンプルプログラムを書いてみたのですが
そのまま書くとエラーやメッセージが発生してしまいます。
どう書けば修正できるのでしょうか?よろしくお願いします。

環境
Windowsフォームアプリケーション
Visual Studio 2019

発生しているエラー
エラー CS0161 'Form1.ExecuteCommunicate()': 値を返さないコード パスがあります。
メッセージ IDE0051 プライベート メンバー 'Form1.ExecuteCommunicate' は使用されていません。
メッセージ IDE0059 値の 'ret' への不必要な代入
メッセージ IDE0059 値の 'buff' への不必要な代入
メッセージ IDE0059 値の 'encode' への不必要な代入
メッセージ IDE0059 値の 'list' への不必要な代入

private int ExecuteCommunicate()
{
TMCTL cTmctl = new TMCTL();

int ret = 0;
int id = 0;

DEVICELIST[] list = new DEVICELIST[10];

StringBuilder encode = new StringBuilder(100);
StringBuilder buff = new StringBuilder(256);

sbyte[] recvdata;

ret = cTmctl.Initialize(TMCTL.TM_CTL_USB, "1", ref id);

ret = cTmctl.SetTerm(id, 2, 1);
if(ret != 0)
{
return cTmctl.GetLastError(id);
}
}

引用返信 編集キー/
■95379 / inTopicNo.2)  Re[1]: 値を返さないコードパス
□投稿者/ 魔界の仮面弁士 (2787回)-(2020/07/27(Mon) 10:05:02)
2020/07/27(Mon) 10:08:22 編集(投稿者)

No95378 (バンクー さん) に返信
> エラー CS0161 'Form1.ExecuteCommunicate()': 値を返さないコード パスがあります。

今回作成されている「private int ExecuteCommunicate()」メソッドは、
int を戻り値とするようになっていますよね。それに対して、
ret ≠ 0 の際には「cTmctl.GetLastError(id)」が return されますが、
ret = 0 の際には、return が一度も呼び出されていません。なのでエラーになっています。

if ブロックの後に else を用意するなどして、ret == 0 だった場合の return 処理を記述しましょう。


> メッセージ IDE0051 プライベート メンバー 'Form1.ExecuteCommunicate' は使用されていません。
こちらは警告ですね。
作成された private メソッドが、どこからも呼ばれていないことを訝しんでいるようです。

> メッセージ IDE0059 値の 'ret' への不必要な代入
ret に最初に代入された値が、一度も利用されることなく上書きされているので、
最初の代入が不要であると警告されています。

int ret = 0;
ret = cTmctl.Initialize(TMCTL.TM_CTL_USB, "1", ref id);
ではなく、
int ret = cTmctl.Initialize(TMCTL.TM_CTL_USB, "1", ref id);
と書きましょう。
変数宣言は最初にまとめて書くのではなく、使用する箇所の直前に書くようにします。


> メッセージ IDE0059 値の 'buff' への不必要な代入
> メッセージ IDE0059 値の 'encode' への不必要な代入
> メッセージ IDE0059 値の 'list' への不必要な代入
これらは、

DEVICELIST[] list = new DEVICELIST[10];
StringBuilder encode = new StringBuilder(100);
StringBuilder buff = new StringBuilder(256);

のことを指していますが、これら 3 つの変数は、
その後一切使われていないようです。削除して良いのでは。
引用返信 編集キー/
■95381 / inTopicNo.3)  Re[2]: 値を返さないコードパス
□投稿者/ バンクー (2回)-(2020/07/27(Mon) 11:25:52)
No95379 (魔界の仮面弁士 さん) に返信
> 2020/07/27(Mon) 10:08:22 編集(投稿者)

ありがとうございます。
アドバイス通りにしたらほぼメッセージが消えました。
しかし、下記メッセージだけ消えません。

>>メッセージ IDE0059 値の 'ret' への不必要な代入
> int ret = cTmctl.Initialize(TMCTL.TM_CTL_USB, "1", ref id);

上記の通り記載しましたが同じメッセージが出てしまいます。
他に問題があるとしたらどの辺でしょうか?よろしくお願いします。



引用返信 編集キー/
■95382 / inTopicNo.4)  Re[3]: 値を返さないコードパス
□投稿者/ Hongliang (1067回)-(2020/07/27(Mon) 11:35:34)
Initializeの結果をretに代入した後、そのretは一切参照されることなくSetTermの結果によって上書きされています。
どうせ使わないのならハナから代入しなければいいのでは?という提案です。

が、おそらく正しくはInitializeの結果のretに対してエラー判定を行うべきなのではないでしょうか。
SetTerm後に行っているのと同じような判定を。
引用返信 編集キー/
■95383 / inTopicNo.5)  Re[3]: 値を返さないコードパス
□投稿者/ 魔界の仮面弁士 (2788回)-(2020/07/27(Mon) 11:41:18)
No95381 (バンクー さん) に返信
>>int ret = cTmctl.Initialize(TMCTL.TM_CTL_USB, "1", ref id);
> 上記の通り記載しましたが同じメッセージが出てしまいます。

上記のメッセージについては、おそらく

 ret = cTmctl.Initialize(TMCTL.TM_CTL_USB, "1", ref id);
 ret = cTmctl.SetTerm(id, 2, 1);
 if(ret != 0)
 {

が原因ですね。

最初の ret の中身を確認することなく、新しい値が上書きされていることが
警告の原因なので、毎回 ret の中身を確認するようにするか…

 int ret = cTmctl.Initialize(TMCTL.TM_CTL_USB, "1", ref id);
 if (ret != 0) // ここの戻り値がどうあるべきかは、別途調査してください
 {
  ret = cTmctl.SetTerm(id, 2, 1);
  if (ret != 0)
  {

あるいは、最初の値はどうせ確認しないので、読み捨てるのはどうでしょう。

 cTmctl.Initialize(TMCTL.TM_CTL_USB, "1", ref id);
 int ret = cTmctl.SetTerm(id, 2, 1);
 if (ret != 0)
 {

読み捨てるのではなく、あとで確認できるよう

 int ret1 = cTmctl.Initialize(…);
 int ret2 = cTmctl.SetTerm(…);

などとそれぞれ別の変数に受けることもできるでしょう。


なお、Initialize が失敗することがあるのか、失敗したときに
SetTerm をそのまま呼び出して良いのか、また、失敗時には
ExecuteCommunicate が何を返すべきなのか(0 なのか、-1 なのか、それとも…)は
TMCTL の通信ライブラリを持ち合わせていないので分かりません。
引用返信 編集キー/
■95384 / inTopicNo.6)  Re[4]: 値を返さないコードパス
□投稿者/ バンクー (3回)-(2020/07/27(Mon) 13:12:45)
なるほどです。とりあえずは読み捨てる事にしてみました。

魔界の仮面弁士さん、Hongliangさん
丁寧な解説ありがとうございました。理解でしました。
解決済み
引用返信 編集キー/

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


トピック内ページ移動 / << 0 >>

このトピックに書きこむ