1 名前:デフォルトの名無しさん [2009/12/15(火) 23:42:55 ] C言語の*入門者*向け解説スレッドです。 ★前スレ C言語なら俺に聞け(入門編)Part 57 pc12.2ch.net/test/read.cgi/tech/1260020924/ ★過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000 ★初心者、初級者の方は他の質問スレのほうが良いかもしれません。 例えば 【初心者歓迎】C/C++室 Ver.70【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1258873470/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 133代目 pc12.2ch.net/test/read.cgi/tech/1260532772/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
2 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:46:49 ] 998で質問する度胸
3 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:50:38 ] #define HOGE 0x3FFFC020 だと、コンパイラ君に怒られることがあるかも?
4 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:51:16 ] ふう
5 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:55:35 ] volatile が重要で、ここは最適化するなということをコンパイラに知らせる。 メモリマップドIOや、別スレッドとの共有メモリなど。
6 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:57:20 ] ↑ >>前スレの998 #define HOGE ((volatile unsigned int *)(0x3FFFC020)) この文の意味がわかりません。 #define HOGE 0x3FFFC020 ではだめなのでしょうか?
7 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:06:26 ] あ、 #define HOGE 0x3FFFC020 じゃ、それ以前に駄目だな。 >>5 は、 #define HOGE ((unsigned int *)(0x3FFFC020)) じゃダメな理由ね。
8 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:10:29 ] >998 >6 それはこのマクロをどう使うかによる。 キャストしているところを見ると、メモリ領域を示しているのだろうから、 ポインタとして使うだろう。 全スレでも話題になったが、int とvolatile unsigned int *では型が違うからね。 単に0x3FFFC020なら、intとして扱われる。
9 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:53:47 ] int* a; があったとき a=(int*)calloc(100,sizeof(int)); *a=(int*)calloc(100,sizeof(int)); a=(int)calloc(100,sizeof(int)); *a=(int)calloc(100,sizeof(int)); a=(int*)calloc(100,sizeof(int*)); *a=(int*)calloc(100,sizeof(int*)); a=(int)calloc(100,sizeof(int*)); *a=(int)calloc(100,sizeof(int*)); どれが正しいか分からない
10 名前:デフォルトの名無しさん [2009/12/16(水) 00:56:00 ] >>9 たかが8通り 全部コンパイルして試せばいいよ 正常に処理されたものだけ正しい どれも正常に処理されなければ、おまでの常識は崩れ去る
11 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:06:51 ] キャストすんなうぜえ
12 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:10:24 ] >10 コンパイルできるから正しい訳じゃないぞ。 *a=(int)calloc(100,sizeof(int)); *a=(int)calloc(100,sizeof(int*)); はコンパイルは正常に完了するが、その後 正しくコーディングできるとは思えない。
13 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:11:49 ] バグなんてコンパイルを通ったからこそあるものだろうから
14 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:12:38 ] >>9 int*a=calloc(100,sizeof(int));
15 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:14:00 ] 結論:キャストなどいらぬ
16 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:15:03 ] シンタックス上はどれも正しい セマンティクス上では全ては正しくない
17 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:18:38 ] セマンティクス - 意味・説明・解説 : ASCII.jpデジタル用語辞典 ttp://yougo.ascii.jp/caltar/セマンティクス
18 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:20:17 ] >>11 a=calloc(100,sizeof(int)); *a=calloc(100,sizeof(int)); a=calloc(100,sizeof(int*)); *a=calloc(100,sizeof(int*)); どれが正しいの?
19 名前:12 mailto:sage [2009/12/16(水) 01:21:35 ] >10 追記 a=(int*)calloc(100,sizeof(int*)); もコンパイルは通るけど、間違いだろうな。 この後メモリリークや、領域破壊しないでコードが書けるなら、 そもそもこんな書き方はしない。 正しい書き方といえるのは a=(int*)calloc(100,sizeof(int)); だけかな。>11のいうようにCではキャスト不要なのだから キャストしないほうがよいスタイルだと思う。
20 名前:デフォルトの名無しさん [2009/12/16(水) 01:22:09 ] >>18 たかが4通り、全て試してみればよい
21 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:23:38 ] 過去にC言語の入門書2〜3冊ほど読んだがどれもキャストしてた。
22 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:24:18 ] >18 左辺と右辺の型を考えようね。 a=calloc(100,sizeof(int)); a=calloc(100,sizeof(int*)); は文法上はどちらも正しい。 しかし a=calloc(100,sizeof(int*));は普通は誤り。
23 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:25:17 ] >>14 でFA
24 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:30:13 ] CとC++共通に使えるライブラリにしたいならmallocの戻り値キャストは必要。 (その場合はextern "C"も必要だが。) Cだけで使うならキャストは不要。
25 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:30:51 ] >>11 アフォ calloc は、void* を返す。コンパイル通るからいいなんて言うなよ!
26 名前:22 mailto:sage [2009/12/16(水) 01:31:25 ] なぜa=calloc(100,sizeof(int*));が誤りかというと int *a;である場合、aが指す領域はaが指している型のサイズの整数倍の 領域が確保されなければならないから。 ポインタは指している型のサイズ分、アドレスが進むし、参照したときには 型サイズ分の領域を読むことになるから、実用上は 型Tと正の整数Nがあったときに T *a = malloc(sizeof(T) * N); となっていないと間違いと思ってよい。
27 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:32:20 ] >>9 ,11 まとめ Cだけで使うなら a=calloc(100,sizeof(int)); が正しい(Cはキャストいらない) C++でも使いたいなら a=(int*)calloc(100,sizeof(int)); が正しい C#では使えない
28 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:33:10 ] >>27 × >>9 ,11 ○ >>9 ,18
29 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:34:05 ] >25 Cでは void*は関数ポインタ型以外のポインタ型の値を、キャスト無しで格納できるし、 元の型に戻したときに同じになることが保証されている。 C++ではmallocなんて使わずにnew使え。
30 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:34:37 ] >>14 でFA
31 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:35:58 ] ファー!ファー!
32 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:36:21 ] FAR
33 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:37:52 ] ポインタは入門者には難しいから覚えなくていいよ
34 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:40:21 ] 入門者が覚えることはたくさんある。ポインタなんて一番最後にちょろっとやればいい
35 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:41:14 ] 実際の現場でポインタなんて滅多に使わないのに入門書にはさも重要かのように扱われているのが残念でならない。
36 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:42:51 ] ポインタはプロ中のプロと呼べるレベルのプログラマーだけに扱える分野。 入門者はまず制御文や条件文を目を閉じてでも書けるように上達するのが先
37 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:47:15 ] プログラマー ・・・ グラマラスな女性モデルのうちプロフェッショナルのことの略
38 名前:デフォルトの名無しさん [2009/12/16(水) 01:49:44 ] 質問あるならじゃんじゃん書いちゃって!分かる人が答えてくれるから!
39 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:50:16 ] >>29 君が言ってることは正しいが、 >>9 は、void* を int* あるいは int にキャストしようとしているので、 その例には当てはまらない。int* → void* ならC++でもキャストいらない。
40 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:54:38 ] キャストしない場合a=calloc(100,sizeof(int)); と キャストした場合a=(int*)calloc(100,sizeof(int)); と 何か内部的なことに違いがあるの? 「キャストしなくていい」の? 「キャストしないほうがいい」の? 「キャストしてはいけない」の?
41 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:57:42 ] 人に訊けば何でもすぐ分かると思って自分で調べようともしない 自分で調べてみて分からなかった時だけ質問しやがれ
42 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:00:29 ] 国会図書館に保管してある文献を一通り読んでみたけど分かりませんでした
43 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:01:45 ] 海外の文献もちゃんと調べたのか?
44 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:03:05 ] はい
45 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:03:36 ] とりあえず、コンパイルしたものを逆アセンブルしてくらべてミソ。
46 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:03:59 ] 逆アセンブルは違法です
47 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:04:50 ] >>44 世界中の文献を調べて分からないようなことを知る人物などおりゃせん
48 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:05:29 ] スレの存在意義が消滅しました
49 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:06:05 ] 法律で決まっているわけでもなんでもないでしょ、そんなもの。 それはそれとして、君は日本国憲法を読んでいるか。 逆アセンブルは何て書いてある。それはどういう風に書いてある、憲法に。
50 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:07:23 ] 逆アセンブルは著作権法違反
51 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:08:10 ] 特許侵害
52 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:09:36 ] 逆アセンブル・逆コンパイラ・絶対ダメ
53 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:10:10 ] 醍醐味だと思うけど
54 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:11:07 ] >>47 地球外知的生命体なら・・
55 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:13:33 ] >>49 何故に憲法w 「憲法」の定義から始めようかw
56 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:15:24 ] 最近ずっと話題になってる小沢の暴論のコピペだよ。天皇の部分を変えただけ
57 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:16:16 ] >>55 は世間知らず
58 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:20:02 ] コピペの誤用のほうを詰るべきだろ
59 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:23:35 ] >>40 そろそろ本題へ。 できるコードには基本的には違いありません。 基本はキャストするです。 キャストしないとコンパイラの警告レベルを上げるとwarning が出ますが、しなくてもコンパイルはできます。 昔は今の void* の代わりにintが使われていましたが、その頃はキャストしないのが普通だったようです。
60 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:24:01 ] >>40 「キャストしなくていい」 ・・・ 個人の趣味レベルのプログラム 「キャストしないほうがいい」 ・・・ 学校の授業レベルのプログラム 「キャストしてはいけない」 ・・・ プログラマー
61 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:26:05 ] C関連のスレではキャストの話でいつも盛り上がるね
62 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:26:52 ] 見た目が面白いよね、うん。
63 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:28:55 ] >>40 キャストすべき
64 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:29:08 ] 安全だろうが安全でなかろうが男ならどんな言語でも明示キャスト
65 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:29:40 ] >59 最後の文は正しいのか
66 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:31:22 ] 可読性を重視したコーディングを心がけなさい>入門者たちよ
67 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:32:55 ] 何が真実なのかさっぱりわからねえ
68 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:32:56 ] >>66 自己レス乙
69 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:34:22 ] >>67 自分で調べずに人に訊くからこうなる。まず自分で調べなさい
70 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:37:48 ] クライアントから要求された以上のプログラムを実現する必要性は無い。余計なことは技術の無駄遣いだ。
71 名前:デフォルトの名無しさん [2009/12/16(水) 02:55:34 ] 何の話かわからないけど キャストは別にしなくていいんじゃないかな? 必要ないんならしないほうがすっきりして読みやすいよ
72 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:55:49 ] 配列の全要素を同じ値にする関数があったと思うんですが名前を失念しました なんという名前でしたっけ? 関数名(配列,値) ってかんじだったはず
73 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:59:34 ] >>72 memset fill
74 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 03:05:29 ] ありがとう!
75 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 04:44:57 ] 関数内に宣言されるauto変数について教えてください。 staticを付けないと関数から抜けたときメモリが開放されますが以下の書き方だと 開放されないようです。なぜ開放されないのかが理解できません。 *sには見えないstaticが付いているのでしょうか? char *func(void) { char *s=malloc(20); (省略) return s; }
76 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 04:58:37 ] 解放されるのは変数sに割り当てられてるメモリであって、 変数sに入ってる値じゃないから。
77 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 05:17:07 ] char *s=alloca(20); にすれば期待した動作に成るよ
78 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 05:56:30 ] ビットフィールドなるものがあるのを先日知りお試しPGを作成したのですが、ちょっとわからない箇所が。 struct tag1{ unsigned int a :1; unsigned int :2; unsigned int b :4; short id; }; struct tag2{ unsigned int b :4; short id; }; 構造体tag1、tag2ともsizeofでサイズを見てみると6でした。 なぜ6となったのでしょうか? ------------------------------------------------------------------ int型のサイズは4バイト、short型のサイズは2バイトのOS(WinXP)で実行。 VCの設定項目である構造体メンバのアライメントは1バイトに設定しています。 ------------------------------------------------------------------
79 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 05:58:36 ] ビットフィールドは悪魔だ できるなら使わない方がいい 速度も大幅に低下するし
80 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 06:27:51 ] その通りだ よくぞ言った
81 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 06:49:51 ] >>78 ビットフィールドを理解していれば何の疑問もない筈だが? いくつになるべきだと思うんだ?
82 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 06:52:34 ] 3になるとか思ったんじゃね?
83 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 07:37:34 ] 78です。 ビットフィールドを知ったのが最近なので理解不足であります。 知っているのは、コロンの後ろの数値が :4 なら0x0〜0xFまでが格納出来るエリアが確保されるくらいでしょうか。 このビットエリアが明らかにtag1、tag2違うのに同じサイズになるのが理解できません(´д`)
84 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 08:08:21 ] 使ってるビットだけのエリアが確保されるんじゃなくて、 unsigned intのエリアを確保してそこから、そのビットの分を使用してるだけ。
85 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 08:21:30 ] それはない
86 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 09:18:50 ] あるってw
87 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:37:39 ] ビットフィールドはできるだけ局在化したほうがいいとは思うが、必要なら積極的に使えばいいと思う。 一々シフトしてアンドマスクかけて取り出すなんて面倒だし間違いやすい。 # 勿論、環境依存になるのでその旨ドキュメントに明記するのは当然として。
88 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 12:18:39 ] test
89 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 13:07:26 ] >>84 が正解。 だが、マスク・アンマスク方が、結局わかりやすい。 (値の取り出し用、設定用のマクロも作る)
90 名前:デフォルトの名無しさん [2009/12/16(水) 18:55:11 ] あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ ぬああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ PowerPCいい!!!!!!!!!!!! 割り込み処理ラク!!!!!!!!!!! ベクタとかいらねえ、まんま関数を置けばいいんじゃん!!!!!!!!!!!!!!!!!!!!!!!!! でも俺の中ではSH >>>> PowerPC だけどな!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
91 名前:デフォルトの名無しさん [2009/12/16(水) 19:15:14 ] やっぱ割り込みコントローラを自分で持ってる奴はいいなあ!!!!! チョー気持ちいい x86みたいにメンドクセーことしないで済む ええなあ ええ ええぞ
92 名前:デフォルトの名無しさん [2009/12/16(水) 19:49:49 ] ああもう素晴らしい カウンタもついてる SHみたいにナノセカンド単位でのカウンティングができる!!!!!!!!! すばらしい!!!!!!!!! OSのミリセカンドオーダーのスリープなんぞに頼らなくてもよい!!!!!!!!!!!! 蕎麦らしい!!!!!!!!!!
93 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 19:54:06 ] すーぱーひたちとかネーミングがダサすぎて話しにならん
94 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 19:57:46 ] はなしし?
95 名前:デフォルトの名無しさん [2009/12/16(水) 21:03:00 ] ハードわからん奴カワイソス
96 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 21:04:07 ] 91 :デフォルトの名無しさん [] :2009/12/16(水) 19:15:14 なんか91というラベルがあって デフォルトの名無しさんという配列があるように見える俺の専用ブラウザ。
97 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:01:48 ] ncursesを使ってプログラム作ってます。(debian&gcc) 画面(端末)の背景全体を、特定の色にしようと思ったら init_pairで指定した上でスペースで埋めないといかんのでしょうか?
98 名前:デフォルトの名無しさん [2009/12/16(水) 22:02:07 ] *(unsigned int *)(0xAAAA) というのが示すのは int型のポインタが示す実体ですか?
99 名前: ◆QZaw55cn4c mailto:sage [2009/12/16(水) 22:10:43 ] >>98 アラインメントを考えないことにすれば、そのとおりでしょうね。 ハードウェアよりな言い方をすれば、アドレス 0xaaaa から始まる int 型の変数の値ですね。
100 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:15:07 ] 謎のトリさん現る
101 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:15:43 ] >98 「int型のポインタ」という言葉使いからして型がわかってないぞ。 *(unsigned int *)(0xAAAA) の意味は 0xAAAAからsizeof(unsigned)分をunsignedとみたてて アクセスしている。