トップページ⇒tech
1001コメント246KB

C言語なら、俺に聞け! <18>

■ このスレッドは過去ログ倉庫に格納されています
0001きょうはいいテンキーです。日下部陽一NGNG
漏れは38才、21年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
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プログラマならこれを買っとけ。
・プログラミング言語C(K&Rと呼べば通だ)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/yfcbookshelf-22/250-3950205-1475419

K&Rで挫折するような救いがたいやつはこれでも読め
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/249-4698746-2014711

推薦図書/必読書のためのスレッド PART3
http://pc.2ch.net/test/read.cgi/tech/1016722820/

・前スレ C言語なら、俺に聞け! <17>
http://pc.2ch.net/test/read.cgi/tech/1019372139/l50
0486482NGNG
とりあえず必要なければstaticをつけることにしよう。
0487デフォルトの名無しさんNGNG
FFのCG見てるとSQUARE入りたくなって仕方が無い。
といってもそもそも入れないだろうし、うっかりゲーム業界なんて入ったら死ぬかも。
0488ふかNGNG
プログラマとゲームプログラマは似て非なる職業
0489デフォルトの名無しさんNGNG
たしかCは関数の宣言が無くても下手すれば違う翻訳単位の関数を使えたよな・・
0490デフォルトの名無しさんNGNG
練るか…?

質問なんだけど
C++ の RTTI でクラス ID を分岐させることってできないの?

class_id_type hoge = get_RTTI_type( p);
switch( hoge ) {
case RTTI_class_A: 〜; break;
...
}

こんなやつ。
<typeinfo> ではいちいち
if( dynamic_cast<...> ) ...
if( ... )

