学校の情報処理の試験で入力された数値の桁数を求める問題が出て、
ループして割っていくのも、log10を使うのも芸がないので捻って
#include <stdlib.h>
#include <stdio.h>
int main()
{
char buff[25];
int n;
int len;
scanf("%d", &n);
sprintf(buff, "%d", n);
len = strlen(buff);
printf("Length = %d", len);
return 0;
}
と書いて提出したら(len = sprintf(...)のほうがいいかも)
> 自分のプログラミング技術を誇示したい気持ちもわからないではないが、
> わざわざ文字列へ変換しなければ解けない問題でしょうか?
> strlenを使うなら#include <string.h>が必要
とコメントされて三角がついてかえってきました。
#この程度で"誇示"はいやみだよなぁ…
私の記憶だとC言語はプロトタイプ宣言されていない関数は
int型を返すはじめてその関数が使用されたときの引数の型を取る
関数として使用することができたと思いますが、厳密には違うのでしょうか?
includeディレクティブを使用せずに
int main() {
printf("Hello world");
return 0;
}
なんてやった経験があるんですけど…。
あと、もう1つ質問があります。
C言語では乗算記号は必ず×ではなく
*と書かなければならないのでしょうか?
ペーパーテストで×と書くと必ず赤ペンで
*(正確にはバッテンに横棒)と書き直されます。
これが理由で本当のペケをもらったことがあるなんて話も耳にします。
こんなものは特にこだわるべき問題だと思えないのですが、
何か所以があるのでしょうか?
C言語って難しいなぁ。なんて感心しています。
プログラミング経験の無い連中はもっと可哀想。
ご存知の方、ご教授お願いします。
#やっぱし教官に嫌われているってのが正しいのか…?(^^;)
--
岩田 雅樹
masaki...@hotmail.com
私でも三角つけるかも。
> 私の記憶だとC言語はプロトタイプ宣言されていない関数は
> int型を返すはじめてその関数が使用されたときの引数の型を取る
> 関数として使用することができたと思いますが、厳密には違うのでしょうか?
宣言されていない関数はintを返すことになっています
が、動くプログラムが書ければいいというわけではあり
ませんよ。試験なんですから、芸を見せるなら見せるで
それに見あった基礎知識もちゃんと持っているところを
見せなければならないでしょう。strlen()を使うのなら
string.hとの関連を理解していることも同時に示すべき
ですね。
「芸がないので」とお書きですが、本筋の理解をあいま
いにしたまま芸に走るのは技術習得の面からみてきわめ
て危険です。教官から「こいつはちゃんとわかっている
のだから」と思われているのなら遊びで回答してもかま
わないと思いますが、masaki_iwataさんはそこまでは信
用されていないということでしょう。
> あと、もう1つ質問があります。
> C言語では乗算記号は必ず×ではなく
> *と書かなければならないのでしょうか?
もちろん。
> こんなものは特にこだわるべき問題だと思えないのですが、
> 何か所以があるのでしょうか?
プログラミングというのは、人間が計算機に行わせよう
としている処理を相手(計算機)が理解できる言語で記述
する行為です。人間が相手の場合でも同じですが、相手
側の言語でどんな文字が使えるかを理解してそのルール
に従うというのは基本ですね。
--
太田純(Junn Ohta) (株)リコー/新横浜事業所
oh...@sdg.mdd.ricoh.co.jp
"Junn Ohta" <oh...@src.ricoh.co.jp> wrote in message
news:8qur9a$2ag$1...@ns.src.ricoh.co.jp...
> ませんよ。試験なんですから、芸を見せるなら見せるで
> それに見あった基礎知識もちゃんと持っているところを
> 見せなければならないでしょう。strlen()を使うのなら
> string.hとの関連を理解していることも同時に示すべき
> ですね。
なるほど。
> 「芸がないので」とお書きですが、本筋の理解をあいま
> いにしたまま芸に走るのは技術習得の面からみてきわめ
> て危険です。教官から「こいつはちゃんとわかっている
> のだから」と思われているのなら遊びで回答してもかま
> わないと思いますが、masaki_iwataさんはそこまでは信
> 用されていないということでしょう。
その程度のことは理解できてるんですけどね。
やっぱり信用されてないのか(^^)
> > こんなものは特にこだわるべき問題だと思えないのですが、
> > 何か所以があるのでしょうか?
>
> プログラミングというのは、人間が計算機に行わせよう
> としている処理を相手(計算機)が理解できる言語で記述
> する行為です。人間が相手の場合でも同じですが、相手
> 側の言語でどんな文字が使えるかを理解してそのルール
> に従うというのは基本ですね。
いえ、紙の上でもこだわる必要があるのかを聞きたかったのです。
入力時に×をわざわざ全角を使って入力する人はいないでしょう。
C言語のソースコードで×が使ってあったら*だと思うのが普通かと。
入力モードを切り替えるのを忘れてインデントに全角スペースを
含めてしまった人を見たことがあるけど、'×'はさすがに無いです。
キーボード上に乗算記号みたいなのが2つある環境もないでしょうし。
紙の上での5本線の米印と*と×に、ペケをつけなければ
ならないほどの違いがあるように思えないのです。
もしそうなら^を↑と表記してあるPascalの教科書も駄目になりませんか?
--
岩田 雅樹 masaki...@hotmail.com
もちろん紙の上でもこだわる必要があります。自分にと
っての「普通」が誰にでも通用すると思うのは間違いで
しょう。「わざわざ全角を使って入力する人」だってい
くらでもいそうですよ。
> もしそうなら^を↑と表記してあるPascalの教科書も駄目になりませんか?
それは無理筋。
Pascalでは言語仕様上の表現方法は計算機上での表現方
法と独立に決まっています。Pascalのプログラムを計算
機の上で表現するには、何らかの読み替えが必要になる
ということです。たとえばPascalでは予約語は太字で書
かなければなりませんが、それをそのまま計算機上で実
現できるわけではないでしょう?
「わざわざ」ってこともなく入力する時点ではそもそも「文字列」なのですし :)
fgetsあたりで読み込んでいれば、数値に変換するほうが「わざわざ」ですね。
(でもまあ「0123」や「0xff」が入力されたときどうするかっていう問題はありますが)
> #この程度で"誇示"はいやみだよなぁ…
「いやみ」というよりは、出題者/採点者の「自分がよくわかっていないのを
ごまかしたい」気持ちのあらわれでしょう。
(それがstring.hが必要とかいうコメントの文体にも現れていると思います)
> 私の記憶だとC言語はプロトタイプ宣言されていない関数は
> int型を返すはじめてその関数が使用されたときの引数の型を取る
> 関数として使用することができたと思いますが、厳密には違うのでしょうか?
プロトタイプについての扱いは細かいこと言うと「どのCか」によるのでは?
伝統的なCの文法
いわゆる「ANSIのC98」の文法
最新の標準規格「C99」の文法
どれについて考えていますか?
まあ、どれの場合も「初めてその関数が使用されたときの」っていうパターンは
ないです。
> includeディレクティブを使用せずに
>
> int main() {
> printf("Hello world");
> return 0;
> }
>
> なんてやった経験があるんですけど…。
問題ないでしょう(どのCの文法を前提としているかによりますが)。
LSI-C86でコンパイルして実行すると、正常動作しませんね ;-)
> あと、もう1つ質問があります。
> C言語では乗算記号は必ず×ではなく
> *と書かなければならないのでしょうか?
どちらもエラーです。
> ペーパーテストで×と書くと必ず赤ペンで
まあ当然です。「そういうもの」だと思って諦めてください。
「/」については何も思わないのですか?
> #やっぱし教官に嫌われているってのが正しいのか…?(^^;)
まあその程度の教官にその程度の生徒っていうだけのことでしょう。
ヘ_ヘ ____________________________
ミ・・ ミ vo...@merope.pleiades.or.jp
( ° )~ 日下部陽一
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
そういう身勝手な(どこでも通用しないような)「常識」:)を勝手に思い込んで
いるようでは、べつにCに限らず、何の学習においても、いろいろと障害となるで
しょうね。
> 入力モードを切り替えるのを忘れてインデントに全角スペースを
> 含めてしまった人を見たことがあるけど、'×'はさすがに無いです。
それは単に使っている「日本語入力ソフトウェアのできが悪い」というだけのこと
です。まっとうな日本語入力ソフトウェアを使えばいいだけのことです。
まっとうなソフトウェアに入れ換えようとしない、また、まっとうでないソフトウェアを
しぶしぶ使うならばそれを覚悟と対処の上で使わないってのは、そのユーザーの頭の
中も「まっとうではない」ということでしょう。
> キーボード上に乗算記号みたいなのが2つある環境もないでしょうし。
それも自分のごくごく狭い「じょーしき」が通用すると思っている
「ガキのいきがり」的な考えです。
> 紙の上での5本線の米印と*と×に、ペケをつけなければ
米は8本でしょう。
じゃあ「×」の45度ほど傾いたのもOKにしちゃうのですね? :)
イコールの代わりに合同記号をかいてみても「そんなん意味はわかるだろうが」で
通用すると思っているあたりがずいぶん甘いですね。
> もしそうなら^を↑と表記してあるPascalの教科書も駄目になりませんか?
逆では? :)
岩田さんの場合に限らず、プログラムなど採点してると、異なる書き方が出て
くるたびに「これは何点にすべきか」と悩んでしまうことが多いです。公平な
扱いができているか・教育上(出題の意図)から減点すべきかどうかなど...
採点する方の勝手を言わせてもらえば、なるべく素直なプログラムを書いてく
れた方がありがたい(こちらも素直に満点がつけられる)。 オリジナリティを
発揮するのはもう少し先の話にして欲しいと思います。 少なくとも凝った書
き方をしても、点が上がることはないでしょう。
> 紙の上での5本線の米印と*と×に、ペケをつけなければ
> ならないほどの違いがあるように思えないのです。
>
> もしそうなら^を↑と表記してあるPascalの教科書も駄目になりませんか?
「概念上の(数学的な)表記法とプログラムの字面は別」という考え方も一理あ
ります。「本当はこう書きたいんだけど文字セットその他の理由でこういう記
法を使う」ということがあるからです。
AlgolやPascalでは、そういう考え方で、「教科書などで人間向けに表記する
ときの約束」と「実際にコンパイラが受け付ける表記」の2つをそれぞれ定義
していました。したがって、どちらもいちおう「正式な表記法」です。
しかし、Cではそういう「人間専用の表記の約束」が決まっていません。「正
しい」文法の範囲が決まっているのは機械向け(あるいはコンパイラ向け)の表
記法だけです。こちらを使うしかありません。
またもや採点側の都合を言わせていただければ、
・わざとやってるのか単に間違えているのか区別がつかない。
・勝手な文法を「発明する」ことを許したら公平な比較ができない。
(「私の記法ではセミコロンなどつけなくても良いのです」とか言われると...)
・実際にプログラムを動かす際には役に立たない。
などの理由から、勝手な記法を使われると困ってしまいます。(ペケにするで
しょう。)
前田敦司
その際に問題になるのは、
「出題の意図があいまい」「設問が悪い」場合です。
けっこうありがち。
あと、なるべく実用に即した設問ならば、問題文にあいまいな部分があって
出題者が意図した模範的な解答以外に、さまざまなヴァリエイションが出てきた
場合も、
「そりゃたしかにそれでも動くが、速度的に問題が」とかで減点したり、
「問題文通りの答えにはなっているが、メモリーを馬鹿食いするので実用的
ではない」とコメントしたり(減点はしなくても)できますが、
「問題のための問題」っていう感じに無理につくった設問だと、
そういう判断も難しくなりますね。
#なんとなく、文字列にしないでも出来そうな問題のような・・・
>
> その程度のことは理解できてるんですけどね。
> やっぱり信用されてないのか(^^)
>
理解してるなら、手抜きしないで書いた方が良いんじゃないですか?
自分の理解度を示したいならちゃんと書いたほうがよさげですけどねぇ・・・
>
> いえ、紙の上でもこだわる必要があるのかを聞きたかったのです。
> 入力時に×をわざわざ全角を使って入力する人はいないでしょう。
> C言語のソースコードで×が使ってあったら*だと思うのが普通かと。
>
C言語以外でも「×」じゃなくで「*」じゃぁ・・・(^^;)
あなたの常識が他の人の常識か?というとそうじゃないでしょう。
「おれはこういうつもりで書いたんだからそう解釈しろよ」って言われても、
「じゃぁ、最初からかけよ」って話になりそう。
ちなみに私は紙の上でもそう書きますよ。
書いた通りに入力して実行してみろって言われると、動かないのは
ある意味理解してないと思われても仕方なかったりして。
#これがコンピュータをまったく知らん人の前で書いてしまって、
#「×」じゃないの?って突っ込みを良く入れられる・・・(^^;;;
--
********************
from K.Fujimoto
********************
"Kusakabe Youichi" <vo...@merope.pleiades.or.jp> wrote in message
news:void-28090...@newshost.ryukyu.ad.jp...
> In article <8qutkb$cbc$1...@newsgw7.odn.ne.jp>, "Masaki"
<masaki...@hotmail.com> wrote:
> > 入力モードを切り替えるのを忘れてインデントに全角スペースを
> > 含めてしまった人を見たことがあるけど、'×'はさすがに無いです。
>
> それは単に使っている「日本語入力ソフトウェアのできが悪い」というだけのこと
> です。まっとうな日本語入力ソフトウェアを使えばいいだけのことです。
「ATOKを使うやつは馬鹿」?
私はあのなんともいえない無理な変換が好きですが。
> まっとうなソフトウェアに入れ換えようとしない、また、まっとうでないソフト
ウェアを
> しぶしぶ使うならばそれを覚悟と対処の上で使わないってのは、そのユーザーの頭
の
> 中も「まっとうではない」ということでしょう。
残念ながら端末室ではAl-Mailの起動に3分もかかり、
dirが20個のファイルを表示するのに1分もかかるので
生徒はメモ帳でC言語の勉強をしています。
lman(LCI-Cのman)なんて使った日には…
> > キーボード上に乗算記号みたいなのが2つある環境もないでしょうし。
>
> それも自分のごくごく狭い「じょーしき」が通用すると思っている
> 「ガキのいきがり」的な考えです。
はい。ごめんなさい。
> じゃあ「×」の45度ほど傾いたのもOKにしちゃうのですね? :)
それはないでしょ。
--
岩田 雅樹 masaki...@hotmail.com
"Junn Ohta" <oh...@src.ricoh.co.jp> wrote in message
news:8quv8f$3ji$1...@ns.src.ricoh.co.jp...
> fj.comp.lang.cの記事<8qutkb$cbc$1...@newsgw7.odn.ne.jp>で
> masaki...@hotmail.comさんは書きました。
> > いえ、紙の上でもこだわる必要があるのかを聞きたかったのです。
> > 入力時に×をわざわざ全角を使って入力する人はいないでしょう。
> > C言語のソースコードで×が使ってあったら*だと思うのが普通かと。
>
> もちろん紙の上でもこだわる必要があります。自分にと
> っての「普通」が誰にでも通用すると思うのは間違いで
> しょう。「わざわざ全角を使って入力する人」だってい
> くらでもいそうですよ。
なるほど。それなら教育時に「C言語でプログラムを書くときには
半角の*を使え。」と強制する必要がありますね。納得しました。
--
岩田 雅樹 masaki...@hotmail.com
> > #この程度で"誇示"はいやみだよなぁ…
>
> 「いやみ」というよりは、出題者/採点者の「自分がよくわかっていないのを
> ごまかしたい」気持ちのあらわれでしょう。
> (それがstring.hが必要とかいうコメントの文体にも現れていると思います)
そんな感じもします。
> プロトタイプについての扱いは細かいこと言うと「どのCか」によるのでは?
> 伝統的なCの文法
> いわゆる「ANSIのC98」の文法
C89?
> 最新の標準規格「C99」の文法
> どれについて考えていますか?
標準規格書を買うお金が無いのでよくわかりませんが、
図書館にあるのは初版のK&R Cだったような。
> > includeディレクティブを使用せずに
> >
> > int main() {
> > printf("Hello world");
> > return 0;
> > }
> >
> > なんてやった経験があるんですけど…。
>
> 問題ないでしょう(どのCの文法を前提としているかによりますが)。
>
> LSI-C86でコンパイルして実行すると、正常動作しませんね ;-)
当たりです。そうなんですよ。
彼はLSI-C86を使って授業をしているんです。それと擬似C。
> > ペーパーテストで×と書くと必ず赤ペンで
>
> まあ当然です。「そういうもの」だと思って諦めてください。
はい。わかりました。
> > #やっぱし教官に嫌われているってのが正しいのか…?(^^;)
>
> まあその程度の教官にその程度の生徒っていうだけのことでしょう。
確かに。
--
岩田 雅樹 masaki...@hotmail.com
"K.Fujimoto" <jun...@anet.ne.jp> wrote in message
news:39D30327...@anet.ne.jp...
> #なんとなく、文字列にしないでも出来そうな問題のような・・・
ここは笑う場所…。と思って書いたんですけどね(^^)
> 理解してるなら、手抜きしないで書いた方が良いんじゃないですか?
> 自分の理解度を示したいならちゃんと書いたほうがよさげですけどねぇ・・・
そうなんですけど、まあその程度の教官にその程度の生徒なんで
捻くれることができる場所を探してるんですね。
> C言語以外でも「×」じゃなくで「*」じゃぁ・・・(^^;)
> ちなみに私は紙の上でもそう書きますよ。
私の場合、紙の上だとつい×にしちゃいます(笑)
> #これがコンピュータをまったく知らん人の前で書いてしまって、
> #「×」じゃないの?って突っ込みを良く入れられる・・・(^^;;;
これ、僕も経験あります。
--
岩田 雅樹 masaki...@hotmail.com
でも、
>私の記憶だとC言語はプロトタイプ宣言されていない関数は
>int型を返すはじめてその関数が使用されたときの引数の型を取る
>関数として使用することができたと思いますが、厳密には違うのでしょうか?
プロになりたいのでしたら、こういった考えはやめた
方がいいかと思います。
--
田中一嘉
mailto:den...@lycos.ne.jp
--
Peace
> > わざわざ文字列へ変換しなければ解けない問題でしょうか?
>
> > strlenを使うなら#include <string.h>が必要
>
> とコメントされて三角がついてかえってきました。
> #この程度で"誇示"はいやみだよなぁ…
○だったら間抜け先生、△だったら優しい先生、×だったら賢明な先生
ということにしたい(をいをい)
> 私の記憶だとC言語はプロトタイプ宣言されていない関数は
> int型を返すはじめてその関数が使用されたときの引数の型を取る
> 関数として使用することができたと思いますが、厳密には違うのでしょうか?
インタープリターじゃないですかそれじゃ・・・
厳密というかそれ以前の問題です。
プリコンパイルとコンパイルとリンクについてもっと勉強してください。
> includeディレクティブを使用せずに
>
> int main() {
> printf("Hello world");
> return 0;
> }
>
> なんてやった経験があるんですけど…。
コンパイラに優しくされたからって甘えない方がよいです。
> あと、もう1つ質問があります。
> C言語では乗算記号は必ず×ではなく
> *と書かなければならないのでしょうか?
>
> ペーパーテストで×と書くと必ず赤ペンで
> *(正確にはバッテンに横棒)と書き直されます。
>
> これが理由で本当のペケをもらったことがあるなんて話も耳にします。
> こんなものは特にこだわるべき問題だと思えないのですが、
> 何か所以があるのでしょうか?
>
> C言語って難しいなぁ。なんて感心しています。
> プログラミング経験の無い連中はもっと可哀想。
小数点の勉強のためのテスト問題で、
1÷2 を 1/2(2分の1) と答えたらペケと同じ事ですね。
--
Hiroshi Toyoshima mailto:hir...@lib.bekkoame.ne.jp
"Kazuyoshi Tanaka" <den...@lycos.ne.jp> wrote in message
news:8qv9se$qjd$1...@bgsv5905.tk.mesh.ad.jp...
> Masakiさんの<8qupd7$alv$1...@newsgw7.odn.ne.jp>から
> >> 自分のプログラミング技術を誇示したい気持ちもわからないではないが、
> >> わざわざ文字列へ変換しなければ解けない問題でしょうか?
> この程度の答えを見て「技術を誇示された」と思う教師は
> 失格でしょう。私だったら徹底的に喧嘩します。
したいと思ってます(^^;
> >私の記憶だとC言語はプロトタイプ宣言されていない関数は
> >int型を返すはじめてその関数が使用されたときの引数の型を取る
> >関数として使用することができたと思いますが、厳密には違うのでしょうか?
> プロになりたいのでしたら、こういった考えはやめた
> 方がいいかと思います。
わかってはいるのですが、Windowsプログラミングに慣れると
string.hがwindows.hの奥深くで暗黙にインクルードされるので
どうしても付け忘れてしまうのです。(tchar.hの中だっけか?)
最近は主にC++を使っているので暗黙の関数宣言(?)みたいなのが
使えないのでこういったコードを書くことはありません。
--
岩田 雅樹 masaki...@hotmail.com
"Peace" <jite...@geocities.com> wrote in message
news:erGA5.40$UR5....@news1.rdc1.kt.home.ne.jp...
> アルファベットの'x', 'X'との区別がしにくいからとか。
なるほど!これは考えていなかった…。
--
岩田 雅樹 masaki...@hotmail.com
そうですね。
> 残念ながら端末室ではAl-Mailの起動に3分もかかり、
> dirが20個のファイルを表示するのに1分もかかるので
> 生徒はメモ帳でC言語の勉強をしています。
まあそういう学校(?)にしてそういう教師や生徒ありってところでしょう。
> lman(LCI-Cのman)なんて使った日には…
LCIって?
そうです、TYPOでした。
> > > includeディレクティブを使用せずに
> > >
> > > int main() {
> > > printf("Hello world");
> > > return 0;
> > > }
> >
> > LSI-C86でコンパイルして実行すると、正常動作しませんね ;-)
>
> 当たりです。そうなんですよ。
特に指定がないかぎり引数をレジスター渡しするからだったように
記憶しています(原因)。で、可変個数の引数を持った関数の場合は
それができなくて、そうではない渡し方をするような指示が書いてある
ようなプロトタイプがあって、それをincludeしておかないと、
呼び出し側と、ライブラリーの関数で引数のやりとりがうまく行かない
とかいう話じゃなかったかな (何十年も前のことなので忘れました)。
> 彼はLSI-C86を使って授業をしているんです。
たしか、試食版なるものがあって個人的に使う分には無料だった気がします。
(すっかり無料になったんだっけ? その後どうなったか知りません)
で、「半角」って何ですか?
で、割り算はどうなんですか?
> 伝統的なCの文法
> いわゆる「ANSIのC98」の文法
> 最新の標準規格「C99」の文法
>> includeディレクティブを使用せずに
>>
>> int main() {
>> printf("Hello world");
>> return 0;
>> }
>>
>> なんてやった経験があるんですけど…。
>問題ないでしょう(どのCの文法を前提としているかによりますが)。
「伝統的なCの文法」以外では未定義動作ですから、
>LSI-C86でコンパイルして実行すると、正常動作しませんね ;-)
ということがあっても不思議ではないですね。もっとも、期待通りの動
作をする処理系の方が多いとは思いますが。
--
片山@PFU
"Hiroshi Toyoshima" <hir...@lib.bekkoame.ne.jp> wrote in message
news:8qvdng$tp$1...@nn-tk103.ocn.ad.jp...
> > includeディレクティブを使用せずに
> >
> > int main() {
> > printf("Hello world");
> > return 0;
> > }
> >
> > なんてやった経験があるんですけど…。
> コンパイラに優しくされたからって甘えない方がよいです。
一度、何らかのC言語について書かれた書籍に目を通すことをお勧めします。
C++とCを勘違いしてはいませんか?
--
岩田 雅樹 masaki...@hotmail.com
"Kusakabe Youichi" <vo...@merope.pleiades.or.jp> wrote in message
news:void-28090...@newshost.ryukyu.ad.jp...
> In article <8qv786$glq$1...@newsgw7.odn.ne.jp>, "Masaki"
<masaki...@hotmail.com> wrote:
> > 「ATOKを使うやつは馬鹿」
>
> そうですね。
何故ですか?
> > 残念ながら端末室ではAl-Mailの起動に3分もかかり、
> > dirが20個のファイルを表示するのに1分もかかるので
> > 生徒はメモ帳でC言語の勉強をしています。
>
> まあそういう学校(?)にしてそういう教師や生徒ありってところでしょう。
痛いなぁ…。
> > lman(LCI-Cのman)なんて使った日には…
>
> LCIって?
ごめんなさい。TYPOです。
--
岩田 雅樹 masaki...@hotmail.com
"Kusakabe Youichi" <vo...@merope.pleiades.or.jp> wrote in message
news:void-28090...@newshost.ryukyu.ad.jp...
> > 当たりです。そうなんですよ。
>
> 特に指定がないかぎり引数をレジスター渡しするからだったように
> 記憶しています(原因)。で、可変個数の引数を持った関数の場合は
なるほど。こんど試してみます。
> > 彼はLSI-C86を使って授業をしているんです。
>
> たしか、試食版なるものがあって個人的に使う分には無料だった気がします。
> (すっかり無料になったんだっけ? その後どうなったか知りません)
これについては知りません。
--
岩田 雅樹 masaki...@hotmail.com
"Kusakabe Youichi" <vo...@merope.pleiades.or.jp> wrote in message
news:void-28090...@newshost.ryukyu.ad.jp...
> In article <8qv7es$gpp$1...@newsgw7.odn.ne.jp>, "Masaki"
<masaki...@hotmail.com> wrote:
> > 私の場合、紙の上だとつい×にしちゃいます
>
> で、割り算はどうなんですか?
これはつい a / b なんて書いてしまいます。
÷なんてのは幼稚園、小学校で使うものじゃなかったっけ?
--
岩田 雅樹 masaki...@hotmail.com
入力行の先頭から空白文字と'0'を読み飛ばして、
数字の文字数をカウントした方がスマートです。
log10では誤差が心配。(^^;
------------------------
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 10進文字列の正規化した桁数を表示する。
// 桁数の上限は、buffサイズ-1。
//
int main()
{
char buff[100];
char *p;
int nCount = 0;
if( fgets( buff, sizeof(buff), stdin ) == NULL ){
printf( "\a*** Input error. ***\n" );
return 1;
}
if( !strchr( buff, '\n' ) ){
printf( "\a*** String too long. ***\n" );
return 1;
}
for( p = buff; *p && isspace(*p); ++p )
;
while( *p == '0' ) {
++p;
nCount = 1;
}
# if 0 // 16進はパス。
if( nCount && (*p == 'x' || *p == 'X') ){
++p;
} else {}
# endif
if( isdigit(*p) ){
nCount = 0;
}
while( *p && isdigit(*p) ) {
++p;
++nCount;
}
printf( "Number length = %d\n", nCount );
return 0;
}
------------------------
// 結果 テストパターン
// 1 "1"
// 3 "123"
// 1 " 4"
// 2 "12 345"
// 1 "0"
// 1 "0000000"
// 3 "0000123"
// 1 "00 0123"
// 0 ""
// 0 "ABC"
// 0 "ABC 1"
------------------------
0000123を10進と考えると問題ありませんが、
0123を8進と考えると10進では2桁。(--;
8進表現での桁数と考えると、4桁でしょうか?
# この辺は仕様。(;_;
--
山口@福岡 <hy...@mx7.tiki.ne.jp>
# ウララ~(;_;/
--
山口@福岡 <hy...@mx7.tiki.ne.jp>
ふと思ったことですが…。
>>「ATOKを使うやつは馬鹿」?
>>私はあのなんともいえない無理な変換が好きですが。
「プログラマはATOKを使わない」とか「ATOKは馬鹿」とか昔よく聞きました。
これって一般的だったのでしょうか? //一般的の定義と適用範囲にもよりますが…。
# 少なくとも私が常用しているatok12は少なくとも変換精度は悪くないと思いますが。
# atokを上回るIMEってあるのでしょうか…。あったら早速乗り換えるのですが。
/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
/ hik...@mrh.biglobe.ne.jp /
/ 江畠 隆行(Ebata,Takayuki) /
/ 東京都調布市在住 /
/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
わからないところも馬鹿たるゆえんでしょう :)
>> > includeディレクティブを使用せずに
>> >
>> > int main() {
>> > printf("Hello world");
>> > return 0;
>> > }
>> >
>> > なんてやった経験があるんですけど…。
>> コンパイラに優しくされたからって甘えない方がよいです。
>一度、何らかのC言語について書かれた書籍に目を通すことをお勧めします。
>C++とCを勘違いしてはいませんか?
C の文法を理解していないことを自覚されることを強くお奨めします。
--
片山@PFU
×は幼稚園ではないのですね? :)
と感じるあたりが馬鹿なのでは?
# Cには関係ない話だと思いますが。
> # atokを上回るIMEってあるのでしょうか…。
とまで思っているのですね :)
fj.comp.lang.c の <8qutkb$cbc$1...@newsgw7.odn.ne.jp> の
記事において 2000年09月28日(木) 16時56分53秒頃、
"Masaki" <masaki...@hotmail.com>さんは書きました。
>その程度のことは理解できてるんですけどね。
>やっぱり信用されてないのか(^^)
まあ、そういう(レベルと重要度の低い)「信用」を前提にしてしまっては、
そもそも試験なんて成り立たなくなりますんで。
中学のころ、社会科のテストで、固有名詞でない単語で漢字を一つ間違えて
(というか「とある漢字の書き方を間違えて覚えていて」)
減点された記憶があります俺。まぁそんなもんだわな。
#スポーツの試合も似てるかな。
どうせ誇示(笑)するなら、そういう細かいところも
間違えず厳密に把握しているサマを誇示(=表現)するほうが、
よろしいかと思います。アラユル意味で。
> 私の場合、紙の上だとつい×にしちゃいます(笑)
char ×p; /× 文字へのポインタ ×/
紙の上でも見たくないなあ
--
みやざき
sh...@miyazaki.email.ne.jp
---------------------------------
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define DEBUGMODE (0)
#if DEBUGMODE
#include <conio.h>
#define InputWait() getch()
#else
#define InputWait() while(0)
#endif
#define ERR_NONE (0)
#define ERR_INPUT (1)
#define ERR_LARGE (2)
// 10進の文字列の桁数を正規化する。
// UINT_MAX まで計数可能。
// ただし、入力処理等の限界は処理系による。
//
#define NOTEND (ch != EOF && ch != '\n')
#define InputCh (ch = fgetc(stdin))
int check( void ){
int ch;
unsigned int uCount = 0;
// 空白スキップ。
while( (ch = fgetc(stdin)) != EOF
&& ch != '\n'
&& isspace(ch) )
;
ungetc( ch, stdin );
// 符号スキップ。連続していれば無制限。
while( NOTEND
&& (ch = fgetc(stdin))
&& (ch == '+' || ch == '-') )
;
ungetc( ch, stdin );
// '0' 圧縮。
while( NOTEND
&& (ch = fgetc(stdin))
&& ch == '0' ){
uCount = 1;
;
}
ungetc( ch, stdin );
# if 0 // 16進の場合はパス。
if( NOTEND
&& (ch = fgetc(stdin))
&& (ch == 'x' || ch == 'X') ){
} else {}
# endif
if( NOTEND
&& (ch = fgetc(stdin))
&& isdigit(ch) ){
uCount = 0;
}
ungetc( ch, stdin );
// 数値カウント。
while( NOTEND
&& (ch = fgetc(stdin))
&& isdigit(ch) ){
if( ++uCount == 0 ){
return ERR_LARGE;
}
}
if( uCount == 0 ){
return ERR_INPUT;
}
# if 0 // 実数は未実装
// "."
if( NOTEND
&& (ch = fgetc(stdin))
&& ch == '.' ){
// 小数カウント。
while( NOTEND
&& (ch = fgetc(stdin))
&& isdigit(ch) ){
if( ++uCount == 0 ){
return ERR_LARGE;
}
}
}
# endif
printf( "Number Length = %u\n", uCount );
return ERR_NONE;
}
int main()
{
switch( check() ){
case ERR_NONE:
InputWait();
return 0;
default:
printf( "\a*** Unknown Error. ***\n" );
break;
case ERR_INPUT:
printf( "\a*** Input Error. ***\n" );
break;
case ERR_LARGE:
printf( "\a*** Number too large. ***\n" );
break;
}
InputWait();
return 1;
}
---------------------------------
// テストパターン
// 1 "1"
// 3 "123"
// 1 " 4"
// 2 "12 345"
// 1 "0"
// 1 "0000000"
// 3 "0000123"
// 1 "00 0123"
// err ""
// err " "
// err "ABC"
// err "ABC 1"
// err "+"
// 1 "+1"
// 1 "-2"
// 3 "--123"
// 2 "+-+12"
// 2 "+++000012"
---------------------------------
スマートじゃ無い。(;_;
実数だったらどうするの?
ex. "12.345"
ex. "12.000"
ex. "3.000e-12"
コンマは?
ex. "1,024"
--
山口@福岡 <hy...@mx7.tiki.ne.jp>
岩田さん、こんにちは。
> printf("Hello world");
> なんてやった経験があるんですけど…。
最大の問題点は実際にコンパイルを経験せずに本だけで勉強させられているとこ
ろでしょうね。
規格から言うと"Hello world"がchar *であってintではない事ですね。これでは
アドレス(=ポインター)をintに直す時に上位桁を削られてしまうマシンがあるんで
す。Cの本から変数の型と実際のサイズを参照すると良いかもしれませんね。
> あと、もう1つ質問があります。
> C言語では乗算記号は必ず×ではなく
> *と書かなければならないのでしょうか?
>
> ペーパーテストで×と書くと必ず赤ペンで
> *(正確にはバッテンに横棒)と書き直されます。
>
> これが理由で本当のペケをもらったことがあるなんて話も耳にします。
> こんなものは特にこだわるべき問題だと思えないのですが、
> 何か所以があるのでしょうか?
ここに投稿されると言うことはパソコンを持っているか使用できる環境にあるの
でしょうか?。まずCが認識できる文字はASCIIコードで示されるアルファベット・数
字・記号のみです、いわゆる半角文字と言われる文字の中でカナをのぞいた文字で
す、これらは全て1バイトの文字です。例えば"×"をstrlen("×");のようにして長さ
を計ると、2になるはずです。このようにstrlen("?");で調べて2以上になる文字は文
字列の中でしか使用できません。多バイト文字とかマルチバイト文字とか漢字とか言
われるものでコンピュータの利便性を高めるため導入されたもので、実は20年ぐらい
の歴史しかないんです(^0_0^)。コンピュータ言語のほとんどは外国で作成されたも
ので6×16-1=95文字しか使用しないのですは。
20年前に普通のプリンタと言うと「!"#$%&'()*+,-./0123456789:;<=>?@A~
Z[\]^_」しか打てなかったりしてたんですよ(^○^)。しかも小文字と大文字は選択で
両方打てなかったり記号も歯抜けだったり。なんせメモリーも高価だったから1文字
入れると何バイト消費するからこの文字は抜こうとか(^○^)。
'*'(アステリスク)「バッテンに横棒」もJIS規格書に載っているのは「バッテン
に縦棒」ですね~(^0_0^)。キーボードによって違うのがまた不思議なんだなこりゃ
(^○^)。多分蛍光管表示機の影響だな(^0_0^)うん。
"KATAYAMA Yoshio" <ka...@pfu.co.jp> wrote in message
news:KATE.00Se...@sims211.trad.pfu.co.jp...
痛っ。やっぱ調子こくとしっぺ返しを食らうか(^^;)
"Hiroshi Toyoshima" <hir...@lib.bekkoame.ne.jp> wrote in message
news:8qvdng$tp$1...@nn-tk103.ocn.ad.jp...
> > 私の記憶だとC言語はプロトタイプ宣言されていない関数は
> > int型を返すはじめてその関数が使用されたときの引数の型を取る
> > 関数として使用することができたと思いますが、厳密には違うのでしょうか?
> インタープリターじゃないですかそれじゃ・・・
> 厳密というかそれ以前の問題です。
> プリコンパイルとコンパイルとリンクについてもっと勉強してください。
このコメントは間違いだと思いますが、どうですか?
今のC言語の標準については知りません。
未定義動作がどのような範囲のことをさすのかも知りません。
<string.h>抜きの
int strlen(const char*);
int main() {
return strlen("test");
}
の動作が未定義になるのですか?
strlenの定義が環境によって異なるのでしょうか?
それとも、暗黙の宣言(?)の結果が未定義になるのですか?
初版のK&R Cでは有効なのでしょうか?
よろしければお教えください。
--
岩田 雅樹 masaki...@hotmail.com
From: vo...@merope.pleiades.or.jp (Kusakabe Youichi)
Message-ID: <void-28090...@newshost.ryukyu.ad.jp>
の記事を引用します。
>> 入力モードを切り替えるのを忘れてインデントに全角スペースを
>> 含めてしまった人を見たことがあるけど、'×'はさすがに無いです。
>
>それは単に使っている「日本語入力ソフトウェアのできが悪い」と
>いうだけのことです。まっとうな日本語入力ソフトウェアを使えば
>いいだけのことです。
えっと日下部さん、「入力モードを切り替えるのを忘れる」とか
「×と書いてあるのをそのまま入力する」のがなぜ「日本語入力
ソフトウェアの問題」になるのでしょうか? (^^;
単に入力する人の問題だと思うのですが。
>まっとうなソフトウェアに入れ換えようとしない、また、まっとうで
>ないソフトウェアをしぶしぶ使うならばそれを覚悟と対処の上で
>使わないってのは、そのユーザーの頭の中も「まっとうではない」と
>いうことでしょう。
「まっとうな日本語入力ソフトウェア」なら「入力モードを
切り替えるのを忘れさせない」とか「×を入力させない」ので
しょうか?
#それとも自動で切替/置換してくれるとか? (^^;
--
┌──────┬───────────────────────┐
│ Violence │ やまもとうえんず 山本迂遠途 Wens YAMAMOTO │
│ Of │ メールアドレス we...@wens.club.ne.jp │
│ Traitorous │ マイページ http://www2s.biglobe.ne.jp/~wens/ │
│ Enthusiasm │ 私の記事への返事は、できるだけNetnewsでね♪ │
└──────┴───────────────────────┘
ならないとでも思っているのですか?
それはそう手の不便なtoolを使って、
まっとうな感覚が麻痺している証拠でしょう。
そんな「切り替えるのを忘れる」ようなことが起きるtoolは
はっきり言ってでき損ないでしょう。
件のユーザーはWindowsを使っているみたいですが、
Windowsみたいな環境でさえ、ちゃんとした日本語入力は存在するわけで、
そういうのを使えば、
「入力モードを切り替えるのを忘れて変な文字が入ってしまう」ことは
ありえないのです。
確実に道具のせいですね。
(まあそんな道具を選択するユーザーの頭の悪さのせいでもあるわけですが、
直接的には道具のせいです)
> 「まっとうな日本語入力ソフトウェア」なら「入力モードを
> 切り替えるのを忘れさせない」とか
> #それとも自動で切替/置換してくれるとか?
ずいぶんまぬけな人ですねえ。
常識を知るべきです。
だったらちゃんと勉強すればいいのに。
> 初版のK&R Cでは有効なのでしょうか?
それはまだ標準規格が決まっていないころですね。
ですからそれに文法がたまたま同じコンパイラーでは同じふうに動く、
というだけのことでしかなかったわけです。
最大の問題点は、規格を読まないことでは..。
> 規格から言うと"Hello world"がchar *であってintではない事ですね。これでは
> アドレス(=ポインター)をintに直す時に上位桁を削られてしまうマシンがあるんで
> す。Cの本から変数の型と実際のサイズを参照すると良いかもしれませんね。
なんでintに直すんですかー?
最大の問題は、printfが可変引数関数であることです。
可変引数関数をプロトタイプ宣言無しで呼び出すことは未定義です。
>> 3.3.2.2 Function calls
>> ~
>> If the function is
>> defined with a type that includes a prototype, and the types of the
>> arguments after promotion are not compatible with the types of the
>> parameters, or if the prototype ends with an ellipsis ( ", ..." ), the
>> behavior is undefined.
(訳)関数定義がプロトタイプを含んでおり引数の格上げ後の型がその引数の型と
適合しないか、あるいはプロトタイプが省略符号(",...")で終っている場合
その振舞は未定義である。
"Hello world"を渡すこと自体は、printfの本来の定義が
int printf(const char *format, ...);
なので、const char*が格上げ後の型と適合するからプロトタイプ
宣言がなくても問題がないんです。
> > あと、もう1つ質問があります。
> > C言語では乗算記号は必ず×ではなく
> > *と書かなければならないのでしょうか?
> >
> > ペーパーテストで×と書くと必ず赤ペンで
> > *(正確にはバッテンに横棒)と書き直されます。
> >
> > これが理由で本当のペケをもらったことがあるなんて話も耳にします。
> > こんなものは特にこだわるべき問題だと思えないのですが、
> > 何か所以があるのでしょうか?
>
> ここに投稿されると言うことはパソコンを持っているか使用できる環境にあるの
> でしょうか?。まずCが認識できる文字はASCIIコードで示されるアルファベット・数
> 字・記号のみです、
ASCIIコードに含まれない、円記号('¥')記号やチルダ(' ̄')記号
をC言語のソースコードに使用することは当然、規格に適合しない
のですよね。
--
§NTTS○FT 技術開発部エレクトロニックコマース技術センター 上原 潤二 §
PGP Key fingerprint = B7 C0 CB 1F 1C 88 69 2A 25 36 8A EE 93 A3 61 72
# Folloowup-to fj.comp.input-method です。
At 28 Sep 2000 14:01:49 GMT,
Takayuki Ebata wrote:
> # atokを上回るIMEってあるのでしょうか…。あったら早速乗り換えるのですが。
vje かと。
<http://www.vacs.co.jp/>
--
斉藤直彦 <http://www.isoternet.org/%7En_saito/>
日本イソターネット協会 大名古屋支部 お茶汲係 <n_s...@isoternet.org>
名古屋 Linux 使いの会 山岳部 配車係 <n_s...@nagoyalinux.org>
Project Silicon Linux エソカイ部 末席補佐 <n_s...@si-linux.org>
変数名が変わったらどうするんですか?
> // '0' 圧縮。
8進数はどうするの?
> while( NOTEND
> if( ++uCount == 0 ){
それにしても「(」の外側に空白開けないくせに、
なんで内側にわざわざあけるんだろう?
端末用の「(」のフォントをデザインした人が泣きそうだ ;)
> && (ch = fgetc(stdin))
その意味ではここは統一とれていないし。
> && isdigit(ch) ){
関数の引数は例外なのかなー
と思うと、
> printf( "Number Length = %u\n", uCount );
そうでもなかったり。
> コンマは?
> ex. "1,024"
ドイツとかいくつかの国では、
「,」が小数点で「.」が0桁ごとの区切りですよね。
え、どうしてintが関係あるんですか?
> 例えば"×"をstrlen("×");のようにして長さを計ると、2になるはずです。
Unicodeでもですか?
> コンピュータ言語のほとんどは外国で作成されたも
> ので6×16-1=95文字しか使用しないのですは。
「-2」では? (そして空白)
>
> 20年前に普通のプリンタと言うと「!"#$%&'()*+,-./0123456789:;<=>?@A~
> Z[\]^_」しか打てなかったりしてたんですよ(^○^)。
> しかも小文字と大文字は選択で両方打てなかったり記号も歯抜けだったり。
それはASCIIなコンピューターをEBCDICなプリンターに繋いでいたのかも :)
> '*'(アステリスク)「バッテンに横棒」もJIS規格書に載っているのは「バッテン
> に縦棒」ですね~(^0_0^)。
TeXだと両方ありますね :)
個人的に好きなのは WX(G)。 DOSの頃から愛用しています。
http://www.aisoft.co.jp/
(変換精度は・・・、どうだろう ? (^_^;)
区別がしにくいのは他にもあります。
'I' と 'l'と'|'と'1'、'O'と'0' 等。
# 'q'と'9'、'Z'と'2'、'S'と'5'、'-'と半角の'ー'も入るかな ?
# '6'とひっくり返った'9' もかな ? (^_^;
区別には、色々な方法があったと思うけど
'0'は'O'と間違わない為に、'0'は斜め線を入れておくとか
'O'の上に横線を引くとか。
# う~む、紙に書くよりエディタで書いた方が簡単だな・・・ (^_^;
# 最近、コーディングシートって使ってないし。 < 私
lex 使った方がはるかに見やすくて、修正もしやすいプログラムが書けます。
実数なら
<INITIAL>[0-9]*\.[0-9]+ {....}
を追加するだけでできるし
@@@ -----------------------------------------------
口口っ (株) シーエーシー 金融システム第2事業部
ん おおさき たかゆき ohs...@cac.co.jp
fj.comp.lang.cの記事<20000928230149.91...@mrh.biglobe.ne.jp>で
hik...@mrh.biglobe.ne.jpさんは書きました。
> 「プログラマはATOKを使わない」とか「ATOKは馬鹿」とか昔よく聞きました。
> これって一般的だったのでしょうか? //一般的の定義と適用範囲にもよりますが…。
MS-DOSのころのATOKはBIOSレベルでキー入力に介入して
きたので、生のキーデータを読みたいシステムあるいは
アプリケーションプログラムの開発者には嫌われる傾向
がありました。
あとATOK6やATOK7のころは構文解析能力でも機能性でも
トップランクの製品と比較して確実に劣っていましたね。
文節長の修正は先頭文節でしかできなかったし、一度に
入力できる文字数も40文字に満たなかったし。入力文字
数の問題はだいぶあとまで改善されませんでした。
> # 少なくとも私が常用しているatok12は少なくとも変換精度は悪くないと思いますが。
以前DOS/Vマガジンに書いた記事でATOK13とMS-IME2000
の変換精度の比較を行ったのですが、さまざまな文章を
取りまぜて37,000文字ほど入力・変換してみた結果、
文節区切り誤り 同音語選択誤り
ATOK13 121 154
MS-IME2000 62 199
という結果になりました。その他の製品とは比較してい
ないのですが、構文解析能力に関してはVJE-DeltaやWXG
などとくらべてかなり劣るなあ、というのが個人的な印
象です。
--
太田純(Junn Ohta) (株)リコー/新横浜事業所
oh...@sdg.mdd.ricoh.co.jp
> > 最大の問題点は実際にコンパイルを経験せずに本だけで勉強させられている
とこ
> > ろでしょうね。
>
> 最大の問題点は、規格を読まないことでは..。
その通り。たぶんこの先生はlintかコンパイラのワーニングを元に点数を付けて
るのかな。
> > 規格から言うと"Hello world"がchar *であってintではない事ですね。これ
では
> > アドレス(=ポインター)をintに直す時に上位桁を削られてしまうマシンがあるん
で
> > す。Cの本から変数の型と実際のサイズを参照すると良いかもしれませんね。
>
> なんでintに直すんですかー?
>
> 最大の問題は、printfが可変引数関数であることです。
> 可変引数関数をプロトタイプ宣言無しで呼び出すことは未定義です。
なるほど、確かに。私が言いたかったのは、プロトタイプ宣言無しで呼び出すと
全ての引数と戻り値がintであると仮定され。したがってポインターがintより長い場
合intに切り捨てられてしまうと言うことです。可変引数関数の問題からすれば些細
なことですね(^○^)。
> "Hello world"を渡すこと自体は、printfの本来の定義が
>
> int printf(const char *format, ...);
>
> なので、const char*が格上げ後の型と適合するからプロトタイプ
> 宣言がなくても問題がないんです。
これは問題があります。...を含む関数は処理系によっては特別な処置が施され
ます。引数をスタックに積む順番が最初の引数から積む処理系では多くの場合最初の
引数にそのままformatが入ってきますが。逆に最後の引数から積む処理系では、可変
引数の数を最初に積むものが有ります(これが特別な処置です)、そうしないとformat
引数の位置が特定できないからです。この場合formatの値を引数の数と解釈してしま
う可能性があります、この時動作はむちゃくちゃになりますな(^_^;)。...を含む関
数のプロトタイプは(機種依存では有りますが)必須のものと思っていた方が良いです
よ(^0_0^)。
僕はCのコードもC++でコンパイルすることをお勧めしています。全ての関数には
プロトタイプが必須のものとなりますから…、思わぬバグが見つかることも多々有り
ましたし(^○^)。
<39D30327...@anet.ne.jp>の記事において
jun...@anet.ne.jpさんは書きました。
junkey> C言語以外でも「×」じゃなくで「*」じゃぁ・・・(^^;)
APL は × です. もちろん割り算は ÷.
* とか / には別の意味があります.
--
名古屋大学 工学部 電子工学科 平田研究室
小野 孝男
訂正です、
> #define InputWait() while(0)
は、
#define InputWait() do{}while(0)
ですね。m(__)m
実行には関係ないのですが、
> # if 0 // 実数は未実装
の部分は、
> if( uCount == 0 ){
の前で、ungetcが必要。(^^;
--
山口@福岡 <hy...@mx7.tiki.ne.jp>
int ch; を書いたのも、それを利用する
ソースを書いたのも、私自身のつもりですけど。:-(
それとも変数名って勝手に変わるんですか?(/_;
> > // '0' 圧縮。
>
> 8進数はどうするの?
news:8qvhda$mal$1...@nntp-kyusyu.tiki.ne.jp
で、既に書いた通り、仕様です。:-)
2進や16進にも対応してません、
ローマ数字や漢数字も同様です、
isdigit()以外は数字と見ていません。m(__)m
> > && (ch = fgetc(stdin))
>
> その意味ではここは統一とれていないし。
予約語を色付けするエディタを使うと、
意味がわかると思います。:-)
インデントとプログラムの実行とは、
相関がありませんよ。:-P
--
山口@福岡 <hy...@mx7.tiki.ne.jp>
それは初耳です。
いったいどこの世界にそんな仕様のCコンパイラーが存在したのですか?
# パラレルワールド?
> したがってポインターがintより長い場
> 合intに切り捨てられてしまうと言うことです。可変引数関数の問題からすれば些細
> なことですね(^○^)
意味不明です。
> 僕はCのコードもC++でコンパイルすることをお勧めしています。全ての関数には
> プロトタイプが必須のものとなりますから…、思わぬバグが見つかることも
Cでもプロトタイプのない関数の使用とかをエラーにするようなオプションは
たいがいありますし、
それにC++はCのアッパーコンパティブルなわけじゃあないので、
いつでもうまくいくとは限らないし。
"c.g.green" <cg_...@osa.att.ne.jp> writes:
> なるほど、確かに。私が言いたかったのは、プロトタイプ宣言無しで呼び出すと
> 全ての引数と戻り値がintであると仮定され。したがってポインターがintより長い場
> 合intに切り捨てられてしまうと言うことです。可変引数関数の問題からすれば些細
> なことですね(^○^)。
・全ての引数と戻り値がintであると仮定される
ということは、正しいのでしょうか?戻り値がintと仮定されるのはいいです。
引数については「そんなことはない」んじゃないでしょうか?
C89規格には関数プロトタイプがない場合、
char, short, -> int (integral promotion)
float -> double
という変換がなされると書いてあります。ですから少なくともlongやdoubleが
intの幅に切り捨てられると言うことはないし、ポインタについても関数定義
においてポインタを引数として取り出そうとする限りは正しく引数の受け渡し
が行われることが保証されると思いますが(ただし可変引数関数の場合を除く)。
> > int printf(const char *format, ...);
> >
> > なので、const char*が格上げ後の型と適合するからプロトタイプ
> > 宣言がなくても問題がないんです。
自分の言いたかったことは、「"hello world"のような文字列ポインタを、関
数プロトタイプ無しの関数呼び出しにおける引数として渡すことには規格上の
問題がない(ただし可変引数関数の場合を除く)」、ということです。誤解のあ
りうる発言ですみませんでした。ですので、
> これは問題があります。...を含む関数は処理系によっては特別な処置が施され1
> ます。引数をスタックに積む順番が最初の引数から積む処理系では多くの場合最初の
については私も同じ意見です。
> 僕はCのコードもC++でコンパイルすることをお勧めしています。全ての関数には
> プロトタイプが必須のものとなりますから…、思わぬバグが見つかることも多々有り
> ましたし(^○^)。
C99では、やっと暗黙の関数宣言が禁止されるようになりましたが、
プロトタイプは必須にはなってませんね。
「自分だからいい」っていうもんじゃあないです。
それじゃあ某岩田君と同じレヴェルです :)
「きのうのぷろぐらむは他人のプログラム」は有名なセリフです。
> 2進や16進にも対応してません、
すればいいのに
> > > && (ch = fgetc(stdin))
> >
> > その意味ではここは統一とれていないし。
>
> 予約語を色付けするエディタを使うと、意味がわかると思います。:-)
いや、そんなことを言っているのではなく、空白の意味です。
"Kusakabe Youichi" <vo...@merope.pleiades.or.jp> wrote in message
news:void-29090...@newshost.ryukyu.ad.jp...
> In article <8qvuan$4dt$4...@news.telewaynet.ad.jp>, Wens YAMAMOTO
<we...@wens.club.ne.jp> wrote:
> 件のユーザーはWindowsを使っているみたいですが、
> Windowsみたいな環境でさえ、ちゃんとした日本語入力は存在するわけで、
> そういうのを使えば、
> 「入力モードを切り替えるのを忘れて変な文字が入ってしまう」ことは
> ありえないのです。
> 確実に道具のせいですね。
> (まあそんな道具を選択するユーザーの頭の悪さのせいでもあるわけですが、
> 直接的には道具のせいです)
そうなんです。使うほうの頭が悪いのであんまり気にならないのです。
恐らく他のIMEを使っても「お前にはもったいない」とIMEに怒られるでしょう(笑)
--
岩田 雅樹 masaki...@hotmail.com
標準規格書はどこで入手できますか?
Draftでいいので無償で参照できる場所を教えてくれると助かります。
"UEHARA Junji" <ueh...@po.ntts.co.jp> wrote in message
news:uwvfve...@po.ntts.co.jp...
> > > int printf(const char *format, ...);
> > >
> > > なので、const char*が格上げ後の型と適合するからプロトタイプ
> > > 宣言がなくても問題がないんです。
>
> 自分の言いたかったことは、「"hello world"のような文字列ポインタを、関
> 数プロトタイプ無しの関数呼び出しにおける引数として渡すことには規格上の
> 問題がない(ただし可変引数関数の場合を除く)」、ということです。誤解のあ
> りうる発言ですみませんでした。ですので、
LSI-C 3.30c では
int printf(const char*, ...);
int main() { printf("Hello"); }
や
#include <stdio.h>
int main() { printf("Hello"); }
は動きますが、
int printf(const char*);
int main() { printf("Hello"); }
は動きません。(何も出力されません)
つまり、C89では可変引数関数の場合は暗黙の宣言が効かない処理系が
存在しても仕様的には何ら問題がないが、好ましくないながらも
int main() { return strlen("test"); }
は正常に動作することが期待されると解釈してもいいのでしょうか?
それだと、図書室にあるのは初版だけなのに
「C言語を学ぶなら図書室にあるK&R Cを読め」と
説いている先生の発言は好ましくないと思えるのですが、
これについてはどうでしょう?
C89以降に出た2版をいれてもらうか、
初版を読めと説くのをやめてくれと要求したほうがいいでしょうか?
また、C99を現行の標準として考えた場合に、
「本を見分ける方法。void main()と書いてある本は誤り。買ってはいけない」
という先生の発言は正しいのでしょうか?
C99では「mainはintを返す(returnが無くとも0を返す)ことが期待される」
などとかかれているという噂を聞いたことがあります。
void main() {}
をコンパイルした場合、gccでは何も返さず、
g++では0が返されているようなのですが、
これはC++だけでの話なのでしょうか?
> > 僕はCのコードもC++でコンパイルすることをお勧めしています。全ての関数
には
> > プロトタイプが必須のものとなりますから…、思わぬバグが見つかることも多々
有り
> > ましたし(^○^)。
>
> C99では、やっと暗黙の関数宣言が禁止されるようになりましたが、
> プロトタイプは必須にはなってませんね。
C89では暗黙の関数宣言は禁止されてはいないということでしょうか?
--
岩田 雅樹 masaki...@hotmail.com
"Shira" <XLD0...@nifty.ne.jp> wrote in message
news:8r0stm$48g$1...@nn-os102.ocn.ad.jp...
> 区別がしにくいのは他にもあります。
> 'I' と 'l'と'|'と'1'、'O'と'0' 等。
> # 'q'と'9'、'Z'と'2'、'S'と'5'、'-'と半角の'ー'も入るかな ?
> # '6'とひっくり返った'9' もかな ? (^_^;
あと、小文字の d が cl に見えるという苦情を受けたことがあります。
単に字が汚いだけなんですけど…。
> 区別には、色々な方法があったと思うけど
> '0'は'O'と間違わない為に、'0'は斜め線を入れておくとか
> 'O'の上に横線を引くとか。
そういや昔は斜線入ってたなぁ > 0
入らなくなったのはWindowsを使いだしてからか?
> # う~む、紙に書くよりエディタで書いた方が簡単だな・・・ (^_^;
> # 最近、コーディングシートって使ってないし。 < 私
コーディングシートって何ですか?
--
岩田 雅樹 masaki...@hotmail.com
LSI-Cでは可変個の引数の関数かどうかで、
呼び出しの(時の引数の渡し方の)形式が異なるので、
実際にはライブラリー関数のprintf()は可変個の引数の関数として
定義されているので、つじつまが合わず(呼び出す側は引数を
レジスターで渡そうとし、受け取る側はスタックからとろうとするので)、
正常に動作しないだけでしょう。
> それだと、図書室にあるのは初版だけなのに
> 「C言語を学ぶなら図書室にあるK&R Cを読め」と
> 説いている先生の発言は好ましくないと思えるのですが、
自分の教師がどうのはすでにもう関係ないでしょう。
くだらない教書を「くだらない」と言うための根拠をあつめるのを
喜々としてやっている生徒などはもっとくだらないのは当然です。
(文法書には書いてありませんが)
> C89以降に出た2版をいれてもらうか、
それぐらい自分で買えよアホ。
第1版が ISBN 0-13-110163-3
第2版が ISBN 0-13-110362-8
そんなところで「手元にC89の本がない」
図書館にない、どこで売ってるかわからん、金がない.etc.と
くだらない言い訳して「いのがれ」しようたって、理由にならんのです。
> 初版を読めと説くのをやめてくれと要求したほうがいいでしょうか?
自分の理解力不足まで教師におしつけるのはやめるべきでしょう。
> また、C99を現行の標準として考えた場合に、
> 「本を見分ける方法。void main()と書いてある本は誤り。買ってはいけない」
> という先生の発言は正しいのでしょうか?
>
> C99では「mainはintを返す(returnが無くとも0を返す)ことが期待される」
> などとかかれているという噂を聞いたことがあります。
じゃあC89ではどう書いてあるのですか?
> C89では暗黙の関数宣言は禁止されてはいないということでしょうか?
C89の内容について、書籍も規格書もしらべずに
そんなふうにいちいち質問してたら50や100の質問では足りないはずです。
そんなことで無駄な労力をまわりにかける前に、
文法書なりを読んだのちに理解できない部分を質問するべきでしょう。
そうすれば「そんなこともわからないのか、書いてあるだろう」と
書いてある場所を教えてもらえることでしょう。
fj.comp.lang.c の <8qv78b$glq$3...@newsgw7.odn.ne.jp> の
記事において 2000年09月28日(木) 19時41分12秒頃、
"Masaki" <masaki...@hotmail.com>さんは書きました。
>図書館にあるのは初版のK&R Cだったような。
縮刷版(有るのかよ)を書庫に仕舞っておくものなら初版でもいいけど、
表の棚にある奴が初版だとボク泣いちゃう。
fj.comp.lang.c,japan.yoso の <void-29090...@newshost.ryukyu.ad.jp> の
記事において 2000年09月29日(金) 07時25分41秒頃、
Kusakabe Youichiさんは書きました。
>> えっと日下部さん、「入力モードを切り替えるのを忘れる」とか
>> 「×と書いてあるのをそのまま入力する」のがなぜ「日本語入力
>> ソフトウェアの問題」になるのでしょうか?
>
>ならないとでも思っているのですか?
>それはそう手の不便なtoolを使って、
>まっとうな感覚が麻痺している証拠でしょう。
>そんな「切り替えるのを忘れる」ようなことが起きるtoolは
>はっきり言ってでき損ないでしょう。
「日本語入力ソフトウェア」とか「tool」とかいう語は、
ここではナニ(どこまで)を指してるんでしょうか?
delphiのTEditなどの文字列(?)入力コンポには
ImeModeというpropertyがあり、「入力モードを切り替える」を
自動的にやってくれるときのポリシー(ってのか)を
プログラマが簡単に設定できますが、
この場合は、「tool」という語はTEditのようなものを(も)指すと考えて、
よいですか?
>> 「まっとうな日本語入力ソフトウェア」なら「入力モードを
>> 切り替えるのを忘れさせない」とか
>> #それとも自動で切替/置換してくれるとか?
>
>ずいぶんまぬけな人ですねえ。
>常識を知るべきです。
常識なんか(笑)よりも、どっかに明文化された資料ないですかね?
#って、fjがまさにソレか(笑)
fj.comp.lang.c の <8r13v5$ooo$1...@nntp-kyusyu.tiki.ne.jp> の
記事において 2000年09月29日(金) 04時00分00秒頃、
"H.Yamaguchi" <hy...@mx7.tiki.ne.jp>さんは書きました。
>"Kusakabe Youichi" <vo...@merope.pleiades.or.jp> wrote in message
>news:void-29090...@newshost.ryukyu.ad.jp...
>> > #define NOTEND (ch != EOF && ch != '\n')
>> 変数名が変わったらどうするんですか?
>
> int ch; を書いたのも、それを利用する
>ソースを書いたのも、私自身のつもりですけど。:-(
> それとも変数名って勝手に変わるんですか?(/_;
それならせめて、#define をchが存在する関数の中だけで効くようにする
(って#undefを使っても擬似的にしか実現できないが)とか、
#define NOTEND(ch) (ch != EOF && ch != '\n')
ってやることでマクロを変数名の呪縛から解放してあげるとか、
すればいいのに(T_T)
少なくとも、変数名キメウチのマクロが
次の関数(main)まで効いているのが、キモイっす。
>> 区別には、色々な方法があったと思うけど
>> '0'は'O'と間違わない為に、'0'は斜め線を入れておくとか
>> 'O'の上に横線を引くとか。
>
>そういや昔は斜線入ってたなぁ > 0
>入らなくなったのはWindowsを使いだしてからか?
大学時代、授業で使ったプリンタは、回転するボールをハンマーでたたくタイプ
だったのですが、O(おー)と0(ゼロ)が区別がつかないため、先生(当時助教授)が
「O(おー)の上をヤスリでごりごり削った。」そうです。(U の上がすぼまった形)
#わたしはブラインドタッチなので、O と0 をよく間違えます。^^;;
In article <8r1bga$qg4$3...@newsgw7.odn.ne.jp>, masaki...@hotmail.com says...
>標準規格書はどこで入手できますか?
>Draftでいいので無償で参照できる場所を教えてくれると助かります。
++なら http://www.ansi.org あたりからたどって行くと無料で手にはいるの
ですが, C は有料になってるようです。(C++今がチャンス?)
(日本語になるのをまってたんですが、日本語がでる代わりに有料になってし
まった T.T)
#規格関係のドキュメントって(個人で買うには)ばか高いんですよね
> > > #define NOTEND (ch != EOF && ch != '\n')
> > 変数名が変わったらどうするんですか?
>
> int ch; を書いたのも、それを利用する
> ソースを書いたのも、私自身のつもりですけど。:-(
個人で使う分にはなんでも有りです。しかし会社では(-_-;)。ソースが分かりに
くくなりますから。
上原さん、こんにちは。
> ・全ての引数と戻り値がintであると仮定される
>
> ということは、正しいのでしょうか?戻り値がintと仮定されるのはいいです。
> 引数については「そんなことはない」んじゃないでしょうか?
共立出版「プログラミング言語C 第2版」ANSI 規格準拠(1994年10月15日 初版
166刷)の記述によるものですが、最近のものでもないので確証はありません。
> C89規格には関数プロトタイプがない場合、
>
> char, short, -> int (integral promotion)
> float -> double
>
> という変換がなされると書いてあります。ですから少なくともlongやdoubleが
> intの幅に切り捨てられると言うことはないし、ポインタについても関数定義
> においてポインタを引数として取り出そうとする限りは正しく引数の受け渡し
> が行われることが保証されると思いますが(ただし可変引数関数の場合を除く)。
なるほど、どうも上記の本を読んでいて自分の中の常識と矛盾していたのですが
そうゆうことですねm(__)m。
私はどんな時もプロトタイプ宣言をするコーティングしていますし、.cを無条件
に.cppにしてバグ取りしますんで、ここらへんのプロトタイプ宣言をしない時の動作
は…m(__)m。特にCでは同名で別引数の関数があってもリンクできてしまいトラブル
に巻き込まれるので、Cでは組まないようにしています。C++が無いような組み込み環
境でも一旦Windowsで「動かないexe」をプロトタイプチェック用に作っちゃいますか
らね(^○^)。
"ohsaki takayuki" <ohs...@cac.co.jp> wrote in message
news:8r1dma$k...@infonet.sedept.cac.co.jp...
> おおさき@貧乏人です。
>
> In article <8r1bga$qg4$3...@newsgw7.odn.ne.jp>, masaki...@hotmail.com
says...
>
> >標準規格書はどこで入手できますか?
> >Draftでいいので無償で参照できる場所を教えてくれると助かります。
>
> ++なら http://www.ansi.org あたりからたどって行くと無料で手にはいるの
> ですが, C は有料になってるようです。(C++今がチャンス?)
本当ですか? http://webstore.ansi.org/ には$18で販売されてましたよ。
C++ならここにISO/ANSI C++ Draftがあるのでこれを使ってます。
http://www.cygnus.com/misc/wp/index.html
> (日本語になるのをまってたんですが、日本語がでる代わりに有料になってし
> まった T.T)
> #規格関係のドキュメントって(個人で買うには)ばか高いんですよね
$18なら買えなくもないなぁ。前見たときはX3T10とかバカ高かったような気がする。
--
岩田 雅樹 masaki...@hotmail.com
"Kusakabe Youichi" <vo...@merope.pleiades.or.jp> wrote in message
news:void-29090...@newshost.ryukyu.ad.jp...
> In article <8r1bga$qg4$3...@newsgw7.odn.ne.jp>, "某岩田君"
<masaki...@hotmail.com> wrote:
> > LSI-C 3.30c では
> > int printf(const char*);
> > int main() { printf("Hello"); }
> >
> > は動きません。(何も出力されません)
>
> LSI-Cでは可変個の引数の関数かどうかで、
> 呼び出しの(時の引数の渡し方の)形式が異なるので、
> 実際にはライブラリー関数のprintf()は可変個の引数の関数として
> 定義されているので、つじつまが合わず(呼び出す側は引数を
> レジスターで渡そうとし、受け取る側はスタックからとろうとするので)、
> 正常に動作しないだけでしょう。
だからなんだといいたいんです?それがどうだと?(笑)
> > それだと、図書室にあるのは初版だけなのに
> > 「C言語を学ぶなら図書室にあるK&R Cを読め」と
> > 説いている先生の発言は好ましくないと思えるのですが、
>
> 自分の教師がどうのはすでにもう関係ないでしょう。
> くだらない教書を「くだらない」と言うための根拠をあつめるのを
> 喜々としてやっている生徒などはもっとくだらないのは当然です。
> (文法書には書いてありませんが)
わらった。
> > C89以降に出た2版をいれてもらうか、
>
> それぐらい自分で買えよアホ。
アホですみません。
> 第1版が ISBN 0-13-110163-3
> 第2版が ISBN 0-13-110362-8
わざわざ調べてもらい恐縮です。注文する気ないけど。
> そんなところで「手元にC89の本がない」
> 図書館にない、どこで売ってるかわからん、金がない.etc.と
> くだらない言い訳して「いのがれ」しようたって、理由にならんのです。
「いのがれ」?広辞苑にも無い単語ですねぇ…。
頭のいいIMEの変換ミスでしょうか?それ以前の問題でしょうか?(笑)
ハイソサエティーなお方の仰られることはよくわからないです
ハイソサエティーな日本語文法書にはあるのでしょうか?
> > C89では暗黙の関数宣言は禁止されてはいないということでしょうか?
>
> C89の内容について、書籍も規格書もしらべずに
> そんなふうにいちいち質問してたら50や100の質問では足りないはずです。
> そんなことで無駄な労力をまわりにかける前に、
> 文法書なりを読んだのちに理解できない部分を質問するべきでしょう。
> そうすれば「そんなこともわからないのか、書いてあるだろう」と
> 書いてある場所を教えてもらえることでしょう。
どうもすみませんです。気に食わなければ反応しなければいいのに(笑)
とりあえず、記事くらい落ち着いて書いてくださいよ。
--
岩田 雅樹 masaki...@hotmail.com
「アレ」を指しています。
> delphiのTEditなどの文字列(?)入力コンポには
> ImeModeというpropertyがあり、「入力モードを切り替える」を
> 自動的にやってくれるときのポリシー(ってのか)を
> プログラマが簡単に設定できますが、
> この場合は、「tool」という語はTEditのようなものを(も)指すと考えて、
> よいですか?
ですからそれで切り替えられた「入力モード」によって
間違いが生じること「自体」がおまぬけだって言ってるんです。
ですからWindowsの場合は実際に日本語入力を請け負うDLLの問題ですね。
「切り替えてくれない」「切り替えわすれる」とかが問題な以前に、
そういう間違いをしたときに「変な文字が入ってしまう」こと自体が
問題だと何度言っても理解できないのは、やはり変なソフトウェアを使っていて
頭が腐ってしまったのですか?
NOTEND(getc(fp)) とかはどうするのですか?
# 「引数付きマクロの常識」もわきまえましょう。
# これも古いCの悪習ですか? ;-)
>本当ですか? http://webstore.ansi.org/ には$18で販売されてましたよ。
ありがとうございます。$18なら手に入りそうです。
#さらに貧乏にはなりますが... :-)
(以前、日本規格協会経由で ODA や MHS の規格を取り寄せたときにあまりの
高さ(全部で数十万)にびっくりして、以後有料の規格は値段さえ見ませんで
した.)
>C++ならここにISO/ANSI C++ Draftがあるのでこれを使ってます。
>http://www.cygnus.com/misc/wp/index.html
本家の
http://anubis.dkuug.dk/jtc1/sc22/open/n2356/
も、多分内容は一緒
>$18なら買えなくもないなぁ。前見たときはX3T10とかバカ高かったような気がする。
#ああいうものの値段ってどうやって決まるんでしょうか?
"c.g.green" <cg_...@osa.att.ne.jp> writes:
> 河原@日本LSIカード(株)です。
>
> 上原さん、こんにちは。
>
> > ・全ての引数と戻り値がintであると仮定される
> >
> > ということは、正しいのでしょうか?戻り値がintと仮定されるのはいいです。
> > 引数については「そんなことはない」んじゃないでしょうか?
>
> 共立出版「プログラミング言語C 第2版」ANSI 規格準拠(1994年10月15日 初版
> 166刷)の記述によるものですが、最近のものでもないので確証はありません。
うんと、『共立出版「プログラミング言語C 第2版」ANSI 規格準拠(1994年10
月15日 初版> 166刷)』には、関数のプロトタイプがない場合、「全ての引数
がintであると仮定される(そしてそれを超えるサイズのデータはint型のサイ
ズ分に切り捨てられる)」と記述されている、ということでしょうか。該当個
所を示してもらえるとありがたいです。
In article <void-29090...@newshost.ryukyu.ad.jp>
vo...@merope.pleiades.or.jp (Kusakabe Youichi) writes:
> 「切り替えわすれる」
$EMACS/etc/JOKES の ed の説明に
| Ed is for those who can *remember* what they are working on.
というのがあります :-)
--
Kazuo Fox Dohzono / doh...@hf.rim.or.jp
[12],(6,9),0,0,2
ライブラリー関数のprintf()と同じプロトタイプ宣言をしていないから
動かないだけで、あたりまえのことでは?
っていう意味です。
> > 第1版が ISBN 0-13-110163-3
> > 第2版が ISBN 0-13-110362-8
>
> わざわざ調べてもらい恐縮です。注文する気ないけど。
なぜでしょう?
> 「いのがれ」?広辞苑にも無い単語ですねぇ…。
実際に使うことばと広辞苑に載っている言葉はべつものでしょう。
> どうもすみませんです。気に食わなければ反応しなければいいのに
「気にくわない」と思っていると思ったわけですね。
それはきっと「自分だったらそういう反応をするときは気にくわないと思ったとき
だろうから」という程度の理由だったりするのではないでしょうか?
そすがにそんな人間と一緒にしてもらった困ります:)
> とりあえず、記事くらい落ち着いて書いてくださいよ。
これは「落ち着いて書いていない」と判断したわけですね?
べつに落ち着いていないわけではなく、これが普通のいつもの「落ち着いた」
書き方であることはたいがいだれでも知っていることでしょう。
ずっとこの調子で20年も30年も書いているのですから。
--
田中一嘉
mailto:den...@lycos.ne.jp
> Masakiさんの<8qve17$jsg$1...@newsgw7.odn.ne.jp>から
> >わかってはいるのですが、Windowsプログラミングに慣れると
> >string.hがwindows.hの奥深くで暗黙にインクルードされるので
> >どうしても付け忘れてしまうのです。(tchar.hの中だっけか?)
> どうなんでしょう?
> 私の場合「必要な関数はincludeする」という考えでコーディング
> するので、暗黙にincludeされたりするのは気にしていないのです。
それにWindowsのMFC環境に附属してくるヘッダーファイルだったら、
「2回includeしちゃった」対策はしてありますよね。
# それにちょっと前までwindows.hなどをそのままincludeすると、
# -W5でばりばりwarningでるのでそのままでは使いたくなかった。
"UEHARA Junji" <ueh...@po.ntts.co.jp> wrote in message
news:u1yy3e...@po.ntts.co.jp...
> 上原です。こんにちは。
>
> "c.g.green" <cg_...@osa.att.ne.jp> writes:
> > 河原@日本LSIカード(株)です。
> うんと、『共立出版「プログラミング言語C 第2版」ANSI 規格準拠(1994年10
> 月15日 初版> 166刷)』には、関数のプロトタイプがない場合、「全ての引数
> がintであると仮定される(そしてそれを超えるサイズのデータはint型のサイ
> ズ分に切り捨てられる)」と記述されている、ということでしょうか。該当個
> 所を示してもらえるとありがたいです。
横から失礼します。
日本語版では,P33でしょうか。(でも,宣言の無い=プロトタイプがないを意味
するならです。)同じく,P56にはプロトタイプの無い場合の変換があります。少
し,いやかなり混乱しています。
--
********************************
< keizi kounoike >
********************************
"Kusakabe Youichi" <vo...@merope.pleiades.or.jp> wrote in message
news:void-29090...@newshost.ryukyu.ad.jp...
> In article <20000929162...@nifty.ne.jp>, BXQ0...@nifty.ne.jp
(Nakamura Akifumi) wrote:
> > #define NOTEND(ch) (ch != EOF && ch != '\n')
> >
> > ってやることで
>
> NOTEND(getc(fp)) とかはどうするのですか?
>
> # 「引数付きマクロの常識」もわきまえましょう。
> # これも古いCの悪習ですか? ;-)
これって,引数付きマクロは使ってはいけないということなんでしょうか。
確かに、変更ヶ所が減って楽ですね。(^_^/
# 誤解していました。m(__)m
抽象化すると解りづらいということも、
あるかもしれませんね。(--;
> > 2進や16進にも対応してません、
> すればいいのに
期待するほど物ではありませんよ。:-)
C言語では2進の表記法は無かったと思うので、
実装していませんが、例えば "0b1010" の様な
物を実装してみては如何ですか?
---------------------------------
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define DEBUGMODE 1
#if DEBUGMODE
#include <conio.h>
#define InputWait() getch()
#else
#define InputWait() do{}while(0)
#endif
// 8進検査
// ascii code でなくても良い。
//
int isoct( int ch )
{
switch( ch ){
default:
return 0;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
return 1;
}
}
#define ERR_NONE (0)
#define ERR_INPUT (1)
#define ERR_LARGE (2)
#define ERR_ILLEGAL (3)
// 8,10,16進の文字列の正規化した桁数を計数する。
// UINT_MAX まで計数可能。
// ただし、fgetc等の限界は処理系による。
//
#define NOTEND (ch != EOF && ch != '\n')
#define InputCh (ch = fgetc(stdin))
int check( unsigned int *puVal, int *nNumType ){
int ch;
int nHexZero = 0;
unsigned int uCount = 0;
*nNumType = 0;
while( (ch = fgetc(stdin)) != EOF
&& ch != '\n'
&& isspace(ch) )
;
ungetc( ch, stdin );
while( NOTEND
&& (ch = fgetc(stdin))
&& (ch == '+' || ch == '-') )
;
ungetc( ch, stdin );
while( NOTEND
&& (ch = fgetc(stdin))
&& ch == '0' ){
uCount = 1;
}
ungetc( ch, stdin );
if( uCount ){
if( (ch = fgetc(stdin))
&& (ch == 'x' || ch == 'X') ){
++uCount;
while( NOTEND
&& (ch = fgetc(stdin))
&& ch == '0' ){
nHexZero = 1;
}
if( !nHexZero
&& !isxdigit(ch) ){
return ERR_ILLEGAL;
}
if( !NOTEND
|| !isxdigit(ch) ){
uCount += nHexZero;
}
ungetc( ch, stdin );
while( NOTEND
&& (ch = fgetc(stdin))
&& isxdigit(ch) ){
if( ++uCount == 0 ){
return ERR_LARGE;
}
}
*nNumType = 16;
*puVal = uCount;
return ERR_NONE;
} else if( isoct(ch) ) {
ungetc( ch, stdin );
while( NOTEND
&& (ch = fgetc(stdin))
&& isoct(ch) ){
if( ++uCount == 0 ){
return ERR_LARGE;
}
}
if( isdigit(ch) ){
return ERR_ILLEGAL;
}
*nNumType = (uCount == 1)? 10 : 8;
*puVal = uCount;
return ERR_NONE;
} else if( isdigit(ch) ) {
return ERR_ILLEGAL;
}
ungetc( ch, stdin );
}
if( NOTEND
&& isdigit(ch) ){
uCount = 0;
}
while( NOTEND
&& (ch = fgetc(stdin))
&& isdigit(ch) ){
if( ++uCount == 0 ){
return ERR_LARGE;
}
}
# if 0 // 小数
ungetc( ch, stdin );
if( NOTEND
&& (ch = fgetc(stdin))
&& ch == '.' ){
++uCount;
while( NOTEND
&& (ch = fgetc(stdin))
&& isdigit(ch) ){
if( ++uCount == 0 ){
return ERR_LARGE;
}
}
}
# endif
if( uCount == 0 ){
return ERR_INPUT;
}
*nNumType = 10;
*puVal = uCount;
return ERR_NONE;
} // check()
#undef NOTEND // (ch != EOF && ch != '\n')
#undef InputCh // (ch = fgetc(stdin))
int main()
{
unsigned int uAns;
int nNumberType;
switch( check( &uAns, &nNumberType ) ){
case ERR_NONE:
printf( "Number Length(%d) = %u\n"
, nNumberType, uAns );
InputWait();
return 0;
default:
printf( "\a*** Unknown Error. ***\n" );
break;
case ERR_INPUT:
printf( "\a*** Input Error. ***\n" );
break;
case ERR_LARGE:
printf( "\a*** Number too large. ***\n" );
break;
case ERR_ILLEGAL:
printf( "\a*** Illegal number. ***\n" );
break;
}
InputWait();
return 1;
}
---------------------------------
// テストパターン
// 1 "1"
// 3 "123"
// 1 " 4"
// 2 "12 345"
// 1 "0"
// 1 "0000000"
// 4 "0000123"
// 1 "00 0123"
// err ""
// err " "
// err "ABC"
// err "ABC 1"
// err "+"
// 1 "+1"
// 1 "-2"
// 3 "--123"
// 2 "+-+12"
// 3 "+++000012"
// 3 "0x0"
// 3 "0x1"
// 4 "0x0012"
// 4 "000x0012"
---------------------------------
OE等での見易さを考慮して、
TABを空白に置換していますが
逆に見づらくなってる部分も
あるかもしれません。m(__)m
--
山口@福岡 <hy...@mx7.tiki.ne.jp>
少しは頭を使って考えましょう。
# 足りないなら補充しましょう。
それは正しく抽象化できていない証拠でしょうに。
>> うんと、『共立出版「プログラミング言語C 第2版」ANSI 規格準拠(1994年10
>> 月15日 初版> 166刷)』には、関数のプロトタイプがない場合、「全ての引数
>> がintであると仮定される(そしてそれを超えるサイズのデータはint型のサイ
>> ズ分に切り捨てられる)」と記述されている、ということでしょうか。該当個
>> 所を示してもらえるとありがたいです。
>日本語版では,P33でしょうか。(でも,宣言の無い=プロトタイプがないを意味
もしかして、ANSI C 以前の文法と比較している部分(P.26)の
The parameters are named between the parentheses, and their
types are declared before the opening left braces;
undeclared parameters are taken as int.
のことでしょうか。
--
片山@PFU
"Masaki" wrote
about "Re: プロトタイプ宣言されていない関数の使用について"
on Thu, 28 Sep 2000 21:37:56 +0900
Message-ID <8qve17$jsg$1...@newsgw7.odn.ne.jp>
>>わかってはいるのですが、Windowsプログラミングに慣れると
>>string.hがwindows.hの奥深くで暗黙にインクルードされるので
ならば
#include <windows.h>
ってしなくちゃ.(^^;
それがないからやっぱり減点.
2000/09/29(Fri) 09:37:08
--
Word by S.Masa
masa.s...@nifty.ne.jp
http://member.nifty.ne.jp/smasa/
> >標準規格書はどこで入手できますか?
> >Draftでいいので無償で参照できる場所を教えてくれると助かります。
>
> ++なら http://www.ansi.org あたりからたどって行くと無料で手にはいるの
> ですが, C は有料になってるようです。(C++今がチャンス?)
ドラフトなら
Programming in C <http://www.lysator.liu.se/c/>
から手繰れますね.いつのやつだかは忘れましたが.
ここにあるリンクだと,他のエッセイだの論文だののリンクの方が読んで面白
いですけどね :-)
Why Pascal is Not My Favorite Programming Language, by B. W. Kernighan
<http://www.lysator.liu.se/c/bwk-on-pascal.html>
とか
Henry Spencer's The Ten Commandments for C Programmers
<http://www.lysator.liu.se/c/ten-commandments.html>
とか.暇つぶしにはもってこい :-)
--
柳川和久 @ 東大阪市 . 大阪府 September 29, 2000
So many men, so many minds.
(getc(fp) != EOF && getc(fp) != '\n')
ポピュラーな構文ですが。何か疑問点でも?
K&R時代にはマクロの副作用といって、
恐れていたらしいですね。(--;
それを回避したければ、マクロ名を
大文字にして関数名と区別します。
当然、関数名は小文字のみを使うようにする。
ふつー、notend(getc(fp))とは出来ても、
NOTEND(getc(fp))とか NOTEND(ch++)は、
体が受け付けません。:-(
--
山口@福岡 <hy...@mx7.tiki.ne.jp>
使ってはいけないというのは飛躍しすぎです。
マクロの引数の評価はマクロ内で出てくる引数の使用回数だけされてしまうと
いうことです。
瀬戸野
> LSI-C 3.30c では
>
> int printf(const char*, ...);
>
> int main() { printf("Hello"); }
>
> や
>
> #include <stdio.h>
>
> int main() { printf("Hello"); }
>
> は動きますが、
>
> int printf(const char*);
>
> int main() { printf("Hello"); }
>
> は動きません。(何も出力されません)
これは処理系依存の問題で
> つまり、C89では可変引数関数の場合は暗黙の宣言が効かない処理系が
> 存在しても仕様的には何ら問題がないが、好ましくないながらも
>
> int main() { return strlen("test"); }
>
> は正常に動作することが期待されると解釈してもいいのでしょうか?
こんな質問に結びつくわけがないのです。処理系の問題と仕様の問題を
ごっちゃにしてはいけません。それと、最後に大切なことを1つ。
「宣言と定義は一致させる」というのが大前提です。もちろん、事情に
より「一致させない」場合はありますが、それとてなぜそうするのかを
わかっていることが必要です。
上記のような場合は「こういう風に使ったらこうなった」では、単なる
コンパイラを使った実験程度の意味しかありません。それが仕様を検証
することにもなりません。プロトタイプを記述したヘッダが存在するの
であればinclude するのが当然で、いい加減に使えば結果が保証されな
いのは当たり前です。
疑問を感じないのですか?
スタックマシン的な発想で書いている部分なので、
変数を固定した方が安全だと思うのですが、如何でしょうか?
push/pop と同様に、暗黙のアドレッシングです。
ch をスタックマシンのアキュムレータだと見てください。
# FORTH で書けば良かった。(^^;
> 少なくとも、変数名キメウチのマクロが
> 次の関数(main)まで効いているのが、キモイっす。
これに関しては、反論の余地はございません。
明らかに手抜きでした。m(__)m
ご指摘を感謝いたします。
--
山口@福岡 <hy...@mx7.tiki.ne.jp>
"S.Masa" <masa.s...@nifty.ne.jp> wrote in message
news:8r284a$8hj$1...@nw041.infoweb.ne.jp...
> >>わかってはいるのですが、Windowsプログラミングに慣れると
> >>string.hがwindows.hの奥深くで暗黙にインクルードされるので
>
> ならば
> #include <windows.h>
> ってしなくちゃ.(^^;
> それがないからやっぱり減点.
うむむ。そうなんですけど、それは癖のお話。
別に三角を丸にして欲しくて文句言ってるわけじゃあないです。
そんなんだったら笑いを取りになんて行きませんよ :)
--
岩田 雅樹 masaki...@hotmail.com
(笑)はお嫌いですか? :)
引用の際に勝手に削除されるのはいただけませんね :)
http://www.nurs.or.jp/~nspixp/void/index.html
http://www.nurs.or.jp/~nspixp/void/void_chat1.txt
"Kusakabe Youichi" <vo...@merope.pleiades.or.jp> wrote in message
news:void-29090...@newshost.ryukyu.ad.jp...
> In article <8r1mqi$tu$2...@newsgw7.odn.ne.jp>, "Masaki"
<masaki...@hotmail.com> wrote:
> > > 第1版が ISBN 0-13-110163-3
> > > 第2版が ISBN 0-13-110362-8
> >
> > わざわざ調べてもらい恐縮です。注文する気ないけど。
>
> なぜでしょう?
なぜでしょう? :)
>
> > 「いのがれ」?広辞苑にも無い単語ですねぇ…。
>
> 実際に使うことばと広辞苑に載っている言葉はべつものでしょう。
では日下部様は「いのがれ」と発音なさるのですか? :)
> > どうもすみませんです。気に食わなければ反応しなければいいのに
>
> 「気にくわない」と思っていると思ったわけですね。
> それはきっと「自分だったらそういう反応をするときは気にくわないと思ったとき
> だろうから」という程度の理由だったりするのではないでしょうか?
> そすがにそんな人間と一緒にしてもらった困ります:)
私もそんな人間かもしれませんが、そんな風には思っていませんよ :)
20年も30年も前から初心者いじめをしている人なんだろうとは思いましたが :)
> > とりあえず、記事くらい落ち着いて書いてくださいよ。
>
> これは「落ち着いて書いていない」と判断したわけですね?
> べつに落ち着いていないわけではなく、これが普通のいつもの「落ち着いた」
> 書き方であることはたいがいだれでも知っていることでしょう。
> ずっとこの調子で20年も30年も書いているのですから。
知ってますよ :)
--
岩田 雅樹 masaki...@hotmail.com
"Kusakabe Youichi" <vo...@merope.pleiades.or.jp> wrote in message
news:void-29090...@newshost.ryukyu.ad.jp...
> それにWindowsのMFC環境に附属してくるヘッダーファイルだったら、
> 「2回includeしちゃった」対策はしてありますよね。
#pragma onceとか、自動生成で冒頭に付く
#ifndef AFX_HOGEHOGE_H__(ここにGUID)__INCLUDED_
#define AFX_HOGEHOGE_H__(ここにGUID)__INCLUDED_
#endif
#ifndef _INC_STRING
#define _INC_STRING
#endif
とか?
規格で__で始まるシンボルの使用が推奨されなくなったらしくって
こんな変てこなもんがつくようになったらしいです。
昔は自分のヘッダーにもバリバリ使ってたんですけど…。
http://anubis.dkuug.dk/jtc1/sc22/open/n2356/ (いわゆるFDIS/IS?)
2.10 Identifiers
2 In addition, identifiers containing a double underscore (__) or begin-
ning with an underscore and an upper-case letter are reserved for use
by C++ implementations and standard libraries and shall not be used
otherwise; no diagnostic is required.
--
岩田 雅樹 masaki...@hotmail.com
"ohsaki takayuki" <ohs...@cac.co.jp> wrote in message
news:8r1o29$k...@infonet.sedept.cac.co.jp...
> In article <8r1mqf$tu$1...@newsgw7.odn.ne.jp>, masaki...@hotmail.com
says...
> (以前、日本規格協会経由で ODA や MHS の規格を取り寄せたときにあまりの
> 高さ(全部で数十万)にびっくりして、以後有料の規格は値段さえ見ませんで
> した.)
数十万ですか…。そんな時代に生まれなくてよかったっす。
> >C++ならここにISO/ANSI C++ Draftがあるのでこれを使ってます。
> >http://www.cygnus.com/misc/wp/index.html
>
> 本家の
> http://anubis.dkuug.dk/jtc1/sc22/open/n2356/
> も、多分内容は一緒
CoverSheetの日付が同じなので同じみたいですね。
> >$18なら買えなくもないなぁ。前見たときはX3T10とかバカ高かったような気がす
る。
>
> #ああいうものの値段ってどうやって決まるんでしょうか?
どうなんでしょうねぇ?気分?
--
岩田 雅樹 masaki...@hotmail.com
"Kazuyoshi Tanaka" <den...@lycos.ne.jp> wrote in message
news:8r1uo9$r7h$1...@bgsv5905.tk.mesh.ad.jp...
> Masakiさんの<8qve17$jsg$1...@newsgw7.odn.ne.jp>から
> >わかってはいるのですが、Windowsプログラミングに慣れると
> >string.hがwindows.hの奥深くで暗黙にインクルードされるので
> >どうしても付け忘れてしまうのです。(tchar.hの中だっけか?)
> どうなんでしょう?
> 私の場合「必要な関数はincludeする」という考えでコーディング
> するので、暗黙にincludeされたりするのは気にしていないのです。
そうですよね。そういう心がけが大切ですよね。
今度からは心がけるようにします。
--
岩田 雅樹 masaki...@hotmail.com
つまりそのあたりの書籍は「読みたくない」ってことでしょうか?
(「買ってまでは」)
"YANAGAWA Kazuhisa" <kj...@os.xaxon.ne.jp> wrote in message
news:8r2cog$3uu$1...@news1.os.xaxon.ne.jp...
> In message <8r1dma$k...@infonet.sedept.cac.co.jp>
> ohs...@cac.co.jp writes:
>
> > >標準規格書はどこで入手できますか?
> > >Draftでいいので無償で参照できる場所を教えてくれると助かります。
> >
> > ++なら http://www.ansi.org あたりからたどって行くと無料で手にはいるの
> > ですが, C は有料になってるようです。(C++今がチャンス?)
>
> ドラフトなら
>
> Programming in C <http://www.lysator.liu.se/c/>
>
> から手繰れますね.いつのやつだかは忘れましたが.
おぉ~、面白そうな話がいっぱい載ってますねぇ。
あとでゆっくり読んでみようと思います。
--
岩田 雅樹 masaki...@hotmail.com
"Masaki" <masaki...@hotmail.com> wrote in message
news:8r3if2$a6n$4...@newsgw7.odn.ne.jp...
> 岩田です。
>
> http://anubis.dkuug.dk/jtc1/sc22/open/n2356/ (いわゆるFDIS/IS?)
FDISであってもISではないですね。失礼しました。
--
岩田 雅樹 masaki...@hotmail.com