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

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

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

Re[1]: 変数から数字を読み取る


(過去ログ 51 を表示中)

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

■28106 / inTopicNo.1)  変数から数字を読み取る
  
□投稿者/ 初心者 (191回)-(2008/11/19(Wed) 22:07:27)

分類:[C#] 

C#のプログラムについて質問させてください。

受信した文字列のデータを、最初の文字は捨て、その次の文字(必ず数字)で次読み取る数を判断する


というプログラムを作成しようとしています。

具体的には


「#40010ABCDEFGHIJ」

という文字列を受信したら、


#を捨てる
↓
次が「4」であるため、4つの文字、0010を読み取る
↓
読み取った0010を数字として判断し、10を読み取る
↓
for文で繰り返し、前回読み取った10回ループさせる





RecvBufferに「#40010ABCDEFGHIJ」
を1度に受信します。

なお、今回の「4」と「10」は変数です。



参考までに、今回自分が作成したプログラムは

            string RecvBuffer;(←こいつに受信データ格納)


            int i = 0;
            int m = 0;
            int n = 0;
            string[] X = new string[20];


            RecvBuffer = RecvBuffer.Substring(1,RecvBuffer.Length);
            n = int.Parse(RecvBuffer(0,1));

            RecvBuffer = RecvBuffer.Substring(1,RecvBuffer.Length);
            m = int.Parse(RecvBuffer(0,n));

            for (i = 1; i <= m; i++)
            {
                X[i] = RecvBuffer(0, 1);
                RecvBuffer = RecvBuffer.Substring(1);

            }





このように作成しましたが、
「RecvBufferは変数ですが、メソッドのように使用されています」
とエラーが出てしまいます。

行き詰っているのでなにか意見がありましたらお願いします。

引用返信 編集キー/
■28107 / inTopicNo.2)  Re[1]: 変数から数字を読み取る
□投稿者/ 魔界の仮面弁士 (900回)-(2008/11/19(Wed) 22:19:16)
No28106 (初心者 さん) に返信
> 「#40010ABCDEFGHIJ」

「#40010ABCDEFGHIJ」ではなく、
「#40010ABCDEFGHIJ」なのですね?


> 「RecvBufferは変数ですが、メソッドのように使用されています」
> とエラーが出てしまいます。

それは、
> n = int.Parse(RecvBuffer(0,1));
の部分で、RecvBuffer(0,1) という呼び出し方をしているからでしょう。

RecvBuffer や RecvBuffer.Substring(0,1) などと書く事はできるはず。
引用返信 編集キー/
■28108 / inTopicNo.3)  Re[2]: 変数から数字を読み取る
□投稿者/ 初心者 (192回)-(2008/11/19(Wed) 22:53:18)
2008/11/19(Wed) 22:55:34 編集(投稿者)
2008/11/19(Wed) 22:55:29 編集(投稿者)

<pre><pre>■No28107 (魔界の仮面弁士 さん) に返信


お返事ありがとうございます。


> 「#40010ABCDEFGHIJ」ではなく、
> 「#40010ABCDEFGHIJ」なのですね?
>


すみません!1文字が1バイトにあたるので、
「#40010ABCDEFGHIJ」の半角で受信します><


>
>>「RecvBufferは変数ですが、メソッドのように使用されています」
>>とエラーが出てしまいます。
>
> それは、
>>n = int.Parse(RecvBuffer(0,1));
> の部分で、RecvBuffer(0,1) という呼び出し方をしているからでしょう。
>
> RecvBuffer や RecvBuffer.Substring(0,1) などと書く事はできるはず。




あぁ、本当ですね!RecvBuffer.Substring(0,1)じゃないとだめでしたね。。。
的確に、ありがとうございます。

それを直してプログラムを走らせたところ、




RecvBuffer = RecvBuffer.Substring(1,RecvBuffer.Length);


この部分で、「ArgumentOutOfRangeExceptionはハンドルされませんでした」
インデックスおよび長さは文字列内の場所を参照しなければなりません。


というエラーが出てしまいました。



ここではその時のRecvBufferのデータ数を入れたいのですが、ただRecvBuffer出来ませんよね。。。

なにか違う方法がありましたらお願いします。</pre></pre>
引用返信 編集キー/
■28110 / inTopicNo.4)  Re[3]: 変数から数字を読み取る
□投稿者/ よねKEN (21回)-(2008/11/19(Wed) 23:27:56)
ご提示になっているソースコードで(魔界の仮面弁士さんのご指摘の内容を反映した上で)、
RecvBufferが"#40010ABCDEFGHIJ"だったと仮定して、どんな風に処理が実行されるかを
初心者さんがコンピュータになったつもりで1行ずつ理解してみてはいかがですか?

いわゆる机上デバッグという方法ですが、これをやってみることをお勧めします。
これをやればご自身で解決できると思いますが、それでも解決しないなら、
ご自身のソースコードの1行1行を日本語で説明したものをこちらに掲載してはどうでしょう。
説明内容が間違っているところがあれば、どこが間違っているか指摘しますよ。

> RecvBuffer = RecvBuffer.Substring(1,RecvBuffer.Length);
>
> この部分で、「ArgumentOutOfRangeExceptionはハンドルされませんでした」
> インデックスおよび長さは文字列内の場所を参照しなければなりません。
>
> というエラーが出てしまいました。

なぜその例外が出るか理解されてますか?