を繰り返すのはメンドウだ…
0491デフォルトの名無しさんNGNG
ゲームつくりってどれだけ辛いの?
0492デフォルトの名無しさんNGNG
suretigai
0493ふかNGNG
思い出した!
研修のころは
プロトタイプに変数名必要ない
externは必ずつける
と,教えられたんだ。
んで現場にでて,みんなexternつけてないから,
externはつけなくなっちゃったんだな
0494デフォルトの名無しさんNGNG
>>492
それを言ったらうど(以下略
0495デフォルトの名無しさんNGNG
>>490
classとか言われると手も足も出なくなる自分が情けない。
C++もやらないとだめかな〜
0496デフォルトの名無しさんNGNG
>>495
C++はスレ違い。
0497ふかNGNG
>>489
翻訳単位ってなんぞ?
0498デフォルトの名無しさんNGNG
(*´д`)
0499490NGNG
スマソ C++ スレ探すのもメンドウな
アンニュイな(以下略・・
0500デフォルトの名無しさんNGNG
(*´д`)
    コンパイラニ アタエラレル ニュウリョクノ タンイ ヨ,Pre processerノ シュツリョク ネ
0501ふかNGNG
Javaのクラスなら少しはわかるが
C++はサパーリ。クラスIDってなんぞ?
つかCのスレだからな・・・
0502デフォルトの名無しさんNGNG
>>495
案ずるより生むがやすし
やってみそ
0503デフォルトの名無しさんNGNG
>>502
らじゃー
あの分厚い本と格闘か(遠い目)


Javaは死滅するって聞いたのでやめておきます。
0504ふかNGNG
>>500
#ifdef TYPE_A
int funcA(char*);
#else
int funcA(int);
#endif
みたいな?
0505デフォルトの名無しさんNGNG
実は洩れクラスが無いと生きていけなくなった人間でう・・・
0506ふかNGNG
今月の「UNIX USER」によれば
アメリカのプログラマの扱う言語のトップにC++を抜き差って,
Javaが踊り出たそうな。
漏れもJavaはそれほどだが・・・
0507デフォルトの名無しさんNGNG
>>506
数で見ちゃダメでふ。
0508デフォルトの名無しさんNGNG
実は洩れクラリスがいないと生きていけなくなった人間でう・・
0509ふかNGNG
YOっしゃ〜,今日のノルマオワソ!
も少ししたら寝るぽ
0510デフォルトの名無しさんNGNG
プログラマになったら女プログラマとやれる?
0511デフォルトの名無しさんNGNG
くだらない話してて虫完成してないよ〜〜。
また明日か・・・それまでにbuuがどこまで伸びるやら・・・。
0512デフォルトの名無しさんNGNG
>>511
くだらないとはなんだYO!くだらないとHA!
0513ふかNGNG
漏れの周りは女プログラマが少ないぽ。
金融系のJOBについたら運用系の女プログラマとやれるYOと
まわりは逝ってるYO
0514490NGNG
>>501
いや、おいらも受け売りなんだけどさ・・
ポインタが指すオブジェクトが派生してて何なのかわからん場合
それを識別する RTTI っていうのがあってたぶん、dynamic_cast
ダウンキャストするために、内部でクラスの情報を持っているらしい。
それがクラスID。

ガイジンさんはこの機構を自分で実装していて
おいらは言語でできないもんだろーか。と思った次第でスワ
gamedev.net っつー、ゲーム屋の集うトコロテン…

っつか、ねむ…。

http://www.gamedev.net/columns/gameengineering/oosm/page3.asp
0515ふかNGNG
>>508
練りに練った構造体とモジュール化した関数ぢゃダメですか?
0516デフォルトの名無しさんNGNG
>>513
いいな〜
0517ふかNGNG
>>516
漏れは製造系のJOBだから関係ないぽ(涙
金融系に逝くならコボルもマスターしておけば,
運用のおねえちゃんに受けがいいと思われ・・・
0518デフォルトの名無しさんNGNG
>>514
switchで使えるような物は得られないんじゃないかなぁ。
独自にクラスのIDを整数で返す仮想関数を実装するしかないのでは。
0519デフォルトの名無しさんNGNG
>>517
お、お、おぉ・・・・
Webプログラミング関連はやめてそっちを回ろうかな。
0520508NGNG
>>515
洩れかよ!?
いや、やっぱりクラリスでなきゃ...
0521ふかNGNG
>>519
そうそう,やっぱりこれからは
コボルやピーエルナントカといった汎用機マンセーの時代だYO
0522デフォルトの名無しさんNGNG
クラリスってなんぞよ?
0523デフォルトの名無しさんNGNG
>>521
これから回る会社の中に汎用機を主に扱うところがあるの。
こぼるやPL/Iを使っているみたい。
決めた。そこを第一志望にしよう。
0524ふかNGNG
#include <stdio.h>

const char* str="もう寝ます。おやすみなさい\n" ;

void main(){
puts(str);
}
0525デフォルトの名無しさんNGNG
>>524
二回改行ですか?
私も寝よう。
0526514NGNG
>>518
そうですなぁ…。やはりそれしかないかなぁ…。
0527天然少女NGNG
Cの仕様だと自動変数は不定だから初期化しないといけない。
処理系依存って事なんだけど、どうして処理系によって初期化前の初期値が異なってくるのでしょう?
そこら辺の仕組みを教えて下さい。
0528デフォルトの名無しさんNGNG
>>527
処理系依存だったか?
不定では?
0529天然少女NGNG
その不定値が処理系によって異なります。
どうして異なるかが知りたかったんです。
0530デフォルトの名無しさんNGNG
あれは乱数として使っちゃおうという罠
0531デフォルトの名無しさんNGNG
>どうして異なるかが知りたかったんです。

どうしてってANSIが決めなかったから。
javaはゼロ初期化されるらしいけど
0532天然少女NGNG
乱数になるのでしょうか?(藁
コンパイラに依存するのかハードウェアに依存するのかも良く分からないんです。
0533デフォルトの名無しさんNGNG
>>532
OSに依存すると思う・・・
0534デフォルトの名無しさんNGNG
>>527
児童変数はふつうスタックっていう一時的なデータを置く場所に置きます。
そこは、関数の引数や、前に使い終わった変数なんかの値が
そのまま残ってます。
コンピュータは内容をクリアするにも時間がかかるので、一般的に
前に使った物をいちいち消さないんですわ。

それで、初期化しないと新しく作った児童変数の値は
そのゴミの内容になってまう。スタックの使い方はコンピュータや
OS、メモリ状況によって違ってくるのでコトなるんです・・・。

C faq あたりにも載ってるかもしれん・・。
0535天然少女NGNG
>>531 う〜ん、チョット伝わって無い気がします。
仕様でゼロ初期化と決めなかった事自体は構わないんです。
だけど、その不定な値がどのように決定されるか知りたいんです。

変な質問でゴメンなさい。
0536デフォルトの名無しさんNGNG
>>535
決めるんじゃなくて残っているものがそのまま使われるんでしょ。
0537デフォルトの名無しさんNGNG
自動変数って名前(呼び方)、ANSIで定義されてたっけ?
0538デフォルトの名無しさんNGNG
>>537
autoキーワードがあるから自動変数でいいかと。
0539天然少女NGNG
>>534 なるほど。>>534さんは天才ですね。ひょっとして常識(汗
また質問しに来ます。有難うございました。

0540デフォルトの名無しさんNGNG
自動変数が置かれるスタックってのはホワイトボードみたいなもんで、
前に使った内容がそのまま残ってるんだよ。

前の人が何かいてたかしらんけど、
だいたい、直前に呼ばれた関数の引数とか、そいつが使ってた自動変数の中身とか、
コンパイラがこっそり演算するのに使ってたデータだとかが消えずに残ってるの。

どのように使われてたかは、コンパイラしか知らない。
コンパイラの知識とアセンブラの知識があれば、大体どのように使われていたかは
推測できるけど、そういうテクは、使っちゃいけないと言うのが最近の決まりです。

Cのスタックってのはね、「書いたら消す」という約束を守らない会社の
ホワイトボードみたいなもんなの。
決まってる訳じゃなくて、まえに誰かが書いたのがそのまま残ってるの。
0541デフォルトの名無しさんNGNG
>>535
>>534が言ってるのでだいたいあってます。
0542デフォルトの名無しさんNGNG
自動変数のアドレスを返す関数をつくって、そのアドレスが指す先にあるものを参照すると残っている場合が多いよね。
まもなく書き換えられるだろうけど。
0543デフォルトの名無しさんNGNG
>>542
ポインタと言いなはれ
0544デフォルトの名無しさんNGNG
>>543
すまん
0545天然少女NGNG
って言うか、自動変数の初期化をしていないのが原因のバグが有ったんです。
コード書いた人と処理系が違うので、理由を明確に説明してあげたかったんです。
皆さん親切に感謝!
0546デフォルトの名無しさんNGNG
>>545
そのコード書いた人失格。
でもコンパイラが教えてくれない?
0547デフォルトの名無しさんNGNG
>>539
そういう細かいところに疑問を持つのはいいことだと思いますの。
スタックと児童変数の関係を理解したら、今度は
ヒープと malloc, free や、なぜ児童変数の配列は固定長でなければ
ならないのか、考えてみるとさらに理解が深まりますにょ。。

って、すでに知ってたらごめんなさい、だけど…。
0548デフォルトの名無しさんNGNG
>>545
ついでに「未初期化の変数を使用した」旨の警告メッセージを
読み飛ばさないように教育しといてね。

警告メッセージは全部つぶすのが基本なんだけど、
そのなかでも普通はエラーにしてもいいんじゃないかっていうレベルの
警告もいくつかあるからね。
0549デフォルトの名無しさんNGNG
>>548
警告抑制してつぶしていたりして(w
0550デフォルトの名無しさんNGNG
>>545
なるほど…同じ職場ならコーヒー一杯おごってもらえ。
あなたにはその権利がある。かもよ。
0551デフォルトの名無しさんNGNG
>>549
gcc src.c >&/dev/nullとか(藁
0552デフォルトの名無しさんNGNG
>>545
興味をもつのはいいと思うけど、「じっさいにこーだからだめ」は説明つかないときに反論できないからお薦めしない。
動作が未定義な事は避ける、これが納得できないやつはプログラマ失格だとからだで覚えさせtやれ。

あと、処理系依存はドキュメントでも確認する、できれば避ける、も励行して欲しい。
0553デフォルトの名無しさんNGNG
(´-`).。oO(質問するときは俺も○○少女を名乗ろうっと)
0554デフォルトの名無しさんNGNG
>>553
別に○○少女でなくても丁寧に答えてくれるだろ。
酷い態度でなければ。
0555デフォルトの名無しさんNGNG
(´-`).。oO(○○美少年を名乗れば優しいおねーさんが丁寧に教えてくれるのかなぁ…)
0556デフォルトの名無しさんNGNG
>>553
今日はNULLあたりでマジになってたのが多かったから
それなりの答えが返って来ただけで
普段だったら、>>527の質問で
「女の子の仕組みを教えて下さい」
って切り返して終わるのがオチと思われ
0557デフォルトの名無しさんNGNG
>>556
このスレは違う。
0558デフォルトの名無しさんNGNG
>>555
きっとモーホーなお兄さんが全力で教えてくれるぞ。関係ないことまで。
801板のお姉さんたちでもいい。
0559デフォルトの名無しさんNGNG
>>558
呼んだか?
0560553NGNG
(´-`).。oO(このスレにはよく世話になってるよ。 お前ら、いつもありがとう。)
0561デフォルトの名無しさんNGNG
(´-`).。oO(ともっちを名乗れば優しいおにーさんが丁寧に教えてくれるよ…)
0562デフォルトの名無しさんNGNG
なんでたった3日でスレの半分消費してんだ?
0563デフォルトの名無しさんNGNG
3日つか、24時間で430ほど消費しましてん。
0564デフォルトの名無しさんNGNG
すばらしい消費具合だね。
0565デフォルトの名無しさんNGNG
すごくしょもないことで申し訳ありませんが、
SendMessageでテキストボックスなどコントロールを
表示・非表示の切り替え や使用可能・不可能の切り替えはどう書けばいいでしょうか?
0566デフォルトの名無しさんNGNG
すれちがい
http://pc.2ch.net/test/read.cgi/tech/1017072275/l50
0567デフォルトの名無しさんNGNG
で、ぬるの統一見解は出た?
0568デフォルトの名無しさんNGNG
>>567
実装依存
0569とおりががり〜NGNG
C(++ぢゃない)のNULLに、統一見解なんてありましたっけ?
568さんのいうとおり実装依存じゃないでしたっけ。

0570デフォルトの名無しさんNGNG
>>569
過去ログ読んでくれ。もうたくさんだ。
0571デフォルトの名無しさんNGNG
次のスレには、ぜひ、NULL、0==var、main()の戻り値については議論しないように書いて欲しい。
0572デフォルトの名無しさんNGNG
>>571
不毛な揚げ足取りはやめましょうとかで良いんじゃないの?w
0573デフォルトの名無しさんNGNG
それぞれの議論へのポインタを置くか、
2ch向けのFAQ書くかだなあ。

十数年前の暇な学生の頃だったらやってたかも。
0574○○なお兄さんNGNG
>>558さん、呼びましたか?
0575デフォルトの名無しさんNGNG
>>572
言語定義の説明に本気で反論してそうなやつ、たまにいるからね。
0576デフォルトの名無しさんNGNG
FAQの先頭には規格を読めとかいておけばよい。
プロらしいのに読んでないやつが結構いるのか分からん。
0577 NGNG
あるサイトで
文字の色を変えたり下線を引いたりするのに
MS-DOSのエスケープ・シーケンスを使うってあったんですけど
コマンドプロンプトではどうすればいいんでしょうか?
0578デフォルトの名無しさんNGNG
NULL についてまとめておく

・定数の "0" は、文脈によってヌルポインタ、または整数の 0 として解釈される。ただし、可変長引数、またはプロトタイプをもたない関数の引数に現れた場合は整数の 0 として解釈される。
また、整数型とポインター型とで多重定義している関数の引数では、解釈は実装依存となる(C++ 限定)。
・ヌルポインタのビットパターンは実装依存である。
・条件式にヌルポインターが現れた場合、偽となる。
・ヌルポインタとヌルポインタとは等しい。
・ヌルポインタとその他のヌルポインタとは、常に等しくない。
・ポインタ型によりヌルポインタのビットパターンが異なる場合があるが、コンパイラは(騙されない限り)正しい型を知っているので、比較は正しく行われる。

・NULL は 定数 "0" がヌルポインタとして解釈される場合のみ、定数 "0" の代わりに使用できる。他の文脈では、結果が実装依存となる。(NULL を整数 0 の代わりに使用してはいけない)
・NULL の定義方法は処理系により決定される。(#undef NULL は合法)
0579デフォルトの名無しさんNGNG
>>578
すばらしい!

でも、

>・ヌルポインタとその他のヌルポインタとは、常に等しくない。

・ヌルポインタとその他のポインタとは、常に等しくない。

の間違いかな。
0580デフォルトの名無しさんNGNG
>・ヌルポインタとその他のヌルポインタとは、常に等しくない。

これがわからない。
解説キボンヌ
0581デフォルトの名無しさんNGNG
char str[]="abcdefg";
と定義し、
str[3]='\0';
とした場合、配列自体は書き換えたところ以外は変わりませんが、文字列は3文字まで切りつめられたとみてよいですよね?

というのも、「文字列を切りつめるには適切な場所に'\0'を挿入すればよい。」という考えが正しいのかどうかと思いまして。
0582デフォルトの名無しさんNGNG
>>581
正しい。
0583デフォルトの名無しさんNGNG
>>582
正しいんですね。ありがとうございました。

間違っていなくてよかった。
0584修正NGNG
NULL についてまとめておく

・定数の "0" は、文脈によってヌルポインタ、または整数の 0 として解釈される。ただし、可変長引数、またはプロトタイプをもたない関数の引数に現れた場合は整数の 0 として解釈される。
また、整数型とポインター型とで多重定義している関数の引数では、解釈は実装依存となる(C++ 限定)。
・ヌルポインタのビットパターンは実装依存である。
・条件式にヌルポインターが現れた場合、偽となる。
・ヌルポインタとヌルポインタとは等しい。
・ヌルポインタとその他のポインタとは、常に等しくない。
・ポインタ型によりヌルポインタのビットパターンが異なる場合があるが、コンパイラは(騙されない限り)正しい型を知っているので、比較は正しく行われる。

・NULL は 定数 "0" がヌルポインタとして解釈される場合のみ、定数 "0" の代わりに使用できる。他の文脈では、結果が実装依存となる。(NULL を整数 0 の代わりに使用してはいけない)
・NULL の定義方法は処理系により決定される。(#undef NULL は合法)
0585デフォルトの名無しさんNGNG
>>577
echo ^[[0\;1m
てな感じでechoしよう。^[ は実際は'\x1b'ね。
0586デフォルトの名無しさんNGNG
>・ヌルポインタとヌルポインタとは等しい。
、、、
■ このスレッドは過去ログ倉庫に格納されています