1 :
デフォルトの名無しさん :
2005/04/06(水) 13:06:49 プログラムを本だけで勉強しているときに、 その本の内容が分からないときがあります。 そのとき、この本の何ページのどの部分が分からないと書き込むと、 答える側もその本を持っていれば伝えやすいと思いました。 ちなみにこのスレは【独習C】を利用。 早速分からないのですが、475ページの簡単な電子電話帳のプログラムの中の、 関数enterで、if(!*names[loc]) break;とあるのですが、ここで*をつける理由は何ですか?
2 :
2gets :2005/04/06(水) 13:12:22
names配列のloc+1番目のアドレスが指す先のデータがNULLでなければbreak
3ちしげ3ゆ3様が電光石火の3ゲットなの!
>>1 番かわいいのはさゆなの!
ノノハヽヽ〃ノハヾ /)
>>2 じ本はハゲすぎなの!
後
>>10 は落ち目すぎなの! ∩*・ 。.・)从*・ 。.・)/ミ
〃ノハヾノノハヽヽノノハヽヽつ い
>>4 川は黒すぎなの!
矢
>>9 ちもフケすぎなの!⊂(。.・从(・ 。.・*∩ノノノハ 。.・)ノハヽ
(( (\ゝノノノハノハ〃ハ v)っ彡*・ 。.・)
あ
>>8 やはフケすぎなの! ⊂`ヽ从*・ 。.・)・ 。.・))ノノノハヽつ ))
>>5 んのは顔ふくれすぎなの!
大の大人が
>>7 っちとか(プ⊂\ ⊂ ) _つ从*・ 。.・)
(/( /∪∪ヽ)ヽ)/ U つ モー
>>6 すは売れなさすぎなの!
∪ ̄(/ ̄\) ゝし'⌒∪
>>11-1000 さゆのかわいさの前にひれ伏すの!
( ´,_ゝ`)プッ
5 :
デフォルトの名無しさん :2005/04/06(水) 13:18:38
>>2 何で*を付ける必要があるのですか?
namesはもともと配列なので、付ける必要は無いと思うのですが・・・。
6 :
2gets :2005/04/06(水) 13:23:55
7 :
デフォルトの名無しさん :2005/04/06(水) 13:29:11
>>6 自分ではしてるつもりなんですが、さっぱり分からないです。
8 :
2gets :2005/04/06(水) 13:33:16
!names[loc]ならそこに入ってるデータで *names[loc]したらそこに入ってるデータをポインタとして指している先のデータでしょ 俺もよくわかんね
9 :
デフォルトの名無しさん :2005/04/06(水) 13:47:59
>>8 このプログラムだと結局*names[loc]はどこを指しているのですか?
10 :
デフォルトの名無しさん :2005/04/06(水) 13:48:40
>>8 このプログラムだと結局*names[loc]はどこを指しているのですか?
11 :
>>8 :2005/04/06(水) 13:50:23
>>8 このプログラムだと結局*names[loc]はどこを指しているのですか?
>>1 そもそもnamesはどういう宣言をしているんだ?
独習C持っていないからそこが知りたい。
読んでわからないようなカスな本は捨ててしまえ。
フォースを使え!身体で感じるのだ!
15 :
デフォルトの名無しさん :2005/04/06(水) 15:27:19
>>5 *を付ける理由はnames[loc]ごとに確認したいからでは?
names全体として確認したいのあれば、付ける必要が無い。
と思う・・・。
*names[loc] -> *(names[loc]) -> names[loc][0] -> loc番目の文字列の先頭の文字。 if(*names[loc])はナル文字が入っていた場合false。 !が付けばナル文字が入っていた場合true。 んで、getsで文字列を読み込んだ場合は改行文字がナル文字に置換される。 改行だけ読み込んだ場合にはif文が実行されてbreak じゃねーの?
17 :
1 :2005/04/07(木) 04:05:14
18 :
13 :2005/04/07(木) 13:04:48
>>17 他人が読んで理解するのに苦労するような、
オナニーなコードを平気で例題に使うダメな本は捨てろ、マジで。
もしプロのプログラマなら、
if('\0' == names[loc][0]) break;
を
if(!*names[loc]) break;
のように書いたら上司にグーで殴られるぞ。
そんなトリッキーなコードを仕事で書くな、遊びじゃないんだ真面目にやれ、と。
19 :
デフォルトの名無しさん :2005/04/07(木) 14:38:08
へえ、それがトリッキーなんだ
もしプロのプログラマなら、 if('\0' == names[loc][0]) { break; } を if('\0' == names[loc][0]) break; のように書いたら上司にグーで殴られるぞ。 そんなトリッキーなコードを仕事で書くな、遊びじゃないんだ真面目にやれ、と。
21 :
デフォルトの名無しさん :2005/04/07(木) 19:20:40
( ゚д゚)
if( !**( names + loc ) ) breakl;
>>19 トリッキーだよ。
names[loc][0]
と
*names[loc]
で同じコードが生成されることと、
Cでは0が偽で0以外が真と定義されていること、
この2つを利用しているからね。
とくに後者は型を無視していて酷いね。
>>20 それは賛否両論あるけど、
一行で済む場合は、いちいち中カッコを書いたら、無駄に行数が増えて読みにくくなるよ。
まさかbreakの前に何か書き足す時に、中カッコを付けない人はいない・・・いるかもな。
>>23 それも賛否両論だね。
今時のコンパイラは警告出すしね。
ただ、条件文で代入まで一緒にやるような行儀の悪いコードの保守をしてると、困るんですよ。
ついでに両辺が変数だったらどうするかって? if(IS_SAME(a, b)) って書くのさ。
25 :
デフォルトの名無しさん :2005/04/07(木) 23:49:44
レベル低すぎ
names[]は、なんの、配列ですか。 ポインタがはいってるらしい? たbん、char *names[]? 仮にそうだとすると、 namesのloc番目のindexにchar *へのポインタが入ってるので (!*names[loc])は 仮に names[loc]にまともなポインタが入ってて、 *でデリファレンス(言ってみたかっただけ)できた とすると、 その場合に得られる、 文字列の開始アドレス位置の文字コードがnullchar'\0'でなければ かな
...訂正 - nullchar'\0'でなければ + nullchar なら ねる。
>>25 低いな〜と思うくらいでちょうどいい。
おれで
なければ
にわかには
いじれない
じゃ困るんだよ。
低オナニー児か・・・
>>25 とは趣味が合いそうだ
ところで、グーパンチしてくる上司はどうなんだ? 案外普通にいたりするもんなのか?
このスレまだあんの?
32 :
こうろぎ :2005/07/22(金) 17:39:50
独習C第版で分からない事があります。 誰か教えて下さい。
最初に何がわからない書いてくれないと答えられない。
34 :
デフォルトの名無しさん :2005/08/17(水) 22:08:43
hoshu
35 :
名無しさん :2005/08/17(水) 22:19:14
あのぅ、C言語でゲーム作れますか。
>>35 作れるがスレ違い.おまえさんが想定するゲームの種類にもよるが,阿呆でもそれなりに
ゲームっぽいものを作れるのだと自己満足に浸りたいならHSPあたりでもいじくってたら
よかろう.
37 :
名無しさん :2005/08/17(水) 22:46:51
わかりました。
>>38 >>1 は 第3版の apdC-129.c について問うているはずなんだけど第何版みてるの?
40 :
デフォルトの名無しさん :2005/08/28(日) 05:20:52
今日買ってきたよ。独習C。 初めてプログラムに触るのに、これはまずかったかもわからんね。 もうちょっと簡単そうなの買えば良かった。今は反省している。
>>40 いや、これはかなりいい書籍だと思うよ。
確かに、リトルエンディアンだのCPUについてのちょっとした知識がさも知っているかのように
扱われているけどそういうことはちょこっと調べればわかること。
ほとんどの説明はわかりやすくて、プログラマのミスして覚えてしまいやすいことなど、効率的なANSI-Cコーディングスタイルを
身に付けるには最適な書籍だと思う。こういうのはまとまった時間にやるのがいいかも。
>>41 そうなのか。たしかにちょっと検索すればいいだけだもんな。
一冊の本で簡単にすませられるわけじゃないし、俺が甘かった。
これからまとまった時間になるので、勉強します。
>>42 プログラミング自体がまったくの初めてということなら 高橋麻奈 の本
あたりが最初の一冊としては向いているかも知れんね。
>>41 も言うとおり、独習C はあとあと読み返して復習するにも良い
本だと思うよ。初歩の初歩を理解してからトライするってのもおすすめ。
44 :
デフォルトの名無しさん :2005/09/18(日) 19:31:42
独習CでC言語の勉強始めたけど… ファイルの入出力でつまずいてるorz この書籍のポインタは大丈夫なのに… こんなおれは変ですか?
変じゃないよ。 ガンガレ
46 :
デフォルトの名無しさん :2005/09/18(日) 23:01:11
よかった… 配列とポインタがむずいって言われてるから、 おれだけかと… いろいろ調べてやってきます ガンガレ言うてくれてありがとう
猫でもわかるC言語入門と言う本をやってるのですが、スレタイの本も買いですか?
暇を持て余しているのなら。
ちゃんとした本見て後から猫を見るとすげーはしょっててuzeeeeeeeeeeeeeeeeeeeeeeeeeeeとオモタ
50 :
47 :2005/09/19(月) 21:08:26
>>48 仕事終わると暇な時間が出来るので買ってみます。
>>49 確かに猫見てると
今は覚えなくていい とか多いですね。
CやC++には、とりあえず最初は知らなくてもいいものがある。 なかには、最後まで知らなくていいものもあるかもしれない。 初級者が陥りやすいのは、本に書いてあることをすべて理解しようとすること。 たいていの本は、重要さの順番ではなく、知らない事柄が説明なしで登場しない順番に書かれてる。 それによって、多くの人が挫折したり、実戦では役に立たないようなコードに頭を悩ませたりしてしまう。 プログラムを書くのに、 言語のすべての機能を使いこなして書かなければいけない、なんてことはない。 言語のすべての機能を知っていないと罠にはまることも多々あるけれども、それは初級では気にしないでいい。 よくわかんないけど、サンプルコードを真似してみた よくわかんないけど、とりあえず動いてる というのは、実に恐ろしいことで、実戦では許されないことだけど、 学習段階で書いたプログラムを実戦で使うわけではないので、 ある程度プログラムが書けるようになるまでは、 適当なプログラムのソースで使われている事柄だけ、本で勉強すればいい。 とりあえず知らなくていいこと ・ポインタのポインタ ← typedefを使え ・scanf関数の使い方 ← そんな危ない関数は使用禁止なので、覚えても無駄。ポインタの例題としては罠がお大杉。 ・標準入力 ← 何が入ってくるかわからないものは初級者には難しいのでパスしてよい ・ファイル入出力 ← 入力データはソースコード上に、出力データはデバッガで確認しる。
53 :
デフォルトの名無しさん :2005/09/20(火) 10:06:23
>>51 挫折しかけてました。
でもレス読んでまたやる気が出てきました!
肝心なことが書いてないのはストレスになる。 知りたいと思ったことがちゃんと書いてあるのが良い本。 ダメ本は良書の劣化コピーだったりする。
とにかく基礎の終わりまでを挫折することなく導いてくれる本でなきゃね
挫折したくなかったら、言語よりも先に、コンピュータの仕組みについて勉強することだ。
57 :
デフォルトの名無しさん :2005/09/22(木) 04:04:56
>>51 scanf(strcpy...等の)関数が危ないというのは、たまに聞くのですが(スタックオーバーフロー?)
代わりに、通常はどういった関数を使用するのでしょう?
>>57 それを>51に聞くのは筋違いと言うものだろう。
scanf()は単純に置き換えることはできないが、fgets()+sscanf()でほぼ同じ結果が得られる。
ただし、入力処理としてはそれでも完璧ではないので要注意。
strcpy()などは入力を伴うわけではないので充分注意して使えばいい。
これも、sprintf()などを使うことでより安全にすることもできる。
59 :
デフォルトの名無しさん :2005/09/22(木) 04:41:39
>>58 >それを>51に聞くのは筋違いと言うものだろう。
スンマソ
ググれば色々と確かにhitするのですが、プロとかは
どうなのかなぁとか、おもつたのでした。(^^;
61 :
デフォルトの名無しさん :2005/09/22(木) 17:22:10
fseek(in, 0L, SEEK_END); ↑の0Lというのはlong 0って意味? イチイチlongとか指定しないといけない理由は? ”0”だけだとなんか問題があるのだろうか?
62 :
デフォルトの名無しさん :2005/09/22(木) 17:24:14
>>61 に追加
in=fopen(argv[1],"rb"
改訂版 P256の例2より
>>61 そのとおりで0Lはlong型の0を表す。
fseekのプロトタイプがある(<stdio.h>をインクルードしている)のであれば、
Lはなくても暗黙の型変換がはたらくから無問題。
64 :
デフォルトの名無しさん :2005/09/22(木) 21:03:48
65 :
51 :2005/09/23(金) 02:10:12
>>59 プロではないけど・・・
scanfを使うような機会がないんですよ。
だからscanfはスルーしていいよ、というわけです。
strcpyは使うのが難しいのです。
strcpyがコピー先の大きさを考慮してくれないので、
プログラムを書く人が考慮してやらないといけなく、
それをミスすることが少なくないので、使わないほうがいいのです。
strncpyを始め、いくつかのコピー先の大きさを考慮したものがありますが、
バッファの大きさを管理するのが面倒でミスしやすくなります。
したがって、CではなくC++の、何らかの文字列クラスを使う、というのがよいと思います。
文字列クラスを使うのに必要最小限のことだけC++を学び、使うのも悪くはないですよ。
>>60 ヘミ猫と一緒にされたくはないぞ。
>>61-63 今どきのCコンパイラは警告を出してくれるし、C++ならエラーになるけど、
昔はプロトタイプ宣言がないと、適当な型でスタックに積んでしまう仕様だった。
んで、longとintのサイズが違う環境だと、色々と悲惨なことが起きていたのでした。
66 :
59 :2005/09/23(金) 17:43:02
>>65 わかりやすいレスありがとうございます。m(__)m
2chの方々はアグレッシブな方が多いので打たれ弱い私は
枕を濡らしいました。(^^;
>文字列クラスを使うのに必要最小限のことだけC++を学び、使うのも悪くはないですよ。
ポインタまわりの書籍を、一冊こなした後に、是非学んでみたいと思います。
69 :
デフォルトの名無しさん :2005/09/23(金) 18:50:46
p -> count; m = (a > b) ? a : b; みたいな古い?(K&Rにでてきそうな)を、理解できるようになるには 独習Cでは限界があるような。。。。 最近Cの勉強を始めた人たちは、古いソースを読むときとかって どうしてるのだろう?
>>69 いきなり p -> count; と書かれても
何が言いたいのか意味不明
71 :
デフォルトの名無しさん :2005/09/24(土) 01:59:31
■■■■■■■■■■■■■■■■ ■ ■ 違う板にコピペすると、四角の枠の中に ■ ■ メッセージとURLが現れる不思議な絵。 ■ ■ ■ ■ (その仕組みがリンク先に書いてある) ■ ■ ■ ■ この原理を応用すると、まったく新しい ■ ■ コピペが作れる予感。 ■■■■■■■■■■■■■■■■
74 :
デフォルトの名無しさん :2005/09/24(土) 03:31:48
>>73 独習CってANCI標準に適応してたとおも。
で、
->(何演算子っていうのかは知らんw)とか三項演算子(?だっけ)に
関する記載ってなかったような気がするなぁ。。。
っていううる覚えの発言なのだったのだよぉ
>>74 それ全部最後の方だ
そこ行く前に挫折したんだな
76 :
デフォルトの名無しさん :2005/09/24(土) 18:38:35
>>75 そうだったかもなw
プハー ○o。.(-。-)y-~~
/\ / \ 今このとき,モナーは立ち上がる― /∧_∧ \ /( ´∀`) /\ \( ) / \ \ / \ \/ \ ∧∧∧∧\ ( ´/) ))ヽ∧ / / / ´∀) ∧∧ ○( イ○ ( ,つ, ,゚Д゚) /ヽ )) ヽ )ヽ )と , イ (_/(_/(_/(_/ノ(_/⊂ノ> )J / ̄Y ̄`|/ ̄^Y ̄ヽ/ ̄ ̄Y
>>74 >->(何演算子っていうのかは
アロー演算子じゃ炉?
以下が3項演算子
(a > b) ? a : b
? : の正式名称は条件演算子。 単項、2項演算子は数あれど3項演算子はこれ1つしかないから3項演算子と言っても確かに通じるけどさ。
80 :
デフォルトの名無しさん :2005/10/01(土) 20:15:30
独習c++ 337ページの void queue::store(int i){ list *item; item = new queue; if(!item){ cout << "リストは空です\n"; return 0; } item->num = i; if(tail) tail->next = item; tail = item; item->next = NULL; if(!head)head = tail; } これでどうしてキュー構造ができるのかわかりません ><
>>80 なにそのコード。
そんな糞なコードを教える本なんて捨ててしまえ。
82 :
デフォルトの名無しさん :2005/10/02(日) 02:22:09
いちいち独習なんていうDQNなタイトルと、我流な内容で、地雷本だから。 読者が独習するのではなく、筆者が独習して書いた、ってことだと理解するよ。 読者が独習するのは、当たり前のことだからな。
>>82 ページの左上が髪の毛くっついてるように見えるから
なにこのprintfのフォーマット指定子のダラダラと長い説明 呼んでて眠くなってきた
図書カード入力プログラムなどで、いくつかの入力関数が機能しない というか完全無視されて次の命令文に移って激しく困っている 特に深くネストされたループ構文内のgetsやfgetsなどは重症で scanfにすれば動いたりする また構造体最初のch10-01.cのch1文字入力もダメで、整数入力の手前(つまり最初)に 持ってくれば大丈夫だったりと、もう意味不明 これコンパイラが悪いの?
>>86 scanfの原則空白や改行文字を読み飛ばす仕様が関係すると見た。
89 :
デフォルトの名無しさん :2005/11/29(火) 17:43:21
一応保守しておこうか
C++のコンパイラだとその手の不具合は当たり前
91 :
デフォルトの名無しさん :2006/01/15(日) 00:17:54
独習C、大学で買わされたのですが、結局なにも分かりません・・・。 時間かけてない自分も悪いのですが。 4年で研究のときに使いますし、就職活動なんかでも自信を持ちたいので、 なにか独習Cをやる前の良書ありませんか? これさえ分かればとりあえず事足りる、みたいな最低限の書籍なんかあれば見てみたいです。 C言語の本のスレがあれば、そちらを教えていただいても構いません。
言語の前に、CPUの仕組みについて、勉強すべきだろう。
>>91 つ『プログラムは何故動くのか』
つ『やさしいC』
俺は大学の講義+『Cの絵本』と『猫でもわかる〜』を使ったが、猫の方は2ch的にはお勧めしない人が多いらしいので、俺も薦めることはしない。
とりあえず、スレ違いなのでこの辺で。
スレ住民>
スレ汚しスマソ。
95 :
デフォルトの名無しさん :2006/01/16(月) 16:43:12
独習C第3版のP305 10.4のビットフィールド例2(ch10-11.c)について 「コレにより作成されるディスクファイルは、100バイトを越えることはありません」 とあるけど、実際は400バイトのファイルが出来た。 どういうことでしょう? struct telemetry { unsigned fuel:1; unsigned radio:1; unsigned tv: 1; unsigned water:1; unsigned food:1; unsigned waste:1; } flt_recd; ↑コレを100回ファイルに書き込むプログラム。 本持ってない人には分かりにくくて申し訳ない
>>95 その本持ってないからどんな説明してあるのか知らんが、コンパイルスイッチの問題。
データアラインメントが DW になってるんでないか?
97 :
96 :2006/01/16(月) 18:29:55
追加 コンパイルオプションは今のままで、100回ファイル書き込み部分の直前に、 printf("struct size : %d\n", sizeof(flt_recd)); って入れて、再ビルド&実行してみ? 4 って表示されると思う。
98 :
95 :2006/01/16(月) 19:00:11
>>96 レスありがとうございます。
確かに
>>97 の通り struct size : 4 となりました。
原因は自分なりに理解できましたが、コンパイルスイッチについては検索してもよく分からずじまいでした。
変更の仕方などヒント有ればお願いしたいです。暇な時で構いませんので
ちなみにコンパイラはbcc5.5です。
100 :
95 :2006/01/16(月) 20:21:59
>>99 それで出来ました
どうもありがとうございます。
>>99 bcc って、コマンドラインからビルド実行するのか ・・・ 今となっては懐かしいな。
ともあれ、身代わりレス さんくすこ。
しかし【独習C】ってのは、読んだことないけど不親切な本だな。 win の世界では、
構造体をファイル入出力したときのバイト数を云々するときには、データアラインメントに
ついての言及は避けて通れない筈だが ・・・
たぶん註が付いているとは思うけど。
>>100 素人質問者を装って 100 Get する、ニクい香具師。 やられたゼ。
コンパイラの引数のスイッチでやると、トラブルになりやすい。 コンパイラに依存してしまうが、 ヘッダファイルの、その構造体を宣言するところだけを、 #pragma を使って設定を変更すべし。
/*独習Cで独習し終わったので、記念かきこ。 いずれK&R読むかもしれないけど、次は独習C++か・・・ 何度かここではお世話になったので、ありがとう */
その気持ちのまま
>>82 で
独習Cを激しくプッシュしてきてくれ
107 :
デフォルトの名無しさん :2006/03/01(水) 13:43:10
独習JAVA第3版の317ページ、問2のことで質問があります。 答えのソースを実行しても、Stackクラスを利用することができません。 ほかに何か設定が必要なのでしょうか? コンパイラはEclipseのバージョン: 3.1.1で、 JDKは1.5.0_06です。 よろしくお願いします。
import java.util.*; class Task extends Thread { ResourceCoordinator rc; int id; public Task(ResourceCoordinator rc, int id) { this.rc = rc; this.id = id; } public void run() { try { // 無限ループを作成する while(true) { // リソースを取得する Resource r = rc.getResource(); // リソースを使う int t = (int)(10000 * Math.random() + 1000); Thread.sleep(t); // リソースを解放する rc.releaseResource(r); // 次の作業をする前に休眠する Thread.sleep(8000); } } catch(Exception e) { } } }
class Resource { int id; public Resource(int id) { this.id = id; } public String toString() { return "" + id; } } class ResourceCoordinator { Stack resources = new Stack(); public ResourceCoordinator() { for(int i = 0; i < 4; i++) { resources.push(new Resource(i)); } }
public synchronized Resource getResource() { while(true) { // リソースが使用可能かチェックする if (!resources.empty()) { Resource r = (Resource)resources.pop(); System.out.println("Get resource " + r); return r; } // 使用可能なリソースを待機する try { wait(); } catch(InterruptedException ie) { ie.printStackTrace(); } } }
public synchronized void releaseResource(Resource r) { // リソースをスタックにプッシュする System.out.println("Release resource " + r); resources.push(r); // 待機中のスレッドすべてに通知を送る notifyAll(); } } class ResourcesTasks { public static void main(String args[]) { // リソースの調整役を作成する ResourceCoordinator rc = new ResourceCoordinator(); // 作業を作成する for(int i = 0; i < 10; i++) { new Task(rc, i).start(); } } } 上記がソースファイルです。
ウワ!!! スレを間違えました。 orz すみませんでした。
>>114 すみません。
ことごとく誤爆の連発です・・・。
少し寝ろw
どじっこワロスw
>>107 と
>>108 はイイのか。
次スレ【独習C C++】本を読んで質問【独習Java】だなw
ここって独習C++もいいんですか? 独習C++の12章の理解度チェックの問題4 の解答をコンパイルしてみたらエラーで動きません。 警告も出ています。 警告の内容は以下のとおりです c:\一鉄\趣味\ゲーム作成\勉強\TeachYourselfC++\12-check-4.cpp(45) : warning C4541: 'typeid' が /GR- を使用したポリモーフィック型 'A' で使用されています; 動作結果は保証されません。 c:\一鉄\趣味\ゲーム作成\勉強\TeachYourselfC++\12-check-4.cpp(47) : (省略) c:\一鉄\趣味\ゲーム作成\勉強\TeachYourselfC++\12-check-4.cpp(49) : (省略) 警告だけで、エラーではないのでコンパイルは出来ます。 ですが実行時になってからエラーが表示されます それの内容は This Application has requested the Runtime to terminate it in an unsual way. Please contact the application's support tema for more information. です。 いろいろためしてみると myclassというクラスとそのクラス型のobjというオブジェクトがあったとすると typeid(obj)は機能するのですが typeid(myclass)は機能しません。 だれかどうすればいいか分かる方はいませんか? 長々とすいませんですた