参考URL:
String.Substring メソッド (Int32, Int32)
http://msdn.microsoft.com/ja-jp/library/aka44szs(VS.80).aspx

MSDNでこのメソッドについて調べましょう。
メソッドで発生する例外についての説明があります。

以下は上記URLからの引用です。
>> ArgumentOutOfRangeException
>> startIndex と length を足した数が、このインスタンス内にない位置を示しています。
>> または
>> startIndex または length が 0 未満です。

この説明の意味を理解すれば何を直せばよいのかもわかると思います。

> なにか違う方法がありましたらお願いします。

やろうとしている方向性が間違っているわけではないので、
まずは起きている問題とその原因を正しく理解しましょうよ。

引用返信 編集キー/
■28124 / inTopicNo.5)  Re[3]: 変数から数字を読み取る
□投稿者/ .SHO (109回)-(2008/11/20(Thu) 10:05:40)
No28108 (初心者 さん) に返信

> ここではその時のRecvBufferのデータ数を入れたいのですが

じゃなくて、#を捨てるところで既に落ちてると思います。
引用返信 編集キー/
■28125 / inTopicNo.6)  Re[4]: 変数から数字を読み取る
□投稿者/ まんごーぷりん (36回)-(2008/11/20(Thu) 11:06:48)
まんごーぷりん さんの Web サイト
Substring() メソッドの使い方を理解すれば解決しそうな気がします。
特に第二引数の扱いです。
引用返信 編集キー/
■28161 / inTopicNo.7)  Re[5]: 変数から数字を読み取る
□投稿者/ 初心者 (193回)-(2008/11/20(Thu) 16:54:59)
みなさま、ありがとうございます。

Substringの使い方を間違えていました。
てっきり.Lengthが使えないのかと勘違いしてしまい、見当違いのことを考えていました。



string[] X = new string[2500];
int i = 0;
int m = 0;
int n = 0;


RecvBuffer = RecvBuffer.Substring(1,RecvBuffer.Length-1);
n = int.Parse(RecvBuffer.Substring(0,1));

RecvBuffer = RecvBuffer.Substring(1,RecvBuffer.Length-1);
m = int.Parse(RecvBuffer.Substring(0, n));

RecvBuffer = RecvBuffer.Substring(n, RecvBuffer.Length - n);


for (i = 1; i <= m; i++)
{
X[i] = RecvBuffer.Substring(0, 1);
RecvBuffer = RecvBuffer.Substring(i, RecvBuffer.Length - i+1);

}




こようにプログラムを変えましたが、

for文の中の

RecvBuffer = RecvBuffer.Substring(i, RecvBuffer.Length - i);

この部分で同様のエラーが起きてしまいます。
.Substringの使い方・サイズにも合ってると思うのですが…
引用返信 編集キー/
■28170 / inTopicNo.8)  Re[6]: 変数から数字を読み取る
□投稿者/ .SHO (123回)-(2008/11/20(Thu) 17:16:07)
No28161 (初心者 さん) に返信

> RecvBuffer = RecvBuffer.Substring(i, RecvBuffer.Length - i);
>
> この部分で同様のエラーが起きてしまいます。
> .Substringの使い方・サイズにも合ってると思うのですが…

全ての Substring してるところにブレークポイントを設定して
RecvBufferがどう変わっていくか確認してください。
引用返信 編集キー/
■28184 / inTopicNo.9)  Re[1]: 変数から数字を読み取る
□投稿者/ Jitta on the way (229回)-(2008/11/20(Thu) 18:32:02)
No28106 (初心者 さん) に返信
int 数値切り出し(string 元文字列, int 開始位置, int 文字数) {
return Convert.ToInt32(元文字列.Substring(開始位置, 文字数));
}

処理() {
int 数値文字数 = 数値切り出し(バッファ, 1, 1);
int 文字数 = 数値切り出し(バッファ, 2, 数値文字数);
string 文字列 = バッファ.Substring(バッファ, 2+数値文字数);
}


携帯からなので、全く保証しない。
引用返信 編集キー/
■28191 / inTopicNo.10)  Re[6]: 変数から数字を読み取る
□投稿者/ .SHO (127回)-(2008/11/20(Thu) 20:58:57)
No28161 (初心者 さん) に返信

> こようにプログラムを変えましたが、
> for文の中の
> RecvBuffer = RecvBuffer.Substring(i, RecvBuffer.Length - i);
> この部分で同様のエラーが起きてしまいます。
> .Substringの使い方・サイズにも合ってると思うのですが…

やりたいのは、最初の「1文字」を捨てることなのに
「i」はどんどん増えていってますよね。

> for (i = 1; i <= m; i++)
> {
> X[i] = RecvBuffer.Substring(0, 1);
> RecvBuffer = RecvBuffer.Substring(i, RecvBuffer.Length - i+1);
>
> }

余計なお世話かも知れないですが「X」は0番目から入れなくもいいですか?
それと、X が string じゃなくて char なら、こんな面倒なことしなくても
X[i] = RecvBuffer[i];
で入ります(まぁ、そんなことしてもあまり意味はないですけど)。
ただし、i は 0 から開始させること。
引用返信 編集キー/
■28210 / inTopicNo.11)  Re[7]: 変数から数字を読み取る
□投稿者/ みきぬ (239回)-(2008/11/21(Fri) 10:20:09)
もっと余計なお世話ですが、処理内容から考えて String.SubString() で頑張るよりは StringReader を使ったほうがそれっぽいのかなあ…と思ったりしました。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -