掲示板
Powered by OTD
この記事は、K.Maebashi's BBSの過去ログです。
書き込む場合は、新しい掲示板へお願いします。
[日付順表示] | [日付順インデックス] | [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[660] fortranの文字定数に関する質問です
返信


投稿者: りょうま
2004/03/04 20:33

Mail:   Link:
 fortranに関する質問です。

繰り返し計算で初期値から100ステップ計算するとします。
たとえばステップ数10、20、30、40・・・のときの
データをそれぞれ別々のテキストファイルを作成して書き込むよう
にしたいのですが,

どういう命令文を使えばいいのでしょうか?
ステップ数をniter としているときに10の倍数のときの
ステップ数をファイル名にする命令文を教えていただけませんか?

if(mod(10).eq.0)
を使えばいいことは判っています。

よろしくお願いします。



[659] Re:お久しぶりです
返信


投稿者: (ぱ)
2004/02/29 16:39

Mail:PXU00211@nifty.ne.jp   Link:http://kmaebashi.com/
 > そう言われてみると、僕のプログラマとしての土台は、
> 前橋さん色に染まっている気がします。(笑)

うを。責任重大ですね (^^;

> でもそういう人間が、全国にン万人からいる、というのは
> よくよく考えるとすごいですね。。
> # ン万人は、あくまでも適当な推測ですけど。

本の販売数からするとそんなもんです。その中で「染まった人」の割合が
どれくらいかはわかりませんが。
達成できたかはともかく、私としてはそれを「狙った」というのは確かにあります。
ポインタ完全制覇の「ポインタ演算なんか使うのはやめてしまおう」なんてのが
そうです。

K&Rとかに比べれば蟷螂の斧なんでしょうけど。


[658] Re:お久しぶりです
返信


投稿者: kei
2004/02/26 00:42

Mail:   Link:
 > で、あることを実現するのにいくつかの流儀がある場合、「最初に読んだ
> 入門書のサンプルプログラム」の流儀を延々と使い続けることになる
> わけで (^^;
>

そう言われてみると、僕のプログラマとしての土台は、
前橋さん色に染まっている気がします。(笑)

でもそういう人間が、全国にン万人からいる、というのは
よくよく考えるとすごいですね。。

# ン万人は、あくまでも適当な推測ですけど。


[657] ありがとうございます。
返信


投稿者: アルマ次郎
2004/02/25 11:38

Mail:   Link:
 > > という事は、Cと同じようにnullでもないゴミのようなものが
> > 入っているという事なのでしょうか?
>
> 違います。前回のレスでコンパイル結果をつけたように、未初期化の変数を
> 参照しようとするとコンパイラが許してくれません。
> Javaの場合、さらにVMのベリファイヤでもチェックしてるはず。
>
> > 取り合えず、ご指摘下さった。
> > (1)booleanの配列を一緒に渡す。添字で一致させる。
> > (2)intとbooleanのフィールドを持つクラスを作る。
> > (3)Integerの配列を渡す。無効データはnull。
> > を仕様に盛り込んでみようと思います。
>
> 一応念のためですが、
> この(1)〜(3)は、全部一度に実現できるようなものではなくて、
> 「この中のどれかひとつを選択する」というものです。
> わかってましたらすみません。どうも話が通じてるのか不安なので…
>
色々、ありがとうございます。Javaは本当に素人レベルなので
(1)〜(3)を全て理解出来るように頑張ろうと思います。
PHPに関しては3ヶ月程、研修し、仕様書作成、業務までと経験があるのですが、
Javaになるとまだ一ヶ月という浅はかな知識で色々
と未熟な部分が浮き彫りになりますからね。
知らない事は本当に恥ずかしいです(>_<)。


[656] Re:お久しぶりです
返信


投稿者: (ぱ)
2004/02/24 22:13

Mail:PXU00211@nifty.ne.jp   Link:http://kmaebashi.com/
 > という事は、Cと同じようにnullでもないゴミのようなものが
> 入っているという事なのでしょうか?

違います。前回のレスでコンパイル結果をつけたように、未初期化の変数を
参照しようとするとコンパイラが許してくれません。
Javaの場合、さらにVMのベリファイヤでもチェックしてるはず。

> 取り合えず、ご指摘下さった。
> (1)booleanの配列を一緒に渡す。添字で一致させる。
> (2)intとbooleanのフィールドを持つクラスを作る。
> (3)Integerの配列を渡す。無効データはnull。
> を仕様に盛り込んでみようと思います。

一応念のためですが、
この(1)〜(3)は、全部一度に実現できるようなものではなくて、
「この中のどれかひとつを選択する」というものです。
わかってましたらすみません。どうも話が通じてるのか不安なので…


[655] Re:お久しぶりです
返信


投稿者: アルマ次郎
2004/02/24 14:37

Mail:   Link:
 > > すいません。説明不足でした。皆様のご指摘に感謝致します。
> > 私が述べたかったのは簡単に説明して2点です。
> > 一つは、Javaは、int n;と宣言した時点で(int n = 0;と宣言しなくても)、
> > 既にnの中には初期値として0が代入されてしまう仕様という点(SDK1.4)
> > (つまりfor(int i=0;i<n;i++)はfor(int i;i<n;i++)でいいということ)。
>
> ウソです。
すいません、ウソ言ってしまいました。プリミティブ型の配列が要素に0が
代入されているため、Javaではポインタ演算子がないので宣言すれば
自動的に値(0)が代入されると勝手に脳内解釈しておりました。
という事は、Cと同じようにnullでもないゴミのようなものが
入っているという事なのでしょうか?

取り合えず、ご指摘下さった。
(1)booleanの配列を一緒に渡す。添字で一致させる。
(2)intとbooleanのフィールドを持つクラスを作る。
(3)Integerの配列を渡す。無効データはnull。
を仕様に盛り込んでみようと思います。
あと、Javaの連想配列をもう一回しっかり復習しないといけませんね。

:蛇足ですがPHPなお話:
>PHPの配列はただの連想配列
確かにそうなんですが・・・。ただ、他の言語の配列と違って
中に納める要素が型の制約を受けにくいという部分を強調したかったわけです。
昔、書いていた実験プログラムを例に取ってみますと…
<?php
class f{ var $g = 4.5654; var $d = false; }
$s = new f();
$a = array("dddd",true,null,0,$s);
print_r($a);//配列内の要素を表示
//PHPにおいてNULLとFALSEは同じであるか?
//ジャバ→エラー C→出来ません パール→分からない。
echo($a[2]==$a[5][1])?"同じです":"違います";//時代はTRUE/NULL?
?>
色々なデータを整理できるという部分がCの構造体と同じような
感じかなぁ・・・と。・・・すいません、お騒がせしました。
もう一度、山ごもり並の修行をして出直してきます。。。((((◎コロコロ


[654] Re:お久しぶりです
返信


投稿者: (ぱ)
2004/02/23 23:43

Mail:PXU00211@nifty.ne.jp   Link:http://kmaebashi.com/
 > すいません。説明不足でした。皆様のご指摘に感謝致します。
> 私が述べたかったのは簡単に説明して2点です。
> 一つは、Javaは、int n;と宣言した時点で(int n = 0;と宣言しなくても)、
> 既にnの中には初期値として0が代入されてしまう仕様という点(SDK1.4)
> (つまりfor(int i=0;i<n;i++)はfor(int i;i<n;i++)でいいということ)。

ウソです。

InitTest.java:3: 変数 i は初期化されていない可能性があります。
for (int i; i < 10; i++) {
エラー 1 個

初期値があらかじめ設定されているのは、インスタンスフィールドまたは
staticフィールドでしょう。ここでのiのようなローカル変数はダメです。
「Java謎+落とし穴〜」にも、p.87に書いてあります。

> しかし、今回のように(n==null)みたいな処理がしたい場合に困るなぁという事です。

で、これは、「初期値が自動的に設定されるかどうか」には関係なく、
「プリミティブ型について『null』のような意味のない値が存在するかどうか」
という問題ではないのですか?

だから私は以下のように書きました。

> > 「引数としてプリミティブ型の配列を渡すんだけど、中には無効なデータもある。」
> > というのをどう表現すべきか、ということでしたら、

この推測が外れていたのでしたら、どう違うか教えてください。

> 『PHPの配列は、面白い事に配列ではなく構造体に近すぎるため(本当ですよw)。』

PHPの配列は、単なる連想配列でしょう。構造体的な使い方をしようと思えば
できなくもないですが、本質的には別物だと思います。
連想配列に近いものは、Javaで言えばHashMapとかですね。

> このような(n==null)みたいな処理がいとも簡単に実現できてしまうのです。

で、これは、「変数がnullという値を取れるかどうか」という問題で、
構造体云々の話とは無関係でしょう。
RDBMSでは、たとえば整数型のフィールドも、NULLという値をとることができます。
これは「0」という値が入っている状態とは違って、そもそも値が
入っていないことを意味します。JavaやCでは、変数に「値が入っていない状態」
を表現できませんから、不便に思うことは確かにありますね。
# Visual Basic 6.0だと、Emptyってのがあったりします。

>  上記のコードは、ホンダとトヨタは変数名の事です。
> 最近、ホゲやフーが飽きてきたので、変数名だけでも変化を持たせようと思って。
> でもこの場合は、hogeやfooに訂正しとくべきでした。

hogeやfooでもだめでしょう。
私も、テストプログラム等ではhogeやfooを使うことがありますが、
それは、そもそも意味のない(テストのためだけの)プログラムを書いているので
変数に適切な(意味のある)命名ができない、という場合に限ります。

  String ans = "<table";
  ans += (honda[n]!=null):" border=\""+Integer.toString(honda[n])+"\"":"";n++;
  ans += (honda[n]!=null):" cellspacing=\""+Integer.toString(honda[n])+"\"":null;n++;
  ans += (honda[n]!=null):" cellpadding=\""+Integer.toString(honda[n])+"\"":null;n++;
  ans += ">";

このコードを見ると、hondaという配列は、table要素の属性値を格納している
ようです。属性なんだから「attributes」という名前にするとして、
attributes[0]がborder, [1]がcellspacing, [2]がcellpaddingをそれぞれ
表現しているとして(で、トヨタはどこ行っちゃったの?)、
たとえば「cellspacingとcellpaddingは指定するけどborderは指定しない」
ということをしたい場合、引数をどうするか、ということなら、
それについては

(1)booleanの配列を一緒に渡す。添字で一致させる。
(2)intとbooleanのフィールドを持つクラスを作る。
(3)Integerの配列を渡す。無効データはnull。

こう答えました。
しかし、私なら、そもそも「attributes[0]がborder, [1]がcellspacing,
[2]がcellpaddingをそれぞれ表現している」なんて仕様にはしません。
何番目が何に対応しているかわかんなくなるからです。
属性がintだけとも限りませんし。


[653] Re:お久しぶりです
返信


投稿者: (ぱ)
2004/02/23 23:13

Mail:PXU00211@nifty.ne.jp   Link:http://kmaebashi.com/
 > はじめまして。

はじめまして。

> 僕はPHPは良く知らないのですが、ああいった書き方を見ると、
> 携帯コンテンツみたいな、使い捨てのアプリをサクっとつくる
> という時には最適なのかもなぁ、なんて感じました。

最近ゆえあってPHPをいじってますが、確かに便利です。
書き方だけ見ればJSPも似たようなものに見えますが、Webアプリケーションに
特化してて、ライブラリも充実してますから。

> # 逆に、継続的なメンテが必要なら地獄でしょうけど。

これもそう思います。
これはJSPでスクリプトレットでゴリゴリ書いても同じで、やっぱり
Viewとビジネスロジックはちゃんと分けなきゃいけないと思います。

それ以前に、「Webアプリケーション」というもの自体が、どうも
鞄で釘を打ってる気がしてしょうがないですが。

> Cにしても、Javaにしても、短納期の開発で、一からつくる必要が
> あるときに
> 「なんでこんなに手間がかかるんだぁー」
> って思うことがしばしば。僕が未熟なだけかも知れませんが。。

それでも、一度でも経験があって、サンプルプログラムが残ってたりすると
かなり楽ですよね。
で、あることを実現するのにいくつかの流儀がある場合、「最初に読んだ
入門書のサンプルプログラム」の流儀を延々と使い続けることになる
わけで (^^;


[652] Re:お久しぶりです
返信


投稿者: アルマ次郎
2004/02/23 11:29

Mail:   Link:
 > 
> そもそも何がやりたいのかよくわかりませんが…
> 何ゆえホンダ? トヨタはどこ行ったんでしょうか?
>
> 「引数としてプリミティブ型の配列を渡すんだけど、中には無効なデータもある。」
>
> というのをどう表現すべきか、ということでしたら、
>
> (1)booleanの配列を一緒に渡す。添字で一致させる。
> (2)intとbooleanのフィールドを持つクラスを作る。
> (3)Integerの配列を渡す。無効データはnull。
>
> ぐらいが思いつきます。
> 添字一致というのが美しくないですが、(1)でやっちゃうことが多いかなあ。
>
すいません。説明不足でした。皆様のご指摘に感謝致します。
私が述べたかったのは簡単に説明して2点です。
一つは、Javaは、int n;と宣言した時点で(int n = 0;と宣言しなくても)、
既にnの中には初期値として0が代入されてしまう仕様という点(SDK1.4)
(つまりfor(int i=0;i<n;i++)はfor(int i;i<n;i++)でいいということ)。
しかし、今回のように(n==null)みたいな処理がしたい場合に困るなぁという事です。
『PHPの配列は、面白い事に配列ではなく構造体に近すぎるため(本当ですよw)。』
このような(n==null)みたいな処理がいとも簡単に実現できてしまうのです。
少々回りくどすぎました。

 次の点は、前橋さまの出された「Javaの謎+落とし穴」で、"クラスはCの構造体みたいなものと考える"っと
書かれていたと思うのですが、言語の習得した順序が違っていた私にはクラスをCの構造体のように考えるという言葉に
少し違和感みたいなものを感じてしまったので(C→PHP→Java)。
PHPの構造体は配列なため、更にクラスも存在するという点。

 上記のコードは、ホンダとトヨタは変数名の事です。
最近、ホゲやフーが飽きてきたので、変数名だけでも変化を持たせようと思って。
でもこの場合は、hogeやfooに訂正しとくべきでした。
分かりにくくなってしまい、本当にごめんなさいです。
上記のコードはHTML上に表を吐き出す為のtableメソッドがあり、
それに引数int hondaやtoyotaがあった場合は、
<tr>と<td>タグの数を固定化して縦枠と横枠を作るサーブレットの一部分です。

webToolという自作のクラスがあり、
tableメソッドをint hondaとint toyotaがあった場合と無い場合の2回以上宣言するのに、
なんだか面倒だなぁ・・・と感じてしまったからです。

取り合えず疑問に思った事を書いたつもりなのですが、すいませんでした。。
350-352まで改行処理が上手くできなかったので削除させて頂きました。
お手数を、おかけしますm(_ _)m


[649] Re:お久しぶりです
返信


投稿者: kei
2004/02/22 23:00

Mail:   Link:
 はじめまして。

前橋さんのC本とJava本を読んでプログラマを始めた、
ホントの若輩者です。

> 「タグクラス」のサブクラス「テーブルクラス」がJava的でしょうけどね。

ですね。
Javaでやるなら、テーブルクラスに属性をセットする、と言う形で
表現するのがスマートですよね。

それにしても。
僕はPHPは良く知らないのですが、ああいった書き方を見ると、
携帯コンテンツみたいな、使い捨てのアプリをサクっとつくる
という時には最適なのかもなぁ、なんて感じました。

# 逆に、継続的なメンテが必要なら地獄でしょうけど。

Cにしても、Javaにしても、短納期の開発で、一からつくる必要が
あるときに

「なんでこんなに手間がかかるんだぁー」

って思うことがしばしば。僕が未熟なだけかも知れませんが。。


[648] Re:お久しぶりです
返信


投稿者: honi
2004/02/21 14:14

Mail:   Link:
 > そもそも何がやりたいのかよくわかりませんが…
<table>タグを出したいのでしょう、PHPと同じやり方で。

自分で作る、という点においては、
「タグクラス」のサブクラス「テーブルクラス」がJava的でしょうけどね。

まず、
1行単位でのtranslateがそもそもおかしい、
というのを教えてあげたい。


[647] Re:お久しぶりです
返信


投稿者: (ぱ)
2004/02/21 00:58

Mail:PXU00211@nifty.ne.jp   Link:http://kmaebashi.com/
 > 今勉強しているJavaでtableメソッドとかいうのを作っていて
> void String table(int[] honda,string[] toyota)
> {
>   int n = 0;
>   String ans = "<table";
>   ans += (honda[n]!=null):" border=\""+Integer.toString(honda[n])+"\"":"";n++;
>   ans += (honda[n]!=null):" cellspacing=\""+Integer.toString(honda[n])+"\"":null;n++;
>   ans += (honda[n]!=null):" cellpadding=\""+Integer.toString(honda[n])+"\"":null;n++;
>   ans += ">";
> //中略
>   ans += "</table>"
> return ans;
> //上のような書き方で(honda[n]!=null)というのが出来ないので、多少不便に感じます。。。
> }
> Javaの達人の方々ならこのような問題をどう解決するでしょうか?

そもそも何がやりたいのかよくわかりませんが…
何ゆえホンダ? トヨタはどこ行ったんでしょうか?

「引数としてプリミティブ型の配列を渡すんだけど、中には無効なデータもある。」

というのをどう表現すべきか、ということでしたら、

(1)booleanの配列を一緒に渡す。添字で一致させる。
(2)intとbooleanのフィールドを持つクラスを作る。
(3)Integerの配列を渡す。無効データはnull。

ぐらいが思いつきます。
添字一致というのが美しくないですが、(1)でやっちゃうことが多いかなあ。


[646] Re:お久しぶりです
返信


投稿者: honi
2004/02/20 21:26

Mail:   Link:
 あくまで原型で、なら

int[] array = new int[5]; // 適正なサイズにとりなおす
for (int i = 0; i < honda.length; i++) {
array[i] = honda[i];
}

int n = 0;
String ans = "<table";

ans += " border=\"" + array[n] + "\""; n++;
ans += " cellspacing=\"" + array[n] + "\""; n++;
ans += " cellpadding=\"" + array[n] + "\""; n++;
ans += " width=\"" + array[n] + "\""; n++;
ans += " height=\"" + array[n] + "\">"; n++;

ans += "</table>";

return ans;

int型はnullにはならない(初期値は0)だけど、
配列のサイズを調べないと、ArrayIndexOutOfBoundsExceptionになる。



[645] Re:数値のエラー処理
返信


投稿者: ishikawa
2004/02/20 14:12

Mail:   Link:
 774RRさん、(ぱ)さん。
どうもありがとうございます。
いろいろ参考になりました。


[644] Re:数値のエラー処理
返信


投稿者: 774RR
2004/02/20 08:45

Mail:   Link:
 > また入力文字が一桁の場合、抑止文字に対する引数がないと思うんですがこのへん
> はOKなんでしょうか?
ダメですね。
「改行以外の文字が残っている」場合に、改行を込みで先読みバッファを削除する
ためのコードなので。
文字が無い場合まで対応するには、もうちょっと考察が必要みたいです(泣)

> で、これはscanf("%*[^\n]%*c");のように引数なしでもいいんでしょうか?
こっちはOKです。
printf("Hello World\n"); と同じです。


[643] お久しぶりです
返信


投稿者: アルマ次郎
2004/02/19 17:54

Mail:   Link:
  こんにちは&お久しぶりです。
C言語で、お世話になっておりました。アルマ次郎です。
現在はPHPからJavaサーブレット等を勉強しております。
 なんか、面白い事もないまま来たのか?っていうのも何なので、
取り合えず、最近疑問に思った事を書いてみます。
 PHPは型変換が曖昧やら情報隠蔽が確りしていない
などセキュが危ないと言われていますが(PHP5で解消か?)、
例えば配列を宣言し、
<?php
$c = array(null,3,"よ",4,null,"ば"); //配列cに数字やら何やらを代入
/*配列の中に型の違う奴を代入できる。*/
?>
というような書き方が可能なのですが(危ないですが・・・^-^;)。
今勉強しているJavaでtableメソッドとかいうのを作っていて
void String table(int[] honda,string[] toyota)
{
  int n = 0;
  String ans = "<table";
  ans += (honda[n]!=null):" border=\""+Integer.toString(honda[n])+"\"":"";n++;
  ans += (honda[n]!=null):" cellspacing=\""+Integer.toString(honda[n])+"\"":null;n++;
  ans += (honda[n]!=null):" cellpadding=\""+Integer.toString(honda[n])+"\"":null;n++;
  ans += ">";
//中略
  ans += "</table>"
return ans;
//上のような書き方で(honda[n]!=null)というのが出来ないので、多少不便に感じます。。。
}
Javaの達人の方々ならこのような問題をどう解決するでしょうか?
自分は最初にString型として認識させて、後からint型だけ分解するというやり方だったのですが。


[641] Re:数値のエラー処理
返信


投稿者: ishikawa
2004/02/19 11:03

Mail:   Link:
 > 次のような scanf は結構役に立つのですが、解釈してみてください。
> scanf("%*[^\n]%*c");
分かりました。
scanf("%5d%*[^\n]%*c",&a);
このように使うんですね、始めは%*[^\n]を%*sに変えても一緒だよな、とか思った
んですが、よく調べれば%*[^\n]は空白文字を抑制しますね。
で、これはscanf("%*[^\n]%*c");のように引数なしでもいいんでしょうか?
また入力文字が一桁の場合、抑止文字に対する引数がないと思うんですがこのへん
はOKなんでしょうか?
(細かいこと言うようですが・・・)


[640] Re:数値のエラー処理
返信


投稿者: 774RR
2004/02/19 08:42

Mail:   Link:
 ちょっと訂正しときます。
「C-z で stdin が close される」のではなくて、
「C-z で stdin は EOF に達する」の間違いです。

そして tty や tape 等、シークできないデバイスに接続されているファイル
(この例では console に接続されている stdin)
は、一度 EOF に達したなら再度読み込む手段が無いのです。
よって C-z (UNIX 系では C-d) を入力すると、それ以後全ての入力は EOF
になっちゃいます。

C-z が「もうこれ以上入力しない、というユーザの意思表明」であることには
違いはありません(が技術的説明がちょっとおかしい)。


[639] Re:数値のエラー処理
返信


投稿者: 774RR
2004/02/19 08:37

Mail:   Link:
 > scanf("%5d",&a) 
> こういう場合って数字を何桁入力しようがメモリ破壊は起きませんよね。
> これって合法(?)ですよね?(フィールド長の使い方が)
御意です。
ただし、これは最大5桁を読むという指定なので、たとえば
1234567 -> a は 12345 次の getchar() は '6' を返却
89abcde -> a は 89 次の getchar() は 'a' を返却
することになります。
常に5桁(というか5文字)を読む指定ではないです。

次のような scanf は結構役に立つのですが、解釈してみてください。
scanf("%*[^\n]%*c");


[638] Re:数値のエラー処理
返信


投稿者: ishikawa
2004/02/18 18:39

Mail:   Link:
 > 一応聞かれてみますが、できないですね。
> テープの終端まで到達した、のとソフト的には区別されませんから。
> そもそも C-z をユーザーが入力したなら、その心は
> もうこれ以上の入力は行いません、という意思表明ですので。
> その意思表明は尊重されるべきでしょう。
そうですか、ありがとうございます。 僕はC-zの意味がよく分かってなかったみたいで
す。
そういえばもう一つ聞きたいことがあるんですが
scanf("%5d",&a)
こういう場合って数字を何桁入力しようがメモリ破壊は起きませんよね。
これって合法(?)ですよね?(フィールド長の使い方が)


[637] Re:数値のエラー処理
返信


投稿者: 774RR
2004/02/18 08:51

Mail:   Link:
 > あの、一応聞きますがもう一回開くこととかはできませんよね?
一応聞かれてみますが、できないですね。
テープの終端まで到達した、のとソフト的には区別されませんから。
そもそも C-z をユーザーが入力したなら、その心は
もうこれ以上の入力は行いません、という意思表明ですので。
その意思表明は尊重されるべきでしょう。


[636] Re:数値のエラー処理
返信


投稿者: ishikawa
2004/02/17 22:36

Mail:   Link:
 > Ctrl-Z ということは Windows でしょうか?
> Ctrl-Z を入力することで stdin は close されるので、
> 再度入力することはもはやできません。
> 何回 getc しても EOF が返されるのは当然です。
そうですか、stdinはcloseされてたんですか・・、それは再度入力できませんね。
ありがとうございます、謎が解けました。

あの、一応聞きますがもう一回開くこととかはできませんよね?


[635] Re:誤解?
返信


投稿者: K.Y
2004/02/17 20:29

Mail:   Link:
 > テストプログラムはいざ知らず、現実にドローツールを作るなら、
> 「呼び出し部分のコード」と「newする部分のコード」は別々に記述される
> ことが多いはずです。「Java謎+落とし穴〜」をお持ちであれば、
> List3.35のXDrawCanvas.javaが、draw()メソッドの「呼び出し部分のコード」を
> 含みます。XDrawCanvas.javaは、Shapeの種類を増やしても修正/再コンパイルの
> 必要がありません。

List3.24からList3.39は、今の私の実力では解読できませんので、その前にある
List3.10を、「呼び出し部分のコード」と「newする部分のコード」を別々に記述して
確認してみます。
どうも有り難うございます。


[633] Re:数値のエラー処理
返信


投稿者: 774RR
2004/02/17 08:26

Mail:   Link:
 Ctrl-Z ということは Windows でしょうか?
Ctrl-Z を入力することで stdin は close されるので、
再度入力することはもはやできません。
何回 getc しても EOF が返されるのは当然です。
ちなみに Win9X 系には ctrl-Z で stdout も同時に close されるという
顰蹙極まりないバグがあったりします。


[632] Re:数値のエラー処理
返信


投稿者: ishikawa
2004/02/17 02:31

Mail:   Link:
 > Ctrl-Zのとき、どうなるのが正しい仕様だと考えていますか?
いや・・、普通に
getcで[Ctrl-Z]を読み込む→getcはファイルの終了が来たのが分かる→EOFを返す→
if文実行でbreak→goto retry→stdinから再入力(この時にはバッファは空)
と考えているんですが。
もしかしたら僕は「バッファ」とか「標準入力ストリーム」のこと
をまだ分かってないかもしれませんね。
まず、
stdinって言うのは標準入力ストリームを操作するファイル構造体へのポインタで
すよね?
ココで言う「標準入力ストリーム」と「バッファ」は同じ意味を表してるってこと
でいいですか?
getcは受け取った引数が指すファイル構造体を操作してるんですね?
バッファって言うのは何かキーを押すごとにその文字を記憶しますよね?
例えば、1234567890123と押す場合、まず最初に1がバッファにたまって、2のキーを押したら2がバッファリングされる、そして3のキーを押したら3がバッファリングされる・・
・ってことですね?
それで[Ctrl+Z][改行]を押すことによって、・・・・(すいません、この辺の知識も微妙
かもしれません)・・・完全なファイルとして認められる(?) そしてこの時初めて
ファイル構造体にその情報が書きこまれる・・・??(その時、改行コードは捨てら
れ(?)、ファイル終了コードは[Ctrl+Z](0x1A)になる・・、 いやでもC言語では0x1Aは
ファイル終了のコードではないな・・、Windows上では終了コードを表すけど。。(C言
語上ではファイルを属性で表してるという風なことを聞いたことがあるから、Unixのファイル形式と一緒と聞いたこともある。)、、じゃあ自動的に0x1AはEOFだよ。。というこ
とをファイル構造体に書き込む時に行っているるんだろうな・・たぶん・・?)
そして結局バッファには1234567890123[EOF]が入る。
ってことでいいんですかね?(たぶんよくないと思いますけど)
スンマセン質問ばかりで、勉強不足です。

> ということは、コメントの行が何度も何度も実行された、ということですよね。
コメント行を3行書いたら3行とも-1だったんですよ。
> Ctrl-Zが入力されたとき、「桁数が多すぎです、やり直しです:」と表示されるのが
> 正しいんでしょうか?
> retry するのが正しいんでしょうか?
あのコメントに追記(if(jj++ == 5) break; を付け足す、6回繰り返す)して実行すると

10進数で数値を入力してくだい(9桁までです):1234567890123^Z
-1
桁数が多すぎです、やり直しです:-1
桁数が多すぎです、やり直しです:-1
桁数が多すぎです、やり直しです:-1
桁数が多すぎです、やり直しです:-1
桁数が多すぎです、やり直しです:-1
あなたの入力した数値は1234567890ですね!!!!

このような結果になりました。



[631] Re:数値のエラー処理
返信


投稿者: (ぱ)
2004/02/17 00:31

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 なんだか典型的な「混乱状態」に陥っているような気が... (^^;

> ・・・が[ctrl+z]で終わらした場合にどうしてもうまくいけません。

Ctrl-Zのとき、どうなるのが正しい仕様だと考えていますか?

> このように書き変えたんですが
> if(strlen(number) >= SIZE) {
>     while(1) {
> if((flag = getc(stdin)) == 0x0A) break;
>    if(flag == EOF) break;
> }
> //printf("%d\n",getc(stdin));
> printf("\a桁数が多すぎです、やり直しです:");
> goto retry;
> }
> なぜか無限ループになります。なにが残ってる(?)のかなと思って↑のコメントの部分
> で調べたんですが、なぜか-1が永遠に入ってました(?)。

ということは、コメントの行が何度も何度も実行された、ということですよね。
Ctrl-Zが入力されたとき、「桁数が多すぎです、やり直しです:」と表示されるのが
正しいんでしょうか?
retry するのが正しいんでしょうか?



ひとつ前の過去ログ | 目次へ | ひとつ後の過去ログ