C言語なら、俺に聞け! <9>
■ このスレッドは過去ログ倉庫に格納されています
0001C言語ハッカー Kusakabe Youichi
NGNGあちこちの言語に手を出したが結局極めたのはC言語だけだった。
大体のことなら分かるからオレに聞け。
だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。
・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html
・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・前スレ C言語なら、オレに聞け! <8>
http://pc.2ch.net/test/read.cgi/tech/1005811510/l50
0153C初心者
NGNGいや、この本はその辺はちゃんとしてます。
void main についてもわざわざ欄を設けて説明してありました。
0154デフォルトの名無しさん
NGNG0155C初心者
NGNGと、言いますと?
0156デフォルトの名無しさん
NGNGああ、あれか。K&Rの第五章を焼き直した本ね。
参考文献にK&Rが入っていないCの本は見たことない。
参考文献すら書いてない本は買うに値しない。
ちがう?
0157C初心者
NGNGそんな、オレを責められても困りますよ。
0158デフォルトの名無しさん
NGNG3分で吐き気がした。
コンピューターとは話せるが、まともな人間と普通のコミュニケーションが取れないヲタが文章を書くと、ああなるという、良い見本だった。
教育学の教科書にサンプルとして採用しようと思った。
もちろん、ダメな解説例として。
人にわかりやすく物事を教えるには、それなりに「教えるスキル」が必要だ。
カニチャーハンは、その辺がまったくわかっていない。
K&Rは、最後の一冊として読むべきだ。最初に読んではいけないし、勉強の途中で読んでもいけない。
ほとんど全部他の本を読み尽くして、C++に逝く直前に読むと良い。
0159C初心者
NGNGワロタ!
0160C初心者
NGNG0161デフォルトの名無しさん
NGNG> うーん、K&R買わなければ良かったかなあ・・・(鬱
買っといて損はない。
K&Rが理解できればCの文法は理解したと思って良い。
あと、K&Rは規格書やマニュアルに近い書き方なので、
慣れていない人が読むと>>158のような感想を持つでしょう。
0162デフォルトの名無しさん
NGNGK&R はあくまで「Cの入門書」であって「プログラミングの入門書」でも教科書でも
ないからね。
基本的なプログラミング技術が身についていない人間が読むのは、ちょっと辛い。
身近に質問できる先輩とかいれば、どうにかなるけど。
0163C初心者
NGNGなるほど・・・。
「解説書」ではなくて「規格書」「Cの定義文」みたいに接すれば有用だということですね?
0165デフォルトの名無しさん
NGNG0166C初心者
NGNGその話はよく聞きますね。
0167デフォルトの名無しさん
NGNGあれって許可いるのか?
0168C初心者
NGNG0169デフォルトの名無しさん
NGNG0170デフォルトの名無しさん
NGNG0171デフォルトの名無しさん
NGNGいや、引用でなくて、丸ごと一冊訳そうとたくらんどるんだけど。
0172デフォルトの名無しさん
NGNGどっかスレ作って、そこでガンガン訳しちゃうってのはどう?
添削も出来るし。
まーこの際著作権は無視だな、ムシ
0173デフォルトの名無しさん
NGNGなんならオレがその役をかってでてもいい
0174デフォルトの名無しさん
NGNG0175デフォルトの名無しさん
NGNG役所が金出してくれればいいんだが。
0176デフォルトの名無しさん
NGNGこきおろしている、というより「時代遅れな記述がある」と言っているんじゃ・・・
俺にはそう読めましたが。
(まあ、たしかにどうでもいいあげあしとりもありますが)
0177Marezo
NGNG勘違いしていた(^^;
#define RSHIFT(i,n) i<0 ? (signed)!(!(unsigned)i >> n) : i >> n;
確か「!」はnotだったはず。
0178デフォルトの名無しさん
NGNGつーか負の表現に2の補数を使ってるところなら
>>100で完了してるんだけど、どうよ?
0179デフォルトの名無しさん
NGNGstatic void hoge();
void hoge();
returnした時に挙動が変わるようなのですが・・・・
よろしくお願いします。
0180デフォルトの名無しさん
NGNG外部から参照できる(static なし)かできないかの違い(static)
0181デフォルトの名無しさん
NGNGstatic にすると同一の翻訳単位 (厳密に言うと #include とかあるからアレなんだが、
基本的には同じ *.c に書いてある範囲)からしか呼び出せない。static にしないと、
外部からでも呼び出せる。
> returnした時に挙動が変わるようなのですが・・・・
それは static 変数と勘違いしてないか?
018282
NGNGなんだかお題の書き方が曖昧だったみたいですんません
割算をしたいという趣旨ではなくて、最上位ビット以外をシフトしたい
ということでした。てことでいろいろヒントをいただいた結果こんなん
になりました。
#define MASK ((~(unsigned)0)>>1)
#define RSHIFT(i,n) (signed)((i<0?(~MASK):0)|(((unsigned)i&MASK)>>n))
簡単にならんかな・・・
0183179
NGNGreturnした時の挙動というのは具体的に言うとこういう事です。
static void alarm(int);
int connect(int a, int b)
{
...A
signal(SIGALRM, alarm);
...B
}
alarm(int signo)
{
return;
}
とあった時SIGALRMシグナルが呼び出されてalarm関数に飛んだ後
returnで一気にconnectへ帰って...Bの領域を実行して無いようなのですが・・・
アドバイスよろしくお願いします。
018482
NGNG018582
NGNG0186デフォルトの名無しさん
NGNGOSは
0187デフォルトの名無しさん
NGNG0188説明より手を動かした方が理解できるだろ
NGNGまず下記のような2つのファイルを作って
% cc -o main a.c b.c
としろ。エラーが出るだろ。
次にstaticを除いて同じことをしてみろ。エラーが出ないだろ。
外から参照できないってのはつまりこういうこと。
a.c
---
extern void func();
int main() {
func();
}
---
b.c
---
static void func () {
}
---
0189179
NGNGstatic宣言するメリットというのは外から参照できないというのに尽きるのでしょうか?
0190デフォルトの名無しさん
NGNG#define RSHIFT(i,n) (signed)(((unsigned)i&MASK)|(((unsigned)i)>>n))
これダメかな
(unsigned)→(signed)が処理系依存なんで
厳密にはどうしようもない気もしますが…。
0191179
NGNGhttp://www4.big.or.jp/~kanai/data/unpv12e/lib/connect_timeo.c
の
connect_alarm(int signo)
{
return; /* just interrupt the connect() */
}
のreturnの役割がわからないです。
これはただ呼び出し元に戻るだけではないのでしょうか?
0192デフォルトの名無しさん
NGNGんー…。これってさ alarm() でエラーハンドラに飛ぶ仕掛けが
あるから、ダミーのやつ入れて意図的に処理しないように
してるんじゃないかな。全体見てないのでよくわかりませんけどね…。
0193デフォルトの名無しさん
NGNGそれはstaticをつけるかどうかによって挙動が変化してるのか?
>>191
returnに意味はないでしょう。
0194デフォルトの名無しさん
NGNG負の数を右シフトしたとき、最上位以外の左には、0を詰めたいの?
0195Kusakabe Youichi
NGNG> K&Rを初めて購入したのですが、この本を使う上での注意点とかありますか?
訳本の場合は「誤植に注意」かな。
不審な箇所があったら原書と見比べよう。
0196Kusakabe Youichi
NGNG> 他の本でK&Rをケチョンケチョンにこき下ろしてる記述
(K&RはC言語を分かりづらくしている諸悪の根源とか)
> があったりするのですが、実際どうなのでしょうか
デマですね。その本を「わかりやすいいい本だ」と薦められて、
それなのにその本を理解できなかった馬鹿が、
「自分の理解力に問題がある」ことを認めたくないがために、
事実のほうをねじ曲げて「わかりにくい本だ」ということにしようとしたのでしょう。
0197デフォルトの名無しさん
NGNG0198Kusakabe Youichi
NGNG> >>152
> いや、この本はその辺はちゃんとしてます。
> void main についてもわざわざ欄を設けて説明してありました。
どう書いてありましたか? :)
0199Kusakabe Youichi
NGNG> 人にわかりやすく物事を教えるには、それなりに「教えるスキル」が必要だ。
カーニハン氏はその点もうしぶんないですね。
0200Kusakabe Youichi
NGNG> >>158
> K&R はあくまで「Cの入門書(I�C任△辰董屮廛蹈哀薀潺鵐阿瞭�臀(I�C任盒飢塀颪任發覆い�C蕕諭」
え? よくできた「入門書」だと思いますけどねえ。
0201Kusakabe Youichi
NGNG> >>161
> なるほど・・・。
> 「解説書」ではなくて「規格書」「Cの定義文」みたいに接すれば有用だということですね?
厳密性に欠けるので「規格書」や「定義」ではないですね。
「Cの入門書」「解説書」っていうのが正しい。
0202Kusakabe Youichi
NGNG> つか、日本語版訳が悪いから止めとけってばよ
そうですね誤訳や誤植が多いです。
英語読めるひとはなるべく原書を読みましょう。
0203Kusakabe Youichi
NGNG> じゃー漏れがもっとわかりやすく翻訳しなおしてやろうか?
> あれって許可いるのか?
翻訳するのはかまわないですが、それを出版するには翻訳権の問題が
ありますね > 2次著作を出版
0204Kusakabe Youichi
NGNG> 引用には許可は不要です。翻訳してもOK.
こういうデマを本気にしないようにね。
0205デフォルトの名無しさん
NGNG0206デフォルトの名無しさん
NGNGint A[100] = {0, 1, 2, 3, ... 99};
int B[10];
int index;
for(i = 0; i < 10; i++)
{
index := random(100 - i);
B[i] := A[index];
// indexより右にある要素を左にずらす。
if (index < 99 - i)
{
memmove(&A[index], &A[index + 1], 99 - i - index);
}
}
要件を満たしていませんか?
>>80
>結局何の確率が知りたいのかわかんない。
どこかに0-99までの値で重複しない乱数を10個取得する方法があるとすると、
その方法(方法1)と、上の方法(方法2)が同じ結果を出す確率です。
例えば結果が、1, 2, 3, ...となった場合、
方法2では、random(100 - i)が全部1を返した事になります。
そこで、方法1がデタラメに値を出して1, 2, 3...となった確率と
random(100 - i) が全部1 を返した確率は同じか?と思ったのでした。
randomは真の乱数を返すとします。
ここでは関数の実装方法による出目の確率は問題にしません。
0207デフォルトの名無しさん
NGNGK&Rは開発者なので、K&R本が良い悪いとか教育者として
どうこういう話は俺もなんだか的外れな印象を受けますね。
0208あぼーん
NGNG0209デフォルトの名無しさん
NGNGunsignedが処理系依存なら、abs()使えば?
0210デフォルトの名無しさん
NGNG第三十二条 公表された著作物は、引用して利用することができる。
この場合において、その引用は、公正な慣行に合致するものであり、
かつ、報道、批評、研究その他の引用の目的上正当な範囲内で行なわれる
ものでなければならない
0211デフォルトの名無しさん
NGNGそれなのにその本は実は悪書だと理解していない馬鹿が、
「自分の理解力に問題がある」ことを認めたくないがために、
事実のほうをねじ曲げて「わかりやすい本だ」ということにしようとしたのでしょう。
0212デフォルトの名無しさん
NGNGんー… abs() をどう使うのか思いつかない。
おしえて。
0213デフォルトの名無しさん
NGNG#define RSHIFT(i,n) (signed)((i<0?(~MASK):0)|((abs(i)&MASK)>>n))
では、だめか?
0214デフォルトの名無しさん
NGNGわかりやすかったからわかりやすいというのではなく
わかりやすくなかったのにわかりやすかったといわないと
わからないばかだとおもわれるから
わかりやすいといっているわけですよ
0215Kusakabe Youichi
NGNG> 引き続きレスありがとうございます。
> static宣言するメリットというのは外から参照できないというのに尽きるのでしょうか?
178ペイジと254ペイジに解説してありますよ。
0216デフォルトの名無しさん
NGNGなるほどー。1の補数と2の補数でもOK?
ビットパターンが変わりそうなんだけど…
0217206
NGNGこれも一つ値が決まると、次は99種類の値から選ぶ事になるので、
確率は同じ。
>>206のやりかたで問題ない。
求める個数が少なく、randomの範囲が大きい場合、配列の大きさがもったいないので、
その時は日下部法を使えばいいかな。
求める個数とrandomの範囲が大きく、かつ近い場合は206のやり方がいい。
求める個数が多い(=配列Bが大きい)ので配列Aの大きさは問題無し。
0219Kusakabe Youichi
NGNG> はじまったか。
>
> K&Rは開発者なので、K&R本が良い悪いとか教育者として
> どうこういう話は俺もなんだか的外れな印象を受けますね。
っていうかカーニハンは教え方上手いですよね。
0220Kusakabe Youichi
NGNG> おこずかいの欲しい女の子募集!!
づ
0221Kusakabe Youichi
NGNG> >>190
> unsignedが処理系依存なら、abs()使えば?
...
0222デフォルトの名無しさん
NGNG(unsigned char)(-1)
1 ? 255 ?
0223デフォルトの名無しさん
NGNG俺もよくわからんです。(w
算術シフトみたいなのをイメージしたんだけど、負数の表現方法で
ビットパターンそのものが違うから、最上位ビット以外シフトに
どういう意味があるのか俺はよくわかってなかったりする。(w
0224206
NGNG0225デフォルトの名無しさん
NGNG本当は規格書を参照した方がいいのでしょうけど。。
なお、K&Rの正誤表なるものがベクターにありました。
内容は未確認ですが。。
0226デフォルトの名無しさん
NGNGけどまだちょっと違うとの声
0227デフォルトの名無しさん
NGNG0228Kusakabe Youichi
NGNG> 個人的にはK&Rは辞書代わりに使ってました(ます)。
> 本当は規格書を参照した方がいいのでしょうけど。。
主にどんなことを調べていましたか?
演算子の結合の優先順序?
0229デフォルトの名無しさん
NGNG1 の名前はネタ。本物の Kusakabe Youichi は煽りのプロ、かつスレ違いな話を
age で延々と続けるので、相手にしないことが推奨されてます。また騙りも多く、
Kusakabe Youichi 名義の人間を相手にした結果、荒廃したスレッドは数知れず。
ただし、本物の Kusakabe Youichi は煽りのプロとはいえ、技術的には「それなり
に分かってる」人なので、まっとうな返事をもらったら感謝しておきましょう。スレ
違いなツッコミを受けたら、はらわたが煮え繰り返っても相手にせず無視しましょ
う。
#スレを読んでる人には、どっちがバカかは論争せずとも分かってます。
Kusakabe Youichi について、これ以上の詳しいことはプログラマー板の自治スレ
や隔離スレを読んで悟ってください。
0230206
NGNGごめんなさい、あやまります。
0231Kusakabe Youichi
NGNG> 私が無視されるのって、もしかして日下部さんの痛い所を突いたからですか?
え、どの発言ですか? > 無視された
0233デフォルトの名無しさん
NGNG0234Kusakabe Youichi
NGNG0235デフォルトの名無しさん
NGNG痛い/痛くないは技術的な話から逸れそうだから、続きはこっちでやれば?
日下部 陽一先生の隔離スレッド void ***
http://pc.2ch.net/test/read.cgi/prog/1006918877/
0236デフォルトの名無しさん
NGNGmain()
{
FILE *fp = NULL;
char *buf = NULL; /* 行バッファです */
size_t size = 10240;/* バッファのサイズです */
/* ファイルをオープンします */
buf=(char *)malloc(size);
memset(buf,'\0',size);/* 塗りつぶしておきます */
while(fgets(buf,size,fp)){
if(buf[size-3] != '\0')/* ←←ここです! *//* 行の最後まで読めなかった */
/* 領域を拡張して読み直します */
else
printf("%s",buf);
}
}
この[size-3]の添え字計算はマズイと言うか最適化されませんか?
char *chkptr = size - 3;として
buf[size-3] の変わりに *chkptr とした方が良いでしょうか
reallocしてアドレスが変わる可能性が有るから、最適化出来ないのかなぁ・・・
とか勝手に思ってるんですが、
と言うかこのやり方馬鹿ですか? (汗
0237デフォルトの名無しさん
NGNGchar *chkptr;
chkptr = buf + sizeof(char)*(size - 3);
です 、、
0238デフォルトの名無しさん
NGNGどういう書き方をすると、速くなるかは実際にコンパイルするまで
分かりません。
工夫した書き方で、逆に遅くなることもあります。
その例だと、どちらが速くなっても、わずかな差しかないと
思うので、自分が「素直」だと思う書き方が良いと思いますよ。
スピード重要で少しでも早くしたいときは、ソースで判断せずに、
実際に実行させて、計測してください。
0239デフォルトの名無しさん
NGNG>chkptr = buf + sizeof(char)*(size - 3);
この sizeof はいりません。
charだから動いているけど、それ以外の型だと、このコードは
正常にうごきませんね。
0240デフォルトの名無しさん
NGNG最適化を語るのは、それからの話だ。
0241236
NGNG>>238
気にする程でも無いですか、そう言われると気にならなくなって来ました
当分は-O3様にお任せしますです。
>>239
ぎゃっ、すいません。キャストか良く分かっていないです。。。
>>240
戻り値はこの場合だとbufですよね、、でもif(buf=fgets(buf,size,fp))とか
すると開放する時に if(buf);free(buf); って出来なくなるし。。。
取り合えず変なやり方と言う事ですよね。うーん
0242236
NGNGキャストか → キャストとか
if(buf=fgets(buf,size,fp)) → if((buf=fgets(buf,size,fp))!=NULL)
逝ってきます
0243Kusakabe Youichi
NGNG> FILE *fp = NULL;
> char *buf = NULL; /* 行バッファです */
意味のない初期化ですね。
> size_t size = 10240;/* バッファのサイズです */
変数に入れなくてもいいのでは?
> buf=(char *)malloc(size);
エラーチェックぐらいしておけば?
> memset(buf,'\0',size);/* 塗りつぶしておきます */
何の意味があるの? (末尾だけじゃだめなの?)
> if(buf[size-3] != '\0')/* ←←ここです! *//* 行の最後まで読めなかった */
> /* 領域を拡張して読み直します */
じゃあ1行が数ギガバイトあったらそこまで拡張するのでしょうか?
> この[size-3]の添え字計算はマズイと言うか最適化されませんか?
> char *chkptr = size - 3;として
なぜ-3なの? -1 じゃなくて?
0244Kusakabe Youichi
NGNG> まず判定方法を改めろ。fgetsの返値を使うとかな。
どう使うのでしょうか? :)
0245Kusakabe Youichi
NGNG> > memset(buf,'\0',size);/* 塗りつぶしておきます */
> 何の意味があるの? (末尾だけじゃだめなの?)
っていうか末尾の1つ前か
> > この[size-3]の添え字計算はマズイと言うか最適化されませんか?
> > char *chkptr = size - 3;として
>
> なぜ-3なの? -1 じゃなくて?
-2かな。
0246236
NGNG>意味のない初期化ですね。
はい、厨房です、bufに付いては後でfreeする時に怖いので(勘違い?)(鬱
>変数に入れなくてもいいのでは?
/* 領域を拡張して読み直します */ の部分が
bufExpansion(&buf,&size,fp);とかになっとります(鬱
>じゃあ1行が数ギガバイトあったらそこまで拡張するのでしょうか?
力の限り(鬱
>なぜ-3なの? -1 じゃなくて?
end of string\n\0というパターンを考えました(鬱
何かスレのレベル下げまくりみたいなんで山に帰ります。
謝謝了。
0247Kusakabe Youichi
NGNG> > 意味のない初期化ですね。
> はい、厨房です、bufに付いては後でfreeする時に怖いので(勘違い?)
はい勘違いですね。逆に言えばNULLをfreeしたときの挙動は
標準規格では未定義だったように記憶しています。
(少なくとも標準規格以前のBSD(VAXとか)ではfree(NULL)したときには
何も起きませんでしたが、SystemV系のではfree(NULL)するとSegmantation Fault
でコアダンプするものがほとんどでしたよ)
> > 変数に入れなくてもいいのでは?
> /* 領域を拡張して読み直します */ の部分が
> bufExpansion(&buf,&size,fp);とかになっとります
なるほど。だったら変数にすることはかまわないですが、
最初に変数に与える数値は#defineしておきましょうね。
あと、そのbufExpansionですが、reallocとか使っているのでしょうか?
fpを渡しているのはなぜでしょう?
もしかして中でfgets()を呼んでいる?
だとしたら「関数のまとめる」ために切る部分を誤っているような。
# 一般に言って、やたらと引数が多くなったり、アドレスを渡す引数が多くなる
# ような関数分けはどこか間違っていることが多いです。
> > じゃあ1行が数ギガバイトあったらそこまで拡張するのでしょうか?
> 力の限り(鬱
> > なぜ-3なの? -1 じゃなくて?
> end of string\n\0というパターンを考えました(鬱
え? でも「\n」だったら「\0ではない」のだからいいのでは?
0248デフォルトの名無しさん
NGNGfree(baz);
で破棄した時にbazにゴミが入ってたらヤバイっつってんだろ
魔板でレスするなって怒られてるんだけどな B -)
0249Kusakabe Youichi
NGNG> if(baz)
> free(baz);
> で破棄した時にbazにゴミが入ってたらヤバイっつってんだろ
この馬鹿理解してないみたい(^^;
つまり、ifでNULLだけどけてみたり、freeでゴミが入ってるかもしれない
なんていうコードの書き方ってのは「場当たり的すぎ」だという意味です。
(「予防的プログラミング」に似ているがその実が違う)
0250デフォルトの名無しさん
NGNG0251デフォルトの名無しさん
NGNGアホが書いたランダム爆撃コードを良く退治させてもらったもんだが
多分アンタの本読んだんだろね p
素人には難しいかもしれないが、コーダーってのは色んなレベルの寄せ集め
なんだよ、もし話が理解出来なくて気を悪くしたならすまないね。
0252Kusakabe Youichi
NGNG> つくづくこのオッサンは口だけだと思ってしまう
「思ってしまう」->「思いたい」ですかね。
> アホが書いたランダム爆撃コードを良く退治させてもらったもんだが
> 多分アンタの本読んだんだろね p
11月12日発売でした。
> 素人には難しいかもしれないが、コーダーってのは色んなレベルの
とか偉そうに言うやつにかぎってしょーもないコード書くのよね:)
■ このスレッドは過去ログ倉庫に格納されています