トップページ⇒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
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
>・ヌルポインタとヌルポインタとは等しい。
、、、
0587577NGNG
>>585
レスありがとうございます
でも できなかったです
bccがだめなんでしょうか?
0588デフォルトの名無しさんNGNG
>>587
WindowsNT,2000,XPを使っているとみた。
0589577NGNG
XP使ってます
XPだと色変えれないんでしょうか?
0590親切な人NGNG

追随を許さない、RX-2000�V !!!

注目のオークションにも適用されてるね↓
http://search.auctions.yahoo.co.jp/search/auc?p=RX-200
0591デフォルトの名無しさんNGNG
>>589
少なくともエスケープシークウェンスでは無理。
何かライブラリがあると聞いたが。
0592デフォルトの名無しさんNGNG
>>589
DOS/Vで使えたっけ?
ANSIsysか何かが必要だった気が。
0593デフォルトの名無しさんNGNG
>>589
コマンドプロンプトはDOSではないがね。
0594デフォルトの名無しさんNGNG
32bit consoleアプリじゃだめ。
LSI-Cとか使いなさい
0595デフォルトの名無しさんNGNG
>>586
Any two null pointers shall compare equal.
というISOの規格そのままだと思うが何か?

(もっと細かく言うなら、「どの型のヌルポインタ
も互いに等しい」と書くべきかも知れんが。)
0596デフォルトの名無しさんNGNG


570 名前:デフォルトの名無しさん 投稿日:2002/05/04(土) 15:40
>>569
過去ログ読んでくれ。もうたくさんだ。


571 名前:デフォルトの名無しさん 投稿日:2002/05/04(土) 15:57
次のスレには、ぜひ、NULL、0==var、main()の戻り値については議論しないように書いて欲しい。


572 名前:デフォルトの名無しさん 投稿日:2002/05/04(土) 16:04
>>571
不毛な揚げ足取りはやめましょうとかで良いんじゃないの?w


573 名前:デフォルトの名無しさん 投稿日:2002/05/04(土) 16:10
それぞれの議論へのポインタを置くか、
2ch向けのFAQ書くかだなあ。

十数年前の暇な学生の頃だったらやってたかも。

0597デフォルトの名無しさんNGNG
と、言うわけでスレッド立ててよそでやってもらえませんか?
0598デフォルトの名無しさんNGNG
じゃあmalloc()したものはすべて(略
0599デフォルトの名無しさんNGNG
>>597

>584 で終わっているんじゃないの。
0600デフォルトの名無しさんNGNG
「FAQ歓迎若者限定C言語質問スレ(オサーン立ち入り不可)」
というのを作ってみるとか。
で、このスレは廃墟に…
0601デフォルトの名無しさんNGNG
初心者板になぞらえて「もの凄い勢いで誰かがCの質問に答えるスレ」とか(ワラ
で、このスレはあっちのくだ質のように廃墟に・・・
0602デフォルトの名無しさんNGNG
くだらない質問でもレスをいただけるスレッド(C専用)
とか…
0603デフォルトの名無しさんNGNG
sprintfとwsprintfの違いはなんでしょうか?
0604デフォルトの名無しさんNGNG
wsprintfは制限があるけど、TCHARベースで使うことが出来る
しかし、それはcじゃなくてWin32APIスレの方が適切だ
0605デフォルトの名無しさんNGNG
少なくともwsprintfは浮動小数点関係が処理できなかったよね。
0606603NGNG
今,wsprintf(mes,"%s:",a[1].Name);
とやって表示しようとしたら表示できず、
 sprintf(mes,"%s:",a[1].Name);
とやったらOSが落ちました。
なぜでしょう?
0607デフォルトの名無しさんNGNG
>>606
mesが不適切の可能性。
a[1].Nameが不適切の可能性。

なめてるのか?
0608デフォルトの名無しさんNGNG
>>606
コンセント抜けたんじゃない?
きにするな
がんがれ
0609603NGNG
 a[1].Nameのメンバのnameを確認してみたところLPSTRになっていたので,
charにかえてみたところうまくいきました。
0610デフォルトの名無しさんNGNG
じつはうまくいってないヨカーン
0611デフォルトの名無しさんNGNG
>>610
領域破壊ですかね?
0612603NGNG
うう・・・OS落ちまくりです

 sprintf(mes,"%sのなまえはなんでしょうかね?",a[1].Name);
としたところOSが落ちました。
char mes[256];
aのメンバNameはchar Name[256];

です
0613デフォルトの名無しさんNGNG
まともなOS使えば?
■ このスレッドは過去ログ倉庫に格納されています