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

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

■ このスレッドは過去ログ倉庫に格納されています
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

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

・前スレ C言語なら、俺に聞け! <15>
http://pc.2ch.net/test/read.cgi/tech/1016519243/l50
0153デフォルトの名無しさんNGNG
>>150
そのfooの実体が存在せんのだ。よって中身も無い。
幽霊に内臓が無いのと同じだYO!(ワラ
0154ポインタで…NGNG
>>152
*fooはポインタで実体じゃないからまだ構造体は生成されていないんですね?
だからfoo->nameなんてものはまだ存在してないということですか?
0155デフォルトの名無しさんNGNG
>>150
レス読むときはゆっくり読みなよ。
人間話すより読むほうが速いから、
読む速度で行くと理解できなくなることもある。
ゆっくりじっくり、しゃべるのより遅いくらいの速さで読んでみそ。
0156デフォルトの名無しさんNGNG
>>150
ブロック内の未代入の変数、ポインタ変数の値は未定義です。
fooはメモリ上の正しいインスタンスのアドレスを保持しなければ
foo->nameをしても、もうヴァカかとアフォかとという状態になります。
あとねfoo->nameの演算子は(*foo).nameと同じです。
0157デフォルトの名無しさんNGNG
>>154
ポインタなのは*fooじゃなくてfooだけど・・・
それ以外はそんな感じでいいYO!
0158156NGNG
ウホかぶってた・・・鬱(-_-)
0159 NGNG
typedef struct aa{
char name[32];
}SMP;
は型の宣言で定義ではないからメモリの割当ては行われない。

SMP *foo
の宣言(これは定義でもある)はポインタ分のメモリ割り当てしかしない
バイトアドレスが4バイトの処理系なら4バイト割当てられる。
自動変数だから初期値はゴミ

fooの参照先は >>137のように明示的にメモリ割当てを行わなければならない。
0160デフォルトの名無しさんNGNG
>>154
だいたいそう。
なんで、>>130か、>>137のようにしる。
0161159NGNG
うわかぶってる 逝ってくる
0162デフォルトの名無しさんNGNG
わからん。
0163デフォルトの名無しさんNGNG
ところで、文字列だけでEOFってむり?ですか? ねぇ?
0164デフォルトの名無しさんNGNG
怪談でもしようか・・・
ある日某専門学生のゲーム作品を見ていて、一つふに落ち着かないことがあった。

それは、彼らが作品を起動し終了をさせるたびに再起動し、また作品を起動させるのであった。
あまりに気になったので彼らに何故そんなことしているのかと問い掛けた。

そしたら、重くなって起動できなくなるらしい。
ソースを見せてくれないか?と問い掛けたら、彼らは気兼ねなくそのソースを見せてくれた。

私は絶句した・・・DirctXを使ったゲームのプログラムだったのだが、
全ての終了コードにはこう打たれていた・・・

exit(1);

と、彼らに未来はあるのだろうか?
全てノンフィクションでおおくりしました・・・
0165デフォルトの名無しさんNGNG
...DOSでEXITしてもむりっすよ。文字列だけだとEOFにならん。無限ループになる。CTRL+Cでとめるしかないんすか?
0166デフォルトの名無しさんNGNG
>>164
オブジェクトリリースがされて無かったってこと?
0167デフォルトの名無しさんNGNG
>>163,165 状況がいまいち分からん。
0168デフォルトの名無しさんNGNG
typedef int* pint;
pint a = pint();
if ( a==NULL ) print( "あひゃ(・∀・)";

これ、typedef使わずにやるにはどうすればよかと?
0169168NGNG
ぐふ、そのまま実行すんなよ、printなんて関数はない上に)が抜けてる。
0170デフォルトの名無しさんNGNG
入力された文字を検索かけてるけど、WHLIE文でEOFにすると無限ループになるんです。
EOFはファイルじゃないと使えなかった?
0171デフォルトの名無しさんNGNG
>>170
文字列なら、\0とかでいいんじゃないの?
0172>>139NGNG
>>139
C といっしょに、*UNIX の勉強した方が早い* と進言致します。
低水準とか高水準って説明を真に受けないで、
標準関数とシステムコールの違いをしっかり意識してからの方が
理解が早いでしょう。

こんな感じの本かな
http://www.amazon.co.jp/exec/obidos/ASIN/4894713195/250-9016572-4192253
0173164NGNG
>>166
メモリから何から何まで開放せず強制終了させていた・・・
ガタガタブルブル
0174159NGNG
UNIXのEOFはCtrl-Dだったと思うがDOSは知らん。
文字列じゃなくて標準入力からEOFは打てないのかという質問ではないですか?
0175デフォルトの名無しさんNGNG
#define EOF (-1)

南無・・・
0176デフォルトの名無しさんNGNG
>>170
ダメ。 入力されて判断してるから、無限になっちまうす
0177デフォルトの名無しさんNGNG
>>173
サーフェイスいじくってると面白いように落ちる(←アフォ)けど、
やっぱあれはDirectDraw残ってるのかなぁ。
ウィンドウが消滅した時点で自滅してくれるとうれしいんだけどなぁ。
0178デフォルトの名無しさんNGNG
DOSはCrl+Zだったと思う。
つか、どういうコード?
0179159NGNG
>>165
ごめんちゃんと読んでなかった 今度こそほんとに逝ってきます
0180デフォルトの名無しさんNGNG
>>179
イキロ!
0181デフォルトの名無しさんNGNG
文字入力して、それ以降に何回その文字が入力されたかカウントするこーど
0182デフォルトの名無しさんNGNG
すまん、誰か>>181の逝ってることをうまく翻訳してくれ。
0183デフォルトの名無しさんNGNG
>>181
ん、、、どうでもいいってことかな?
0184デフォルトの名無しさんNGNG
>>170
入力をchar型で受けてない?
K&R開いてgetchar()とかの帰値の型を空の穴くまでみれ。
0185173NGNG
作ったものは開放しないとメモリに残るよ。
勝手に開放されるのもうれしいけど、それだと逆に怖いよ
0186デフォルトの名無しさんNGNG
gets(str);
while(*(str++) != '\0'){
・・・
}
というでわないのか?
0187185NGNG
>>177
が抜けてたので逝ってきます・・・
0188デフォルトの名無しさんNGNG
>>186
違うみたい。でも、入力をCHARで受けてる。
0189デフォルトの名無しさんNGNG
進行はやっ
0190デフォルトの名無しさんNGNG
(゚д゚) ・・・
0191 NGNG
こんな感じ

char c;
while((c = getchar()) == EOF) {
  my_count(c);
}
my_print();

これなら少なくとも cがintでないと無限ループになるよ
0192デフォルトの名無しさんNGNG
?マーク忘れた
0193デフォルトの名無しさんNGNG
>>192
すげー混乱した。
0194デフォルトの名無しさんNGNG
>>191
そうなら、
((c = getchar()) != '\n'
とかで改行終了とか
((c = getchar()) != 0x1b
ESC終了とかでいいでしょ。
0195デフォルトの名無しさんNGNG
>191
char がsignedなら、終わる。
0196デフォルトの名無しさんNGNG
getchar() のプロトタイプは
int getchar(void)
です。
0197196NGNG
つまり、
>>191 は char c; でなく int c; とすべきです。
0198デフォルトの名無しさんNGNG
LSICのまぬあるより

【解説】

getc(), fgetc()はファイルポインタfpで示されるファイルから1文字を入力
します。
getchar(), fgetchar()は標準入力(stdin)から1文字入力します。
getc(), getchar()はマクロとして定義されています。
これらはcharではなくint型の値を返すことに注意してください。

【リターン値】

入力した1文字を返します。ファイルの終りに到達した時には、値EOFを返し
ます。エラーを検出した場合にもEOFを返しますので、EOFかエラーかの判定
はfeof(3), ferror(3)を使ってください。
0199デフォルトの名無しさんNGNG
>>191は質問者じゃないよね?
質問者は寝たか。
0200デフォルトの名無しさんNGNG
RS232Cに見えてくるデータを読み出し、ファイルに落としたいんですが
どんな感じにコードかけば良いでしょうか?どこかにサンプルコードとか
おちてないでしょうか?
0201デフォルトの名無しさんNGNG
>>200
なら、最初からそう質問してくれ・・・
http://pc.2ch.net/test/read.cgi/tech/992057422/
に、いらんレスつけちゃったじゃないか。
0202デフォルトの名無しさんNGNG
ゲーム製作では、javaよりCが使われているのは本当でしょうか?
スピードの問題ならアセンブラもゲームでは有効だということなんですか?
0203デフォルトの名無しさんNGNG
>>202
上のはホントです。
下のは一部のライブラリにおいてホントです。
0204デフォルトの名無しさんNGNG
このスレの人達はなんだかんだ言って優しいと、
>>125からのやりとりを見て心底思った。
0205デフォルトの名無しさんNGNG
>>203
ということは、cを中途半端な状態でjavaに行くよりしっかりとcを極めたほうが
言いということでしょうか?それとアセンブラもわかってないと困ることに
なるんでしょうか?
よろしくお願いします。
0206デフォルトの名無しさんNGNG
cは概要だけでいい。
できればいきなりjavaに行くのがいいと思うが・・・

cにどっぷりつかっちゃうと、javaのスタイルになれるのに時間がかかる
0207デフォルトの名無しさんNGNG
>>205
自分が何をやりたいのかはっきりさせること。
これが一番大事。動機付けて勉強できるという意味じゃ
他の分野の勉強するよりもプログラミングってのはいい位置にある。
目的がはっきりすれば自ずとどんな知識が必要になるのか分かるってもんだ。
0208デフォルトの名無しさんNGNG
>>207がイイこと言った!!
0209デフォルトの名無しさんNGNG
>>205
基本的に>>206に同意する。
つまり、Javaのスタイルに慣れておけば、Cでも、見通しや保守性の良い
スタイルでプログラミングできるようになると思う。

あと、アセンブラを勉強しておくと、実行効率の良いプログラムが
書けるようになるはず。
ちなみに、アセンブラはCやJavaに比べると単純な言語なので、
覚えるのは簡単。ただ単に、書く量と手間がかかるだけだよん。
0210デフォルトの名無しさんNGNG
>>209
俺はアセンブラをRISCの様な言語だど言ったらモルァ!すれでゴルァ!された。
0211209NGNG
>>210
CやJavaをCISCとするなら、たしかにアセンブラはRISCのような
言語に思えるけど・・・ゴルァ!されちゃったですかー。
0212デフォルトの名無しさんNGNG
javaに慣れてどうするの?とは思うが。
0213デフォルトの名無しさんNGNG
>>212
マジでそう思うの?
0214デフォルトの名無しさんNGNG
>>206
205じゃないですが、なるほど。
一通りCを勉強したらJavaもやってみますわ。
0215デフォルトの名無しさんNGNG
>>209
> ただ単に、書く量と手間がかかるだけだよん。

これがやっかいなんだが・・・
0216デフォルトの名無しさんNGNG
>>207
禿ドウ
言語やライブラリの知識があっても何も作らない人もいる。
それはそれで別にいいんだけど、そういうやつに限って
人に知識を自慢してきてウザかったりすることが多い

やっぱプログラマたるものなんか作ってナンボだよな
言語オタは逝ってよし
0217デフォルトの名無しさんNGNG
atan2をテーブル化したいんだけど
どうすればいいですか?
0218デフォルトの名無しさんNGNG
結局のところ、ポインタを極めてからjavaに行くか、ある程度のところ(入門書程度)
で切り上げてjavaに行くかで悩んでるのですが、そのあたりはどうなんでしょうか?
0219デフォルトの名無しさんNGNG
ゲーム製作が目的ならJavaじゃなくてC++に行くべきでは?
市販のゲームはほとんど全部C/C++製だろ?
0220デフォルトの名無しさんNGNG
>>217
単純にプログラム起動時に一度だけテーブルを作成すればいいんじゃない?
0221デフォルトの名無しさんNGNG
>>218
ポインタ知らないとバカにされます。
一生JavaやC#の様な過保護箱庭言語だけ使うつもりなら止めませんが。
0222デフォルトの名無しさんNGNG
>>221
そういうのだけはなりたくないな。
0223デフォルトの名無しさんNGNG
組込みや制御、もしくは OS、 OS に近い部分をちゃんと理解したいなら、
ポインタの理解は必須です。つまり、こんぷーたを本当に理解したいか否かです。
アセンブラもやった方がいいに越したことはないですが、
C のポインタを構造体、共用体を絡めてきちんと理解できていれば十分でしょう。
まぁ、これを理解するのもアセンブラをやったほうがハヤーイかも知れません。

アプリケーションだけを作っているつもりなら、
C をやらずにいきなり Java などの方が良いかもしれません。
その方がおぶじぇくとシコウをすんなり受け入れられるでしょう。
(この辺は >>206 にはげどうです。)
0224デフォルトの名無しさんNGNG
>>221
それは絶対にいやなんですけど。
やっぱポインタを極めてからjavaに移行するほうが身のためでしょうか?
でもあんまりCにはまるとjava理解するのに時間がかかるという方が多いので、
jabvaがわからなくて大規模プロジェクトに参加できないのではと不安になって
しまいます。ちなみにポインタを極めるのには思いっきりやっても自分の場合、
半年から1年はかかりそうなんですが。
0225217NGNG
>220
それはそうなんですけど
atan2ってy/xから角度出すじゃないですか
どうやってテーブルを作成すればいいのかな、と思いまして・・・
うう、能力不足
0226デフォルトの名無しさんNGNG
>>224
ポインタは、確かにひっかかりやすいところもあるけど、
まず本読んで、自分で書いてみないことにははじまらない。
わかんなくなったらまた聞きに来なさい。
0227デフォルトの名無しさんNGNG
>>225
atan_array[y][x]
みたいなのに入れとけばいんじゃない?
atan_array[y/x]ってやるのは得策じゃないと思う。
0228デフォルトの名無しさんNGNG
コンピュータアーキテクチャとOS(といまだとネットワーク)の理解がないと、
どこでどの仕事しようがタダの*兵隊*にしかなれん。

Cをある程度やれば、OSと、その背景にあるコンピュータそのものの理解が
必須になってくるが、Javaから入ると、VMの理解だけにとどまってしまう
可能性がある。ガベコレがどーのとかあおってる連中とかが陥ってる罠だな。
視野狭窄だ。

ポインタを覚えるのが重要なのではなくて、もっと、アプリケーションを支える
環境(OS, ハードウェア)がどうなっているのか、ということに留意すること。
0229デフォルトの名無しさんNGNG
>>224
何でもCでできるんだ!っていうC厨にならなければいい(すべての言語に言えるけどね)。
ポインタを知っておけば参照とかオブジェクトとインスタンスの関係などがイメージしやすいかなと思います。

なんでも知っている分には損はない。
0230デフォルトの名無しさんNGNG
不便な環境を知らないと、便利な環境を便利とは感じない。
一度便利な環境に触れてしまうと不便な環境には戻れない。
0231デフォルトの名無しさんNGNG
やっぱプログラマなら組み込みだよね。
あこがれるけどなりたくはないな。
0232初心者NGNG
いきなりCから始めてもなんとかなりますか?
0233デフォルトの名無しさんNGNG
>>232
なんとかなります。
>>228の意見にはよく耳を傾けておくこと。
そしてPC-UNIX、(以下略
0234217NGNG
>227
どうもありがとう
なるほど、分けて考えればよかったか

ただ配列がでかくなりそうだ・・・
大丈夫かな
0235デフォルトの名無しさんNGNG
>>232
C++は分からないけど、Cなら大丈夫でしょう。
ポインタだって通常の変数と同じようなものだと考えれば引っかかることはないし。
0236227NGNG
>>234
ゲーム等に使うなら、256x256くらいの分解能があればだいじょぶかも。
atan_array の型をsigned shortにして、整数部 9bit(符号付) + 小数部 7bitの
固定小数として扱えば、±180度カバーできて、1要素2バイトなので、
デーブルサイズは128KBでいけるかな。
0237デフォルトの名無しさんNGNG
>>235
参照時の動作が異様に普通の変数と違いますが・・・。
0238227NGNG
>>234
ごめん。よく考えたら、2次元配列にするひつようなかった。
xとyの絶対値が大きいほうが256とか1024になるように正規化
(xがデカい場合は、y = 1024*y/x; x = 1024; みたいな)すれば、
degree = atan_array[xかyの絶対値が小さいほう];
ってな感じで、1次元配列でOKでした。
0239224NGNG
皆さんどうもありがとうございます。
それと、アセンブラなどの知識はどの程度もっていたらいいでしょうか?
やっぱりゲームとかやりたいなら、結構やっておいたほうがいいでしょうか?
それと、ゲームではどの程度アセンブラが使われているのでしょうか?
0240デフォルトの名無しさんNGNG
>>239
世に出てるゲームで、VB製がどれだけあるか考えてみろ
VBでインラインアセンブラが使えるか考えてみろ

VBは確かに糞ゲーが多いが、そんなことを質問している時点では
その糞ゲーすら作れないから安心してできる事からやれ。
そもそも3Dのゲームでも現在はアセンブラを使うのはごく一部。
最適化ヲタでもない限り、わざわざアセンブラを使う野郎は少数派
0241デフォルトの名無しさんNGNG
おまえらな、いつまでも古い言語つかってんじゃねーよ
これからはPERLだよ、PERL。わかったか、ヴォケ
0242デフォルトの名無しさんNGNG
>>241
Ver 6まで行こうとしてる言語が新言語か?
0243デフォルトの名無しさんNGNG
>239 = >>224
おそらくまだかなり若いのでしょうけど、はっきりいって、プログラミングに向いてないと思います。
プログラミングは自分で体を動かさないと身につきませんよ。
0244217NGNG
>238
そっちのほうがよさそうですね
使わさせてもらいます
0245デフォルトの名無しさんNGNG
>>242
それは言わない約束だろ
0246デフォルトの名無しさんNGNG
Cの勉強を始めたのですが
Web上では捜し物をするとあまりにいろいろなモノがヒットしてしまい
探しにくいのですが
「ここが総本山」的な日本語C言語解説サイトとかリンク集ってありますか?
0247デフォルトの名無しさんNGNG
ねこでも
0248デフォルトの名無しさんNGNG
猫とCFAQ
0249デフォルトの名無しさんNGNG
>>246
つぅかネットなんかで基礎勉強しようとするな。
0250デフォルトの名無しさんNGNG
善し悪しがわからんうちは本読んでろ。
ダメ本も数多いが、webの解説のほうがクズ率高い。
0251デフォルトの名無しさんNGNG
>>237
使い方はかわらないだろ。
0252デフォルトの名無しさんNGNG
>>246
とりあえず本は2冊以上買え。Cの入門書は比較的ハズレが多いから
1冊だけ買った本が糞だと自分も糞プルグラマーになるぞ。
■ このスレッドは過去ログ倉庫に格納されています