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

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

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

Re[7]: データがスペースだった場合の分岐処理(C#)


(過去ログ 25 を表示中)

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

■11356 / inTopicNo.1)  データがスペースだった場合の分岐処理(C#)
  
□投稿者/ nobu (1回)-(2007/12/12(Wed) 18:04:34)

分類:[.NET 全般] 

はじめましてこんにちは
以下のよう処理でうまくできずに悩んでおります

取得した文字aが半角スペースまたは全角スペースだった場合は
処理を値をAとする。それ以外はBとする
以下の構文を流してもすべてBに処理が行ってしまいます
何が問題なのでしょうか・・・・
ご教授の程、よろしくお願い致します


構文

string a = " ";//半角スペース
string atai;

if( a == " " ) //半角スペース比較
{
   atai  = "A";
}
if( a == " " ) //全角スペース比較
{
   atai  = "A";
}

if (System.Char.IsWhiteSpace(a,0)) //全角半角スペース判断

{
atai = "A";
}

else
{
   atai  = "B"

{



引用返信 編集キー/
■11357 / inTopicNo.2)  Re[1]: データがスペースだった場合の分岐処理(C#)
□投稿者/ ぽぴ王子 (302回)-(2007/12/12(Wed) 18:16:40)
ぽぴ王子 さんの Web サイト
No11356 (nobu さん) に返信

まず、IsWhiteSpace を使っているので前半部分は要りませんね。
あと最低限そのままコピーしてコンパイル・実行できるコードがあるといいです。
ちょっと見た限り、このコードはそのままコピーしても動かないと思われます。

で、動かなそうだったので同じようなコードを書いて検証してみましたが
半角スペース、全角スペースともに "A" になりました。

a の値が本当にスペースなのか、また元のコードにほかにおかしな点は
ないか、などを調べてみるといいと思います。
引用返信 編集キー/
■11363 / inTopicNo.3)  Re[2]: データがスペースだった場合の分岐処理(C#)
□投稿者/ Ruku (10回)-(2007/12/12(Wed) 19:53:33)
最後の { を } にして、抜けているおよび全角になっているセミコロンを直すだけで動きました。
ちゃんと結果が "A" になっています。

提示ソース (のコンパイル通るもの) を自分の環境で動かしてみました?
引用返信 編集キー/
■11389 / inTopicNo.4)  Re[3]: データがスペースだった場合の分岐処理(C#)
□投稿者/ nobu (2回)-(2007/12/13(Thu) 09:53:43)
2007/12/13(Thu) 10:03:27 編集(投稿者)
2007/12/13(Thu) 10:03:12 編集(投稿者)

ぽぴ王子さま・Rukuさま
ご指摘ありがとうございます

>まず、IsWhiteSpace を使っているので前半部分は要りませんね。
>あと最低限そのままコピーしてコンパイル・実行できるコードがあるといいです。
実際に動いているコードを上げてみます
全角・半角どちらの空白も1となります

//msgはCSVデータをタブ区切りで取得したクラス・戻り値をdbに返すクラスどちらもpublic class
//すべてstringで宣言されている

private bool getData(Message msg, ref DBReg db){ {

if( msg.data == "test" )
{
db.KBN = "2";

}
else
{

   if (msg.data.Length == 0 || (System.Char.IsWhiteSpace(msg.m_data,0)) )//全角半角スペース判断

   {
 db.KBN = "2";
   }
   else
   {
 db.KBN = "1";

   }

}
}

>提示ソース (のコンパイル通るもの) を自分の環境で動かしてみました?
テストとして、簡易で別プログラムを作成し、動作確認をしてみました。
こちらでは正しく判断できているようです・・・・
ローカルで動かして問題なく動作したコード
//テキストボックスtextBox1に値を入力し、button1をクリックしたときに走る処理
private void button1_Click(object sender, System.EventArgs e)
{
if( this.textBox1.Text.ToString() == "test" )
{
this.textBox1.Text = "2";
}
else
{
if (this.textBox1.Text.Length == 0 || (System.Char.IsWhiteSpace(this.textBox1.Text,0)) )//全角半角スペース判断
{
this.textBox1.Text = "2";
  }
  else
  {
this.textBox1.Text = "1";
  }
}

この結果から改修対象のプログラムの問題なのは見えてきましたが、何が問題なのか今から調査してみます。
ちなみに改修プログラムはサービスとなっております。


引用返信 編集キー/
■11393 / inTopicNo.5)  Re[4]: データがスペースだった場合の分岐処理(C#)
□投稿者/ ぽぴ王子 (304回)-(2007/12/13(Thu) 10:46:50)
ぽぴ王子 さんの Web サイト
No11389 (nobu さん) に返信

> 実際に動いているコードを上げてみます
> 全角・半角どちらの空白も1となります

うーん…Message クラスの詳細がわからないと、ここだけあっても意味がないですね。
なので「そのままコピーしてコンパイル・実行できるコード」と書きました。
これじゃ回答しようにも、状態が再現できないので「ゴルゴムの仕業だ!」ぐらいしか
言えないんじゃないでしょうか。

> テストとして、簡易で別プログラムを作成し、動作確認をしてみました。
> こちらでは正しく判断できているようです・・・・
> ローカルで動かして問題なく動作したコード

なんだか括弧がひとつ足りないようですが…まぁいいか。それはこっちで追加できるし。
でもローカルで問題ないコードの割には全角でインデントされていたり、ちょっと不安な
感じですね。
こちらのコードはテストして正常に動くことを確認しました。
本当はこちらのコードで現象が再現できればよかったんですけどね(俗に言う「ミニマム
コード」というやつです)。


で、ここからが問題。

実際に動いていて、不具合が発生しているコード ……………… (A)
簡易的に別プログラムを作って正常に動作しているコード …… (B)

この違いが、今回の問題の原因になると考えられませんか?
というわけで違いを調べてみましょう。
気になったのはここ。
(A)
>     if (msg.data.Length == 0 || (System.Char.IsWhiteSpace(msg.m_data,0))  )//全角半角スペース判断
(B)
>     if (this.textBox1.Text.Length == 0 || (System.Char.IsWhiteSpace(this.textBox1.Text,0))  )//全角半角スペース判断
IsWhiteSpace の引数である textBox1.Text と msg.m_data に違いがありそうな感じです。

msg.m_data は String クラスでしょうか(上にも書きましたが msg の詳細がわかりません)。
ここにブレイクポイントを置いて、本当に msg.m_data がスペースになっているか、あるいは
msg.data.Length が 0 以外だったりしないか、そのあたりを調べてみてください。

差し支えなければ、Message クラスの中身も公開していただければもう少し調べられると思います。

引用返信 編集キー/
■11403 / inTopicNo.6)  Re[5]: データがスペースだった場合の分岐処理(C#)
□投稿者/ nobu (3回)-(2007/12/13(Thu) 11:24:55)
2007/12/13(Thu) 12:54:26 編集(投稿者)
2007/12/13(Thu) 11:26:06 編集(投稿者)

ぽぴ王子さま、ご助言ありがとうございます
現在の調査段階で以下のことがわかりました
実際に動いていて、不具合が発生しているコードを以下のように変更してみた所「IsWhiteSpace」が機能していない
ことがわかりました。

if (msg.m_data.Length == 0 || (System.Char.IsWhiteSpace(msg.m_data,0)) )//全角半角スペース判断を
if (msg.m_data.Length == 0 || (System.Char.IsWhiteSpace(" ",0)) )//に変えてコンパイルし、実行した所
結果が1。私が予想していた結果が2だったのでなぜこうなるのかがわかりません・・・
using System;を宣言しているので、無効になっている理由がわからないのです。

> うーん…Message クラスの詳細がわからないと、ここだけあっても意味がないですね。
Message クラスは以下のようになっています。全部コピーすると長いでの1項目だけコピーします。
他の項目もすべてstringで宣言されています

public class Message
{
#region 変数
public string m_data = "";
#endregion 変数
}


> msg.m_data は String クラスでしょうか(上にも書きましたが msg の詳細がわかりません)。
stringクラスです
> ここにブレイクポイントを置いて、本当に msg.m_data がスペースになっているか、あるいは
> msg.data.Length が 0 以外だったりしないか、そのあたりを調べてみてください。
ブレイクポイントを当てて、ウォッチ式の追加で確認できていることは m_data に" "が入っていることです
m_data.Length = 1となっております


引用返信 編集キー/
■11411 / inTopicNo.7)  Re[6]: データがスペースだった場合の分岐処理(C#)
□投稿者/ Ruku (11回)-(2007/12/13(Thu) 12:34:32)
試験コードで
> if (this.textBox1.Text.Length == 0 || (System.Char.IsWhiteSpace(this.textBox1.Text,0)) )

と、同じ対象をチェックしているのに、

> if (msg.data.Length == 0 || (System.Char.IsWhiteSpace(msg.m_data,0)) )

で、異なるメンバをチェックしているのが少し気になりました。
ところで msg.data に関しては提示されていませんが、こいつは平気ですか?(でも結果に差はでないか…?)
引用返信 編集キー/
■11419 / inTopicNo.8)  Re[7]: データがスペースだった場合の分岐処理(C#)
□投稿者/ nobu (4回)-(2007/12/13(Thu) 13:34:00)
原因が判明致しましたのでお知らせ致します
原因はデバック対象のDLLが古かったためです

修正前のdllには「IsWhiteSpace」の記述がないため、結果は古いdllのままだった
しかし、デバックを行っていた画面では修正後(IsWhiteSpace)の記述があるソースコード
が書いてあったため、最新版のDLLをデバックしていたと勘違いしていた
デバック対象を最新版DLLに変更した所問題なく動作しました

ぽぴ王子さま、 Ruku さま
ご助言感謝致します
大変助かりました



解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -