1 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 20:15:31 ] C言語の入門者向け解説スレです。 教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 117代目 pc11.2ch.net/test/read.cgi/tech/1225320579/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 37 pc11.2ch.net/test/read.cgi/tech/1224000127/ 過去スレ 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
75 名前:デフォルトの名無しさん [2008/11/01(土) 19:05:08 ] 関数の事で質問なのですが、 呼び出すときに、呼び出し先で出力しているのでしょうか? returnを付ける事で、呼び出し元に値を返して出力しているのでしょうか?
76 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:07:18 ] >>75 出力、って何をだ? 日本語でおk、って言いたくなるんだが。
77 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:08:02 ] 呼び出し先で出力することもあるし、 呼び出し元で出力することもあります。
78 名前:デフォルトの名無しさん [2008/11/01(土) 19:13:55 ] if文の比較部分で if(a==b){xxx;} って書くところを間違えて if(a=b){xxx;} って書いてもコンパイルできますが、この場合ifの処理はどうなるんですか?
79 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:15:11 ] bをa に代入した後その値を見る そして、0なら偽、0以外なら真
80 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:16:33 ] >>78 警告がでたらエラーと思え。
81 名前:デフォルトの名無しさん [2008/11/01(土) 19:17:03 ] >>74 国際規格って書いてあるだろ、知らないのか ISO を?
82 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:18:16 ] どうせそれぞれの差異にかかわるような話なんてしないんだから どれでもいーじゃねーか 他でやれ
83 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:29:01 ] >>81 最初に書いてある国内ってのは、脳内では無かったことになってるのか。
84 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:32:52 ] >>75 質問は返り値(戻り値)のことでの疑問でしょうか? それなら簡単です。関数の戻り値は、通常の変数の値と同じ理解でいいんですよ。 int func( int a, int b ) { return ( a + b ); // int型の関数func は常に a + b の値を返します。 // つまり関数func は a + b というint型の値を持つ変数と同じ性質です。 } void main( void ) { int n; int a = 1; int b = 2; n = func( a, b ); // n には関数funcが返す値 a + b が代入されます。n = a + b; と同じです。 }
85 名前:デフォルトの名無しさん [2008/11/01(土) 19:46:51 ] >>83 国際って書いてあるのを見落としたお前の失態
86 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:51:55 ] >>85 『「国内・国際」って書いちゃったけど、やっぱ国内のほうは無しで、国際だけね」ってこと?
87 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:52:34 ] 揚げ足取りみたいなバカがいるようで、やはりここは 回答者のレベルが低い、知能も知識も、精神レベルもw こんな腐った場所で質問する初心者は、場所を変えた方が良い。 まともな学校に通いなってことだ。所詮、ここは偽善有志者による 無責任で、一部の人間の自己満足で運営されていますからw
88 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:54:47 ] あと 俺は英語なんて読めなくてJISの訳がどの程度の質か知らんし、 >>74 は適当に思いつきで煽っただけだから、 あわてて「国際」の話だとか言い訳する必要も無いよ。
89 名前:デフォルトの名無しさん [2008/11/01(土) 19:54:48 ] >>86 ISO とも書いたがそれも読めてないようだな >>87 学校というより収容所のせいだろう
90 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:57:50 ] そもそも >>71 が激しくどうでもいい揚げ足とりだしな。
91 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:58:52 ] >>89 それくらいは読めてますよ。
92 名前:デフォルトの名無しさん [2008/11/01(土) 20:55:12 ] Borland C++ Compilerがダウンロードできないんですけど どうすればいいですか?
93 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 20:55:55 ] がんばってもっと探しましょう
94 名前:デフォルトの名無しさん [2008/11/01(土) 21:08:19 ] 他のコンパイラ探せってことですか?
95 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:13:15 ] Borland C++ Compilerでググって最初に出てくるページは違うのか。
96 名前:デフォルトの名無しさん [2008/11/01(土) 21:19:56 ] www.codegear.com/jp/downloads/free/cppbuilder ここで C++Compiler / Turbo Debugger をダウンロードしたいんだけど ユーザー登録してダウンロードのできるページに行こうとすると 表示するページがないって出る。ユーザー登録したメアドには Zip解凍パス届いてるのに…。
97 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:22:40 ] BCCは時代遅れだからVC++にしておけ。
98 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:25:50 ] >>96 俺もダウンロードできないな。 > 上記のダウンロードサイトにアクセスできないときは、CodeCentral のダウンロードページをお試しください。 > CodeCentralのダウンロードページを利用するには、CDNへのログインが必要です。 ダウソのページに↑と書いてあるけど、CDNの登録とか面倒だから、これ以上はためさないけど。
99 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:26:55 ] Cコンパイラとして使うなら、どっちでもそう変わりないと思う。
100 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:27:42 ] でもダウンロードの敷居が違う。 だったらめんどくさい思いしてまでして使う理由が見当たらない。
101 名前:デフォルトの名無しさん [2008/11/01(土) 21:31:11 ] >>97 win2kなんでVC++使えないです…。OS自体が時代遅れなんで。 >>96 みんなそうなんだ?なんとかならないかな…。
102 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:38:31 ] cygwinやmingwなら登録いらずだよ。
103 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 22:07:57 ] >>101 ttp://phys.cool.ne.jp/physjpn/bccwin.htm なら一応bcc入りだよ?
104 名前:103 mailto:sage [2008/11/01(土) 22:14:09 ] 見つけた ttp://clove.rye.tama.ac.jp/~softcat/soft/win/ABCD/BorlandC++5.5.1Jfree/freecommandlinetools2.exe
105 名前:デフォルトの名無しさん [2008/11/02(日) 04:48:43 ] FILE型はどうしてオブジェクト型なの?
106 名前:デフォルトの名無しさん [2008/11/02(日) 05:00:12 ] >>34 BCPL Cの次はP言語
107 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 05:14:43 ] >>105 オブジェクトで何か問題が?まさか関数型だとでも?
108 名前:デフォルトの名無しさん [2008/11/02(日) 05:30:37 ] >>107 どうして構造体型じゃないの?
109 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 05:32:34 ] FILEのメンバーを気にしたことある?
110 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 05:33:31 ] うわぁ・・・
111 名前:デフォルトの名無しさん [2008/11/02(日) 05:42:23 ] >>109-110 何故オブジェクト型にする必要があったの?
112 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 05:43:45 ] Cでは整数もポインタも構造体もオブジェクトなわけだが…。
113 名前:デフォルトの名無しさん [2008/11/02(日) 05:46:16 ] >>112 オブジェクト型は総称じゃないの?
114 名前:デフォルトの名無しさん [2008/11/02(日) 08:48:57 ] 電気代を算出するようなプログラムを作っているのですが 電気代の方が正常に表示されません(有り得ない桁数が表示される)。 他の部分も、まだまだ作りこまれておらず稚拙な内容ですが とりあえず今は、電気代がきちんと出る事を目的としています。 使用しているコンパイラはVisual C++ 2008です。 どなたかご教授お願いします。
115 名前:114 [2008/11/02(日) 08:49:54 ] すいません、ソースコードを張り忘れていました。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7911.txt 宜しくお願いします。
116 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 08:57:22 ] scanf・・・恐ろしい子・・・
117 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 09:07:04 ] とにかくdoubleとの相性が最悪よね。どうしたのかしら。
118 名前:114 [2008/11/02(日) 09:13:07 ] >>116-117 つまりプログラムでのミスというよりは、仕様での異常という事でしょうか? そうなると、別の入力方法を考えないといけないわけですね・・・ ご解答有難うございました。
119 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 09:19:02 ] >>118 アホかい。自分が使い方間違っているだけだって。 つーか、そのミスに警告も出てないとしたら、コンパイラの使い方も間違っているかもしれないぞ。
120 名前:114 [2008/11/02(日) 09:31:16 ] >>119 そうだったのですか。 コンパイラはVisualC++2008の方に混同されているものですが 使い方などは考えたことありませんでした。 もう一度よく調べて見ます。 有難うございました。
121 名前:デフォルトの名無しさん [2008/11/02(日) 09:40:45 ] 誰か>>105 について教えて下さい
122 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 09:42:15 ] >>121 struct です
123 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 09:57:31 ] 1 は何故 int型なの? 'A' は何故 char 型なの? 0は何故偽値なの? if文は何故式じゃないの?
124 名前:デフォルトの名無しさん [2008/11/02(日) 09:58:46 ] >>122 何故オブジェクト型なのですか? 何故構造体型では無いのですか?
125 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:01:37 ] 構造体だって書いてあるじゃん。 バカなの?
126 名前:デフォルトの名無しさん [2008/11/02(日) 10:07:09 ] >>125 JIS X3010:2003にはオブジェクト型であると説明されているのですが、 あなたは構造体型であると言いたいのですか?
127 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:08:12 ] YES
128 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:12:13 ] >>127 どうして構造体型なの?
129 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:17:02 ] いや、間違った。別に構造体である必要は無いか。 規格でそこまでは決められてないな。 構造体以外で実装されている処理系は見たこと無いが。 Q.なぜ構造体ではなくオブジェクト型なのか? A.構造体です。 Q.なぜオブジェクト型なのか。 A.規格でそう決められてるから。
130 名前:デフォルトの名無しさん [2008/11/02(日) 10:18:58 ] >>129 、別に構造体型じゃなくても構わないッスw適当にやっちゃってよw、 って事?
131 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:21:37 ] 規格に書かれていないことは実装者の自由。 もっとも規格に沿ってない実装だってあるわけだから、 目指すものによって守るべきルールも決まってくる。 規格に無くても、世の中にはデファクトスタンダートと言うものもあるしな。
132 名前:デフォルトの名無しさん [2008/11/02(日) 10:21:57 ] ポインティンガーから構造体にアクセスするときだけ -> で いいのですか
133 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:25:09 ] >>131 なるほど、ありがとうございます。
134 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:00:04 ] っていうか、Cの規格のオブジェクトってのは、オブジェクト指向のオブジェクトとは別物だろ。
135 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:27:09 ] perlの処理系をC言語で作る事はできますか?
136 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:28:18 ] できますというかできてます
137 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:30:26 ] Perlの処理系はLarryの優しさから出来ています とりあえずこちらをご覧下さい ttp://www.cpan.org/src/README.html
138 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:36:02 ] 他にもC言語でできてる、代表的なソフトを教えて下さい。
139 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:39:41 ] Unix系OS
140 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:51:23 ] Cの処理系
141 名前:デフォルトの名無しさん [2008/11/02(日) 14:57:40 ] YO YO エビバーデー
142 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 15:29:45 ] フィンガー5じゃないが、リンリンしなくて良いからw
143 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 16:02:55 ] >>115 scanf("%f",&y); ↓ ^^ scanf("%lf",&y); ^^ printf("その電化製品で掛かる月の電気代は%e¥で、基本料金は%d¥です\n",ene,x); ↓ ^^^ printf("その電化製品で掛かる月の電気代は%.3f¥で、基本料金は%d¥です\n",ene,x); ^^^ これでいかがでしょう?(printfのほうは自分の好みで変更しました) ただ、xが使われていないような・・・
144 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 16:08:18 ] >>143 です 思いきりずれました つまり、scanfのフォーマット指定を"%f"→"%lf" pritnfのフォーマット指定を"%e"→"%.3f"(この3は小数点以下桁数なのでお好みで) でいかがでしょう?
145 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 17:49:25 ] いまひとつ有り得ない桁数というのが分からないのと それであってるのか分からないのだが eneは電気代じゃなくて一ヶ月分の消費電力しか計算して無くないか?
146 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 17:51:19 ] 普通、¥は接頭です。
147 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 17:55:35 ] 計算するときは、常に単位を意識するといい。 y * z * 30は、即ち y[W] * z[h/day] * 30[days/month]だからつまり、ene[Wh/month]となる。 つまり、月当たりの電力量と言うことだ。
148 名前:デフォルトの名無しさん [2008/11/02(日) 18:10:45 ] unsigned charの変数は初期化をしなくても問題は無いのですか? 大学の課題のサンプルプログラムの中に初期化も代入もせずに 値を参照している部分を見つけたもので気になって質問しました 試したところ確かに初期値?として0が格納されているみたいなんですが これをそのまま利用していいんでしょうか? 自分の知識や習慣だと変数を初期化等をしないまま参照するのは おかしい気がするのですが何かこうすることで問題が発生したりはしますか?
149 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:14:53 ] グローバルスコープやstaticな変数なら0で初期化される。 ローカル変数ならゴミが入ってる。
150 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:15:40 ] 型の問題ではなく、定義されている場所の問題。 関数内のローカル変数でstaticでないなら、初期化しないと不定値になる。
151 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:16:34 ] グローバル変数なら0で初期化される
152 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:19:43 ] >>149 あれ?関数内のstaticな変数は0初期化されないんじゃなかったっけ?
153 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:22:04 ] されます。
154 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:26:30 ] >>149->>151 おお、ありがとうございます! なるほど、型ではなくスコープの問題だったんですね 確かにそのプログラムではグローバル変数でした 今までそんなこと全く知らずに使ってました^^; 勉強になりました
155 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:32:39 ] スコープっていうか静的か動的かの話じゃないかな コンパイル時なら0で初期化とかやっても遅くならないし
156 名前:152 mailto:sage [2008/11/02(日) 18:36:12 ] >>153 確かにそうみたい。なんか勘違いしてた
157 名前:デフォルトの名無しさん [2008/11/02(日) 18:40:33 ] テキストファイルから1行ずつ読み込んで、 それをスペースを間に入れて表示したいです。 例えばテキストファイルの中身が a b だったら「a b」という感じに表示したいのですが、 以下のコーディングで正しいでしょうか? 環境はWindowsXP、VisualC++2008 ExpressEditionです。 char buf[1024]; FILE *fp = fopen("test.txt", "r"); while(fgets(buf, sizeof(buf), fp) != NULL){ buf[strlen(buf)-1] = '\0'; printf("%s ", buf); }
158 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:49:43 ] >>157 だいたいそれでいいんじゃないの? 一行が1024文字以上だったらどうするとか、細かいことは考えないで。
159 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:56:06 ] >>158 大丈夫そうですか? あ、でもこれだとテキストファイルの最後に空白行 入れないと駄目っぽいですね。
160 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:09:00 ] 聞く前に試せよ
161 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:24:35 ] 俺に聞けスレで試せで終わらすなんて。
162 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:33:25 ] 何故ダメなのか聞くためのスレだろ
163 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:35:35 ] >>159 fgetc()とfputc()で、一文字単位でしょりして、\nだったら空白に置き換えるってほうが、 簡単なんじゃね?
164 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:36:01 ] できることできるだけやってから質問するのは当たり前だろ
165 名前:デフォルトの名無しさん [2008/11/02(日) 19:38:22 ] 一番ダメな考え方 「動くからこれでいい」 動くからと言って、CPUの演算処理を独占するようなコードはクソである。 だから動くからいいと言うものではない
166 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:38:39 ] >143です >>145-146 さん 皆さん指摘の通り、中途半端な回答になっていました。 >>115 さん kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7916.txt に修正版をうpしたので許してください
167 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:45:17 ] >>163 その方が簡単ですね。効率性も考えるとfgetsですかね?
168 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:50:27 ] >>167 たぶん、大差ないんじゃないの? 昔、setvbuf()ってので、バッファのサイズを増やしたら速度が向上してたけど、 Windowsの時代になってから、同じようなことをやってもあんまり変わらなかった。 OSレベルでのバッファリングされてるからだと思うけど。
169 名前:デフォルトの名無しさん [2008/11/02(日) 20:19:51 ] 仮に、CPUの処理速度が無限大あって ビットシフトなんか使っても速くならないとしても 常に最適化を忘れてはいけない コンパイラが最適化してくれるとしても 自分の手で最適なコードを書くことを忘れてはいけない これが出来ない奴はルータも携帯電話も作れない
170 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:21:34 ] 携帯やルータってCで出来てるの?
171 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:29:30 ] 基本は読みやすさ。 要件をみたせないときに、最適化。
172 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:32:53 ] Cではありません。スパゲッティーで出来てます。 。。。ごめん
173 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:35:12 ] またド忘れしちゃった。。 左シフト演算って、常に論理シフトするんだっけ。 signed でも unsigned でも正値でも負値でも。 右シフト演算がちょっとめんどくさいことになってることは 覚えてるんだけど。
174 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:37:28 ] なぜコードを最適化するのですか?
175 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:40:24 ] めんどくさいものは使わない。
176 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:48:13 ] 組み込みは未だに、CとASMで出来ている
177 名前:デフォルトの名無しさん [2008/11/02(日) 20:59:00 ] >>172 ざる蕎麦ではできていないのか
178 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:59:47 ] >>173 #include <stdio.h> #include <limits.h> #define UPPER_BIT (1 << (sizeof(int) * CHAR_BIT - 1)) void print_bit_s(int n){ unsigned int mask = UPPER_BIT; for(;mask; mask >>=1) putchar(mask & n ? '1' : '0'); putchar('\n'); } void print_bit_u(unsigned int n){ unsigned int mask = UPPER_BIT; for(;mask; mask >>=1) putchar(mask & n ? '1' : '0'); putchar('\n'); } int main(){ int n1 = (-1); int n2 = n1 & ~UPPER_BIT; unsigned int m1 = n1; unsigned int m2 = n2; print_bit_s(n1 >> 1); print_bit_u(m1 >> 1); print_bit_s(n2 << 1); print_bit_u(m2 << 1); return 0; } // output 11111111111111111111111111111111 01111111111111111111111111111111 11111111111111111111111111111110 11111111111111111111111111111110
179 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 21:25:30 ] >>174 そこにコードがあるから
180 名前:173 mailto:sage [2008/11/02(日) 21:44:14 ] んー、たとえば右シフト演算について言えば、符号付き整数型の負値に対して演算を 適用した結果は処理系に依存しますよね。output の1行目でいうと、算術シフトするか 論理シフトするかは処理系に依存すると。。 上の2行は 01111111111111111111111111111111 01111111111111111111111111111111 こうなる可能性があるわけですよね。下の2行に関しては同様に処理系依存の問題は 大丈夫なのでしょうか。コードを解読し切れてないので結論が良く見えないのですが。
181 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 21:50:37 ] >>173 っMSDN と思ったけど、検索しても見つけにくかったので、ローカルから。 Shift Operators: >> and << (ごめん、英語なんだ) とりあえず適当訳。 左シフトは0埋め。論理シフト。 右シフトはunsignedは0埋め。signedは符号ビットで埋める。 unsignedは論理シフト。signedは算術シフト。 ・Microsoft Specific signed の負の数の右シフトは、実装によります。 MicrosoftのC++の場合は、MSBで空いたビットを埋めます。 MSのC++以外の場合は知らん。 だそうです。
182 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 21:53:03 ] なんでこういう細かいところ統一しないの?
183 名前:173 mailto:sage [2008/11/02(日) 22:12:18 ] わざわざ和訳までしてもらってすいません。Cの規格的な部分ではどうなんでしょうね。。 Microsoft仕様ではCとC++とでまた違うんですか。こちらでももうちっとしらべてみます。 あふん。。
184 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 22:20:14 ] >>182 なんでOSは統一しないの?なんで通貨も、言語も。 所詮、こんなものは、規格化した集団が幅広い用途を考慮して 決めるか、一部の団体の意見の押し付けでしかないってことだよ。 そして俺らはそれを使うだけ。開発、発案、研究するわけでもない・・・ まぁ、俺はとある有名大学で研究、実験はしたがな。
185 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 22:28:45 ] >>182 効率を重視するから
186 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 22:32:34 ] >>183 MSの場合Cでも>>181 と同じ。 そこに書いてある「MSのC++以外」とは、MS以外のC++という意味。 規格上は、負の値の左シフトは未定義。 正の数なら符号付き・符号無しいずれの型でも0埋めで定義されている。 CはJIS X3010、C++はJIS X 3014が国際規格の翻訳として存在する。 www.jisc.go.jp/
187 名前:173 mailto:sage [2008/11/02(日) 22:57:15 ] おお!そのものズバリのご回答ありがとうございます。 負値の左シフトは未定義でしたか。 正値ならば符号付き・無しに関わらず論理シフトすると、こういうことですね。 ややこしいなあ。。 ともかくこれでスッキリしました。 ありがとうございました。
188 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:05:13 ] 左シフト?
189 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:06:46 ] 「右も左も分かりません」
190 名前:デフォルトの名無しさん [2008/11/02(日) 23:14:23 ] アホか
191 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:16:59 ] ↑うん、お前アホ。
192 名前:デフォルトの名無しさん [2008/11/02(日) 23:27:23 ] 肝心のシフト演算子について話せない奴はすっこんでろ
193 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:28:34 ] >>187 算術左シフトという言葉があったとしても、負の値のそれはやっぱり0埋めだよ。 論理左シフトと全く同じだから、わざわざ算術と言わないだけ。 算術右シフトが負値で1埋めするのは符号を維持するための結果であって、 1埋めするから算術というわけではない。
194 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:29:41 ] 自分の論理を自分に適用できない奴はすっこんでろ
195 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:49:20 ] そんなに符号のことが気になるなら、unsignedをしっかり指定しとけ、な?
196 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:53:00 ] >>177 ざる蕎麦ではだめです。 もり蕎麦に、のりを盛るところから始めなくては。 きしめんでも可。 たぶん、時期的に、そうめんはだめだと思う。 (って何の話だっけ
197 名前:187 mailto:sage [2008/11/02(日) 23:55:37 ] 言葉の定義って難しいですね。。ややこしくて頭がパンクしそうです。 単純に 0埋め=論理シフト、1埋め=算術シフトと覚えてました。 算術(右シフト)だから符号を維持する必要がある→結果として1埋めになる 論理(右シフト)だから符号を維持する必要がない→結果として0埋めになる こういうことなのかな。考えたことも無かった。
198 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:00:01 ] そんなに心配なら shl, sal, shr, sar を直に使えよ
199 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:04:35 ] 算術シフトは 左にnビットシフトすると,元の数の2^n 倍 右にnビットシフトすると,元の数の1/2^n倍 これを保障するシフト演算。だから算術という。
200 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:10:33 ] RCL、RCR、ROL、RORとか混ぜると、さらにパンク。
201 名前:187 mailto:sage [2008/11/03(月) 00:20:29 ] なんで知らなかったんだろう今まで。。恥ずかしい。 算術って言うのは単に符号を維持するっていうことじゃなくて、そういうことなのね。。 それを保証するために符号の維持も当然必要で、その結果1埋めになる(右シフトの 場合)ということかな。
202 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:49:20 ] >>184 多様性のもつ可能性を吟味しなければなりません。
203 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 13:53:42 ] scanfで入力してもらった数字、例えば1234を合計した数字を変数に入れる方法を教えて下さい。(入門者にも理解できる範囲でお願いします)
204 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 13:59:03 ] 数字は1 2 3 4とバラバラに入力するのかそれとも連続で1234と入れるのか?
205 名前:203 mailto:sage [2008/11/03(月) 14:02:37 ] 連続で入力するほうでお願いします。
206 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:06:53 ] 文字列で受け取って、一文字づつバラして、数値に変換して、全部足す
207 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:16:20 ] >205 まず、%d指定子を使って1234という数字をまるごとあるint変数(仮にt)に読み込む 次に、合計を得る変数(仮にs)をゼロに初期化する そして、以後tが0より大きい間、tを10で割った余り(%演算子を使うこと)をsに加算してからtを10で割るということを繰り返す ※Cでは、正の整数の割り算は端数を切り捨てる 流れ: s:0 t:1234(読み込み) s:4 t:123(1234を10で割った余り4をsに足しtを123に) s:7 t:12(123を10で割った余り3をsに足しtを12に) s:9 t:1(12を10で割った余り2をsに足しtを1に) s:10 t:0(1を10で割った余り1をsに足しtを0に) (tが0になったので終了)
208 名前:デフォルトの名無しさん [2008/11/03(月) 14:21:45 ] int a; scanf("%d", &a); printf("%dの合計を暗算して入力してください"); scanf("%d", &a); printf("はい、ご名算!");
209 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:50:08 ] 宿題は宿題スレへ じゃないのか?
210 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:04:53 ] そういうのって、getchar() ループの方が楽じゃね? #include <stdio.h> void main( void ) { int loop = TRUE; int sum = 0; char c; while ( loop ) { c = (char)getchar(); // 1文字入力 switch ( c ) { case '0': // 0〜9が入力された場合、sumに足しこむ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': sum += (int)( c - '0' ); break; case EOF: loop = FALSE; break; } printf( "合計値は %d \nです。", sum ); } }
211 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:08:52 ] '0'-'9'は連続が保障されてるから、そんなことしなくても
212 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:22:36 ] int c, sum = 0; while (isdigit(c = getchar())) sum += c - '0'; printf("%d\n", sum); これだけでいいじゃん
213 名前:>212 mailto:sage [2008/11/03(月) 15:25:30 ] 0〜9以外を無視していないから却下
214 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:27:06 ] え?
215 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:29:13 ] 123x4 と入力したら 10 が返ってくる仕様が求められてるのか?
216 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:30:18 ] >>209 丸投げでなければわからないことを聞くのは一向にかまわない >>210-212 scanfでって言ってるのにgetcharはないだろ
217 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:41:17 ] こういうので、質問者にscanf()が必須条件なのか、それ以外でもいいのかって質問してもめったに返事が返ってこないよな。
218 名前:210 mailto:sage [2008/11/03(月) 15:43:37 ] >>216 こういうのはふつうキーイベントループ制御だべよー。 WindowsのようなGUIでもテキストボックスに「1234」なんて連続して入力させるかぁ?
219 名前:203 mailto:sage [2008/11/03(月) 15:49:26 ] みなさん、お答えいただきありがとうございます。 アドバイスを受け、色々と試してはいるのですが、一向にうまくいきません。 ここで質問なんですが、1234を char str[5]; scanf("%s",str); で文字列として受け取って atoi(str)で整数値に変換 その後に1234を一文字ずつにバラす方法がさっぱりわかりません アドバイスお願いします。
220 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:52:30 ] >>219 4 = 1234 % 10; 123 = 1234 / 10;
221 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:07:33 ] 文字列入力ってテーマを見ると、すぐにgetchar()で一文字ずつ判断するロジック書く奴っているよね。 そういう奴に限ってろくでもないバグを仕込むから笑えない。
222 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:09:19 ] 例えば、>212はまぁ無難な方で、>210なんてわざわざバグを埋め込むための無駄な努力の跡さえ見えてしまう事実。
223 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:23:58 ] >>221 本番では2バイト文字に気を付ければいいだけだろ >>222 レビューでデバッグしてくれ
224 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:35:49 ] 標準入力から0xffを入力すると、EOFと誤解釈して終了してしまうね。 この程度のサンプルならどうでもいいけど、ファイルをリダイレクトして使うようなツールだと恐怖だね。
225 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:42:38 ] >219 ソースはれ あと、ほかに制約がないのなら、%sからatoi()なんかしないで素直に%dで読みなさい
226 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:00:30 ] >>224 それ、0xffイコールEOFだから誤解釈じゃないよ。それも正常系の解釈と処理。 まあサンプルプログラムだし、EOFは入力の終了条件のために設けた だけだから、そこは削除して他の方法に置き換えても構わないし。
227 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:06:47 ] 違います EOFは決して0xffではありません
228 名前:203 mailto:sage [2008/11/03(月) 17:07:34 ] #include<stdio.h> int main() { int w,x,y,z,goukei; int w2,x2,y2,z2,goukei2; int yosou[4]; int yosou2; printf("前回の当選数字を入力:\n"); scanf("%d,%d,%d,%d",&w,&x,&y,&z); goukei = w + x + y + z; printf("前々回の当選数字を入力:\n"); scanf("%d,%d,%d,%d",&w2,&x2,&y2,&z2); goukei2 = w2 + x2 + y2 + z2; printf("今回予想した数字を入力:\n"); scanf("%d,%d,%d,%d",&yosou[0],&yosou[1],&yosou[2],&yosou[3]); yosou2 = yosou[0] + yosou[1] + yosou[2] + yosou[3]; if(goukei == yosou2 || goukei2 == yosou2){ printf("%d Is a NG\n",yosou2); }else if(yosou2 > 9 || yosou2 < 27){ printf("%d NG",yosou2); }else{ printf("%d OK\n",yosou2); } return 0; } ナンバー4の当たり数字過去2回の合計値と一致した場合、NGと出力するプログラムです。 また、予想した数字の合計値が9〜27に入ってなくてもNGと出力します。 ほんとくだらなくてすいません。
229 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:13:14 ] >>226 いや、大誤解だと思いますね。>>224 ではなくて、>>>226 が。 >>210 は getchar() の戻り値を char でうけているのが、センスがないというか、そもそも本質を理解していない、というべきか。 もしかして、いつものあなたですか?これはつり?
230 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:17:14 ] いつものあなたって・・ お前は誰と戦ってるんだ
231 名前:デフォルトの名無しさん [2008/11/03(月) 17:22:56 ] 非科学的=厨はマ板にまではびこっている
232 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:25:19 ] 糖質かこいつ
233 名前:デフォルトの名無しさん [2008/11/03(月) 17:33:18 ] どいつ?
234 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:34:13 ] 229
235 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:34:35 ] >>228 scanfを使うことは必須条件? あと入力するのは「1234」なのか「1,2,3,4」なのか 前者だったら>>207 でできないかな 後者だったらsscanfとかを調べてみるといいかも
236 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:51:07 ] >>227 ですよね。というか、標準入力からの入力値が、つうつうで getchar() ≒ fgetc() の返り値になるわけではないのですが。 >>230-234 やっぱりIDをつけたほうがいいのでしょうかね。
237 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 18:04:03 ] >>228 "%d,%d,%d,%d"と書いたら、それは1,2,3,4と入力させることを意味する 1234と入力するのなら>>207 のようにすること
238 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 18:21:31 ] fgetsじゃなくてgetsでいいよ どうせ両関数の仕様すら理解していないんだろ
239 名前:203 mailto:sage [2008/11/03(月) 18:26:55 ] スレ汚しすいませんでした。 >>207 の方法で1から作り直します。 皆さんご回答本当にありがとうございます。
240 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 19:38:12 ] kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7932.txt 画面内の球をクリックすると初速度v0で鉛直投げ上げするプログラムです 空中にある状態の球をクリックするとまたその位置から投げ上げされて 球をクリックするたびにどんどん球が上がるようにしたいんですが、 空中の球をクリックしても何も起こしません。 ボールが跳んでるときに、最初にボールがあった場所をクリックするとおかしなことに。
241 名前:デフォルトの名無しさん [2008/11/03(月) 19:43:31 ] あっそう
242 名前:240 mailto:sage [2008/11/03(月) 20:22:33 ] どこが間違ってますかね?
243 名前:受付番号001 mailto:sage [2008/11/03(月) 20:25:58 ] >>242 いま診てやるから待ってろ
244 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:34:54 ] たぶんここだな if(bally+ball >= 500){ KillTimer(hWnd,ID_MYTIMER); bTimer = FALSE; mytime = 0; }
245 名前:質問 [2008/11/03(月) 20:55:23 ] ファイルの直ぐ下に任意のファイルの内容を そのままコピー、連結できる関数ありますか?お願いしますm(__)m
246 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:58:55 ] >>245 ないです。
247 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 21:00:06 ] 自分でアペンドモードで開いてコピーしる
248 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 21:00:38 ] 下はどっちだ?
249 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 21:02:24 ] >>245 C/C++の宿題を片付けます 117代目 pc11.2ch.net/test/read.cgi/tech/1225320579/
250 名前:245 [2008/11/03(月) 21:02:52 ] ということはファイルの内容を読み込んで fopenのaで逐一書き込んでいくのが最良の方法ですね?
251 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 21:03:23 ] system
252 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 21:06:56 ] 読み込みながらの方が良いだろう。 char buf[4096]; f = fopen(path, "r"); g = fopen(paht, "a"); while (c = fread(buf, 1, sizeof buf, f)) fwrite(buf, 1, c, g)
253 名前:245 mailto:sage [2008/11/03(月) 21:12:33 ] ありがとうございましたm(__)m
254 名前:240 mailto:sage [2008/11/03(月) 21:18:46 ] >>244 問題ないような気が・・?すみません分からないです
255 名前:受付番号001 mailto:sage [2008/11/03(月) 22:24:32 ] >>254 診ましたよ〜。 えーと、これはですね、、、もう手遅れです。 (←うそ) 問題点はボールのY座標の扱いですね。 WndProc内の変数ballyで保持しているY座標と WM_TIMERメッセージ内で一時的に計算しているY座標とが一致していません。 ballyはウィンドウメッセージを受けるたびに480に初期化されていますので、上に飛んでいる ボールをクリックしても反応しなく、地面をクリックすると反応してしまうのです。 ballyはWM_CREATメッセージ内だけで初期化しましょう。 また、WM_TIMERメッセージ内では常に地面からの座標計算でボールの高さを計算して しまっているので、上手くボールにヒットしたらballyの位置から計算しなおす様に変更する 必要があります。
256 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 22:25:18 ] >>245 COPYやcatで連結は駄目なの?
257 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 22:35:13 ] ソースを読むって言うのはさ 自分とソースを一体化させる作業なんだ 「俺は今どうなっているのか」と考えながら読むんだ 無意識にみんなやってると思うぜ 他の何かがどうなってるかではない、自分がどうなってるか
258 名前:質問 [2008/11/03(月) 23:27:00 ] 下記の違いを教えていただけますでしょうか? return exit あ、あと EXIT_FAILUER ってなんですか?
259 名前:デフォルトの名無しさん [2008/11/03(月) 23:28:00 ] FAILUARE
260 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:28:50 ] こういう人にはgoogleの使い方を教えたほうが親切なんでしょうか?
261 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:29:38 ] return は予約語 exit はライブラリ関数 EXIT_FAILURE はマクロ定数 です。
262 名前:デフォルトの名無しさん [2008/11/03(月) 23:40:04 ] return は関数から抜ける exit はプロセスから抜ける EXIT_FAILUER は書いた者に聞け(煽り口調で)
263 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:41:28 ] EXIT_FAILURE はマクロ定数の意味が分りません
264 名前:240 mailto:sage [2008/11/03(月) 23:44:28 ] >>255 うまくいきました! 大変わかりやすい説明ありがとうございます!
265 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:51:02 ] >>257 空気を読むって言うのはさ 自分と空気を一体化させる作業なんだ 「俺は今どうなっているのか」と考えながら読むんだ 無意識にみんなやってると思うぜ 他の何かがどうなってるかではない、自分がどうなってるか しかし、鏡を見ると、場に合わない容姿・・・
266 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:02:17 ] int main (void){ int i; int vx[5]; for(i=0;i<5;i++){ printf("vx[%d]:",i); scanf("%d", &vx[i]); } putchar('\n'); for(i=0;i<5;i++){ printf("vx[%d]=%d\n",i,vx[i]); } return (0); } 上記の配列の要素を読み込んで表示のプログラムを実行したところ 1 2 3 4 5 vx[0]:vx[1]:vx[2]:vx[3]:vx[4]: vx[0]=1 vx[1]=2 vx[2]=3 vx[3]=4 vx[4]=5 と変な形になってしまい、試行錯誤したところどうやら実行の際に ファイル名 | more としていたのが原因のようでした。 moreはその前に書いてたプログラムの際に利用していてそのままでした。 moreは単に一画面ずつ表示するようにするだけなのになぜこのようなことが起きたのでしょうか?
267 名前:受付番号001 mailto:sage [2008/11/04(火) 00:06:58 ] >>264 乙! 面白いトレーニングプログラムだねw わしもSetTimer、KillTimer、WM_TIMERメッセージは、テトリスを作ってみた時に使ったよ。 同じように素のWindows SDKとC言語だけでね。 >>265 大人になれば空気なんて読まなくなる。いや読む必要がなくなるのだ。 その代わり、盤面の様子や流れ、相手のニーズや考えを読むように変化する。
268 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:30:14 ] 自分がmainになるんだよ mainになって、forなどで値の計算や操作をやっていると考えると どこがおかしいのか分かりやすい 元々俺がアセンブラ屋だったから 自分に置き換えて「イメージ」する癖がついた っていうか、みんなイメージしてると思うが!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
269 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:35:49 ] >>266 printf() の後に fflush(stdout); をおいてみるとどうなりますか?fflush(NULL); ではどうなりますか?
270 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:36:28 ] >>268 新しい芸ですか?
271 名前:デフォルトの名無しさん [2008/11/04(火) 00:36:54 ] みなさん、Cのソースを組むとき、分かりやすく汎用的に組む為に、具体的にどういうことに気を付けてますか? たとえば、、、 僕の場合なんですが、 ・一行は80文字。 ・strcpyよりmemcpy ・独自関数ライブラリのプロトタイプは必ず書く。 ・関数の引数が多くなりすぎる時は構造対で渡す。 ・関数名はキャメル式に統一。 ・入れこは3つ以上にしない。 ・繰り返し文は使い分ける。 ・構造化プログラミング。mainは目次みたいな感じで、全体が把握でくるような作りに。 ・C言語についてのコメントは書かない。 ・インクルードヘッダはは使用するものだけ書く。(まとめたりしない) まだあると思うけど、とりあえずこれくらいかな〜 みんなのも教えてください。
272 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:39:26 ] >>271 > ・strcpyよりmemcpy 状況にもよりますが、これは賛同しかねます。
273 名前:デフォルトの名無しさん [2008/11/04(火) 00:45:27 ] >>272 あ、すいません。 そうですね。\0つけたい時ありますもんね。 strcpy→strncpyに訂正します。
274 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:50:17 ] >>271 入れ子2つだけじゃ厳しいなぁ
275 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:52:42 ] memcpy()でコピーしてるのに、コピーの長さをstrlen()で取ってるコードをこのまえ見たな。 strcpy()でいいじゃんって思うけど。
276 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:53:10 ] >>271 >一行は80文字。 まあほとんどないことですが、意味の上で 80文字を超えるようであれば、それはそれでこだわりません。 >プロトタイプは必ず書く 前方参照をほとんど行わないので、特に必要性を感じません。 >入れこは3つ以上にしない。 それはそうなんですが、まあ、ええ、ときどき、しばしばやってしまいます。 >キャメル式 初耳です。よろしければ意味を教えてください。
277 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:56:34 ] >・一行は80文字。 これは無い
278 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:57:33 ] >>276 ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%A1%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9
279 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:59:40 ] >>277 そういうスタイルの人もいるよ。 Cだと80くらいでも十分書けるし。
280 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:04:14 ] いや居るのは知ってるよ
281 名前:デフォルトの名無しさん [2008/11/04(火) 01:06:24 ] >>276 動的独自ライブラリから独自関数を使う場合、引数間違っててもコンパイルが通る。んで、実行時にコア吐いて初めて気付く事がある。プロトタイプ書いてると、コンパイルエラーでるから、書くようにしてる。好みかな。 キャメル式は、確か、ラクダみたいな意味だったかな。大文字と小文字だけでつけるやつ。こういうの。 FileCopy() 区切り方の違いかな。変数はアンダーバー使うし、マクロは大文字とか。
282 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:06:58 ] ああそう。
283 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:08:54 ] うん
284 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:08:55 ] >>281 下位のサブルーチンから書いていって、main()を最後に書くってスタイルの人なんじゃないの?
285 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:09:11 ] コーディング規約のスレがあったような ここでもいいんですよ、はい
286 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:10:53 ] >>281 ん、了解。たしかに分割コンパイルですすめるときは .h にプロトタイプをまとめる、というのは日常的にしますね。読みが浅かったです。 >>278 >>281 キャメル式+ハンガリアンでかいてみることもあります。気分しだいですが。
287 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:16:37 ] >>284 昔はそういう人も居たし俺もそうだった。技巧賞ノミネート作品のように。 でもある時から改めた。
288 名前:デフォルトの名無しさん [2008/11/04(火) 01:18:18 ] >>275 は>>273 を読んでないのか
289 名前:デフォルトの名無しさん [2008/11/04(火) 01:20:25 ] >>287 技巧賞とあるんだ ぐぐるわ
290 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:25:01 ] >>288 別に責めてるわけじゃないから、気にしなくていいよ。
291 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:25:48 ] >>287 技巧賞っていうか、Pascalの影響も多分にあると思う。
292 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:28:07 ] >>286 ハンガリアン記法はダメだろ
293 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:30:20 ] >>287 さしつかえなければ、かえた理由を教えてください。 たしかに私も厳密な意味で下から上にかいているわけではなく、コンパイルOKれべるですので、技巧賞はむりですね。
294 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:32:58 ] >>292 私のはいわゆる「アプリケーションハンガリアン」ってやつですね。MicroSoft 流 pszXXX とかいうのは私も嫌いで、これはやらないです。 そもそも全部の変数をハンガリアンにするわけではありません。 節操がないといえば、それまでですが。
295 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:36:38 ] しかしアプリケーションハンガリアンって、あんまり使う機会がないっていうか。 システムハンガリアンはダメだって言われてるけど、Cのときは、ポインタはpをつけてる。
296 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:41:43 ] >>269 どちらでも実行結果は変わりませんでした。
297 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:52:53 ] >>296 more の内容をください。more にも fflush(NULL) をいれるとどうなりますか?
298 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:58:06 ] fflush(stdout); を入れるのは一つ目のprintfですよね? C:\081103>1 |more fflush(NULL) ファイル C:\081103\fflush(NULL) にアクセスできません 1 2 3 4 5 となりました。
299 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 02:10:06 ] >>298 いえいえ、more も自作しているのかな、と思って、 fflush() で more のバッファリングも殺してしまおうと思ったわけで、 コマンドラインで fflush を指定するつもりはありませんでした。 more が標準出力をバッファリングしており、自作のプログラムの出力をその都度画面に出力していないのでは?と思いますが、いかがでしょう。
300 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 02:14:20 ] ごめんなさい、何言ってるか分かりません・・・ 自分の不勉強のようなので出直してきます。
301 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 02:19:23 ] >>300 いえいえ、そんなつもりはないです。 バッファリングについてかいておきますね。 printf() で出力した時点で、それが画面にそのままでるわけではなくて、いったん別のところにたくわえられており、 ある程度たまった時点で画面に出力される、という仕組みになっているのが普通です。 たとえば、これは画面ではなくてディスクなんですが、printf()などで一文字ずつ書き込む、なんてディスクがカリカリいって (ハードウェアの操作には時間がかかることは直感的に感じていただけるものと思います。)なんだか非効率だと思いませんか? なにかわからないことがあれば遠慮なくきいていただいていいと思いますよ。レスポンスがあるかどうかは運まかせかもしれませんが。
302 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 03:00:02 ] strncpyは仕様が腐ってるので使うのやめとき。
303 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 03:08:05 ] どう腐ってるの?
304 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 03:09:44 ] 終端文字列の扱いのこといってんだろう多分
305 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 09:28:37 ] strncpy()を使うくらいなら、spritf()を使いこなすか、いっそ自前で管理した方がいい希ガス。
306 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 13:08:21 ] つ strncat()
307 名前:デフォルトの名無しさん [2008/11/04(火) 16:12:50 ] spritf
308 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 16:32:53 ] >305s/spritf/sprintf/
309 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:24:34 ] int i,j,k,count; printf("何段?"); scanf("%d",&count); for(i = 1;i <= count;i++){ for(j = 1;j <= count-i;j++){ putchar(' '); } for(k = 1;k <= i;k++);{ printf("*"); } putchar('\n'); } 上記のプログラムで右下が直角の三角形が表示されるつもりなのですが 何段?5 ----* ---* --* -* * となってしまいました(半角スペースを-としました)。kがうまくいってないような気がするのですが、ご指摘お願いします。
310 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:35:29 ] >for(k = 1;k <= i;k++);{ この行に注目。
311 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:44:17 ] >>310 printf("* %d",k);にしたところ ----*2 ---* 3 --* 4 -* 5 * 6 となりました・・・なぜ毎回k=1にならないんだ。
312 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:45:47 ] >>311 >310 他は見なくていい。
313 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:47:45 ] >>312 注目したのですがとくにおかしくないような・・・ i回の繰り返し文のはずです。
314 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:53:12 ] やっと気付きました。 for(k = 1;k <= i;k++);←ここですね{ くだらない質問で失礼致しました。ご指摘ありがとうございました。
315 名前:デフォルトの名無しさん [2008/11/05(水) 01:32:51 ] int k,i,j,n; printf("何段?"); scanf("%d",&n); for(k=0;k<=n;k++){ for(i=0;i<(n-k);i++){ printf(" "); } for(j=0;j<k;j++){ printf("*"); } printf("\n"); } 布団入ってから作ったから動くかどうかわからん。
316 名前:デフォルトの名無しさん [2008/11/05(水) 01:42:04 ] do{ if(){ break; } if(){ break; } }while(0) 時々みるこれどうなのよ?テクッてて見易いとかいうやつは程がしれてるな
317 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 01:53:25 ] >>316 while (1) {if()break; if() break;} とか for(;;) {if () break; if () break; } はよくみます。lint にひっかからないように for(;;) {} を使う、ていう意見も。 ループの脱出条件が2つ以上ある、というのであれば、これらのやり方もありだと思います。
318 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:18:01 ] >>317 論点がずれてる
319 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:22:47 ] 大文字と小文字を区別しないコンパイラはありませんか?
320 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:24:46 ] そこまで大胆に規格を逸脱した実装は見たことないな。 せいぜいDOS/Windowsでヘッダ名が大文字でも行けるくらいしか知らない。
321 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:39:26 ] >316 どうなのよってお前の感想どおりだ
322 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 03:13:09 ] >>316 別にテクッてるとは思わないがいいんじゃないの
323 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 08:06:33 ] >>316 その書き方は嫌いだが goto 禁止なら仕方ないな
324 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 10:25:39 ] int main(){ (略) printf("test\n"); 関数(Dname); } void 関数(char *fname){ printf("2\n"); } というプログラムがあったときに、testが表示されて 2が表示されずにセグメンテーションエラーでるのはどこに原因があると考えられますか?
325 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 10:27:13 ] 略されたところに魔物が棲んでいると考えられます
326 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 10:58:22 ] 324ですけど解決しました 関数の中の定義した配列のサイズがおおきすぎたためでした。
327 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:33:44 ] >>316 美しくないとは思ってたんだがそれに近い書き方だ 0じゃなくて条件1個だけど どう書くべきなの? 条件をいっぱい書くとして抜けるタイミングが異なる場合はどうしたらいい?
328 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:37:59 ] >>316 初心者なのでよくわからないのですが これはif ・・・・・ else if ・・・ じゃだめなんですか?
329 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:39:58 ] >>328 それで組んでもさほど代わらないと思うよ。 むしろネストが増えるし
330 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:04:32 ] qsortでIPアドレスをキーにソートしたいんですが、うまくいきません。 IPアドレスとchar型の文字列を要素に持つ構造体のソートをしたいのですが 比較関数内にprintfを置いてみると、どうやら比較関数を数回参照しただけで デバッガが立ち上がってしまいます。 IPアドレスはCSVから読み込んでいますが、5MB程度のCSVなら問題なく読み込み、ソートまでできます。 全く同じフォーマットの150MBのCSVからIPアドレスを全て読み込んでソートしようとするとデバッガが立ち上がります。 比較関数内の数箇所にprintfを置いてみたところ、比較関数の先頭と最後のprintfはセットで表示されるので、 比較関数内ではデバッガは出ていません。 どうやら割り当てされていないメモリ領域を参照しているみたいなんですけど、qsortをする際に変な領域を参照することとかあるのでしょうか。
331 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:08:08 ] ・複数プラットフォームで運用するものでない ・仮に複数プラットフォームがあるとしても、ウチは個別にソースを用意する ・社風なのか、ソースの流用は好まない なのに、「typedefで調べろよ!んったく何やってんだよもー」 とかグチグチ言い出す不満の塊 お前ストレス解消するために会社来てんのか
332 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:55:18 ] >>330 デバッガってのはデバッグするためのツールなんだけどね・・・ まぁたぶんスタックが足りないんだろう。どーんと増やしてみては?
333 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:05:48 ] >>327 ループ条件が存在するならループで書いたって問題ないだろ
334 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:34:11 ] while(条件式) if(){ continue; } if(){ } } 1個目のifでcontinueした場合2個目のifはとばされて、whileの頭にもどりますよね?
335 名前:デフォルトの名無しさん [2008/11/05(水) 14:46:20 ] やってみれ
336 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:47:34 ] なんでその程度の規模のプログラムで聞くかね・・・ さくっとサンプル作って、どういう動きするか テストしてみればいいじゃん。
337 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:02:59 ] それがゆとり
338 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:18:58 ] 何度も言うけど、Cは動作の詳細を網羅しない言語だから「やってみろ」はダメ i=i++とか、やってみてその結果が正しいと思い込んだらどうすんの? こういうのに素直に答える気がないなら「教科書読み直せ」でいいんだよ >>334 そうだよ
339 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:22:50 ] どうもしねーよゆとり
340 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:25:46 ] >>338 ここで散々論争になってきたようなところは はまったときに聞けばいいんだよ。 どうせはまるところはそういうところって大体結論でてるんだし。
341 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:21:34 ] >>340 いつどこでそんな結論が出たの? むしろ最初から正しい知識を与えないからそういうところではまるんじゃないの 問題にしているのは「やってみて確かめる」という姿勢はトラブルの種を抱えているということで 後になってトラブルが起きてから解決できるかどうかではない
342 名前:デフォルトの名無しさん [2008/11/05(水) 17:57:50 ] >>341 それを言うなら、動作保証の有無を 2ch で聞く姿勢にこそ問題があるだろう 正しい知識だ? そもそもそんなのを与える義理がない者をつかまえて何を説くやら
343 名前:デフォルトの名無しさん [2008/11/05(水) 18:57:39 ] 質問です。 プログラムの練習で数のべき乗を計算するプログラムをCで作ってみたのですが、ちゃんと計算してくれません。 出来れば、どこが間違っているか教えていただけないでしょうか? コードは下記のとおりです。 #include <stdio.h> double multi(double x,int y); int main(void){ double a,b,mul; printf("数字aを入力してください\n"); scanf("%d",&a); printf("aを何乗するか入力してください\n"); scanf("%d",&b); mul = multi(a,b); printf("%d",mul); return 0; } double multi(double x,int y) { int i; double mu; for(i=1;i<=y;i=i+1) { mu*=x ; } return mu; }
344 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:01:12 ] >>343 scanf("%d",&a); → scanf("%lf",&a); scanf("%d",&b); → scanf("%lf",&b); printf("%d",mul); → printf("%f",mul); double mu; → double mu=1;
345 名前:343 [2008/11/05(水) 19:10:21 ] >>344 ありがとうございました。 桶下で、ちゃんと動作するようになりました。
346 名前:343 mailto:sage [2008/11/05(水) 19:11:26 ] 桶下→おかげ です。 失礼しました・・・・・
347 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:41:50 ] %fより%gを使おう。
348 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:45:36 ] なんかちがうんでげすか?
349 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:55:55 ] if ( (a=Func()) == 8 ) aにFuncの返り値を代入しつつ比較ってできる?
350 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:58:11 ] できる
351 名前:デフォルトの名無しさん [2008/11/05(水) 20:00:22 ] >>349 やってみてうまくいかないのか?
352 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:19:04 ] 入門以前に、環境について質問なのですが、Microsoft Visual C++.net ExpressとBCC5.5では、どちらが使い易いですか?
353 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:26:03 ] どう考えても前者
354 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:29:21 ] IDEとコンパイラ単体では比較にすらならん
355 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:29:30 ] >>351 うまくいったが、その動作が保証されてるかどうかを気にしてるんじゃないの?
356 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:43:12 ] >>342 なぜ問題が? ネットの情報の信用性云々言い出すならそもそもこんなスレの存在意義自体がない あと正しい知識を与えろと言ってるのではない 答えたくないなら「やってみろ」ではなく「教科書読め」と返せと言ってるだけ
357 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:47:50 ] どう答えるかはその人の勝手で、お前がグダグダ言おうとかわらんけどな。 まあ、好きなだけ言っててくれw
358 名前:デフォルトの名無しさん [2008/11/05(水) 20:52:58 ] >>355 推測なんざ聞きたかねえ すっこんでろ >>356 教科書じゃねえ、保証者(メーカなり規格なり)が発行する資料で確認することだろうが だいたい回答者サマがそんなこともわかってないような 2ch で聞くことに問題がないとでも言うのか
359 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:00:47 ] >>358 教科書を文字通りに取られたか そこはそういったものに読み替えてくれればいいよ で、2chで質問することを問題視する君はなんでこのスレにいるわけ? 帰れば?むしろ帰ってくれない?邪魔だから
360 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:02:18 ] いつものageのバカじゃないか 相手しても無駄っていうかお前も邪魔だからやめろ
361 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:07:35 ] 要するにこのスレを潰したいから荒らしてるんだろ?
362 名前:デフォルトの名無しさん [2008/11/05(水) 21:12:26 ] >>359 いーや、おまえは教科書と言った それからあんたには邪魔かも知れないが 俺はスレタイどおり参加しているだけで荒らしているわけでもない(スレは荒れているかも知れないがな) 難癖つけられる筋合いはないので勝手にするぜ おまえこそ正義があるなら運営にでも訴えてはどうだ、あ?
363 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:16:37 ] printf("%d %d %d", ++i, ++i, ++i);
364 名前:355 mailto:sage [2008/11/05(水) 21:53:55 ] >>358 すっこまねえよ。 要はお前が規格に沿った回答、または引用をすることができないから、 2chで質問することに意味がないと思いこんでるだけだろ? お前が「やってみた?どうだった?」とかアホ面ひっさげたレスをしなければ 規格に沿った回答の密度があがるんだよ。 すっこんでろ。
365 名前:デフォルトの名無しさん [2008/11/05(水) 22:04:15 ] >>364 >>351 をどう読めばそうなるのかは知らんし興味もないが 推測なんざ聞きたかねえ、と言ったはずだ だからその部分に対しては答えない すっこまねえのは確かにあんたの勝手だが それはこちらにも言えることだ 同じ言葉を返しさえすれば痛烈だとでも思っていて自己矛盾に気づかないなら小学生なみだぜ
366 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:05:21 ] >>365 だからすっけんどろっての
367 名前:デフォルトの名無しさん [2008/11/05(水) 22:08:21 ] >>366 うっせえ ぼけ
368 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:18:24 ] まだすっこんでないよな? Cの教科書っていったらK&Rで異論ないと思うんだが、 それで何の問題があるんだ?
369 名前:デフォルトの名無しさん [2008/11/05(水) 22:23:38 ] >>368 甘いんだよ、後出し設定なんか聞いてやらん
370 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:40:38 ] >>369 お前教科書って聞いて何思い浮かべたの?
371 名前:368 mailto:sage [2008/11/05(水) 22:42:33 ] 後出しも何も俺>>356 じゃねえよ? 寒くなってきたんだから布団にすっこんでぽかぽかになっとけよ
372 名前:デフォルトの名無しさん [2008/11/05(水) 22:45:49 ] で、別人のふりくらいしかすることなくなったわけか
373 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:48:16 ] このスレには極端にレベルの低い小学生が二人いるのかな
374 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:49:49 ] よそでやれ
375 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:58:36 ] 次の方どうぞ〜♪
376 名前:デフォルトの名無しさん [2008/11/05(水) 23:53:51 ] >>316 それ好きな人が身近にいる。else ifだとデコボコになるからこれが好きとのこだ。 そいつは、構造対のメンバ名が長い時も、最初にそのメンバのアドレスを短くて意味のわかるポインタに移す。 最初は何でいちいちそんな事すんだよとか思ってたが、正直、そいつのソースは読みやすい。 好みだな
377 名前:デフォルトの名無しさん [2008/11/05(水) 23:59:17 ] 確かに、構造体ん中に構造体ある時とか、長くなるね。
378 名前:デフォルトの名無しさん [2008/11/05(水) 23:59:33 ] 複数ソースファイルがあるとき ソースファイルその絡みがあるじゃないですか 例えばその値がどこから来たかを見つけたいとき どうやればいいのですか。 1.c から 10000000000000.c くらいまであるとして そのうちの23460001.cにある関数から 5986293.cに渡されたとしたら わからないじゃ ないですか 5986293.cのincludeには782365.cと23435.cしかない というように、「渡りに渡って行き着いた」やつは非常に見つけにくい。
379 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:01:30 ] >>378 それは設計が悪くないか?
380 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:01:38 ] __FILE__
381 名前:デフォルトの名無しさん [2008/11/06(木) 00:01:42 ] ゲームに限らず、携帯電話やATMなど 「仕事」のソースは例外なく大量のファイルに分かれているのに 「この値はどこから来たのか」 「それをはじき出すものはどこにあるのか」 っていうコメントがないことがほとんどです!!!!!!!!!!!!!!!!!!!!!!!!!!
382 名前:デフォルトの名無しさん [2008/11/06(木) 00:04:02 ] >>378 Java見たら泣くよ
383 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:04:39 ] 今時デバッガ使えば、その時点でどの関数がどの関数を呼び出しているかなんてすぐ分かる。 それとは別に、プログラムを実行させなくても静的に解析するツールだってちらほら存在する。
384 名前:デフォルトの名無しさん [2008/11/06(木) 00:06:47 ] 研修期間中に読んだものの中で最長の渡りが 30ファイル先 まず先に値を出す1.c -> それを利用する2.c -> 2.cで出た値を利用する3.c ................................................. 30.cだけ見ると、「この値はどこから来たの」ってことしか分からず、 includeを見て追っていくと何十も何百も元のファイルから来てたとわかるのみです。 しかもそのincludeも、標準ライブラリ除いて20くらいincludeされていることもザラで それら全部調べるとなるとたいへんな時間がかかります!!!!!!!!!!! 今仕事でバリバリやってる人らはどうやって調べているの と
385 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:07:21 ] >>378 1.関数呼び出しの構造図を書く func_a func_b func_c func_d 2.データフローを書く func_a - x ->func_b
386 名前:デフォルトの名無しさん [2008/11/06(木) 00:08:38 ] 関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ・・・・ きつい時あるね
387 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:09:43 ] >>386 でも昔のDOSのころのようなミニマムな開発じゃなければ そういうのはざらでしょ。
388 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:10:14 ] 保守って点から見りゃ、およそ最悪だろ。
389 名前:デフォルトの名無しさん [2008/11/06(木) 00:14:51 ] >>386 みたいなのをどうしても調べにゃならん時に、たどり着いたソースが新規1985年だったのがある。俺産まれた年(笑) 昔の人は英語好きだよね〜JISに対応してなかったのかね〜
390 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:18:22 ] >>389 時代的にはこんな感じだよ。 マシンによるんじゃないかな? www.eonet.ne.jp/~building-pc/pc/pc1985.htm
391 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:22:45 ] とりあえずincludeで追いかけるってのはありえない ライブラリならドキュメントがあるはずだし ソースがあるならgrepかければ済む
392 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:32:05 ] for(;;) { int d = 0; (dを用いた適当な処理) } と int d; for(;;) { d = 0; (dを用いた適当な処理) } を比べると上のほうがオーバヘッドが大きいでしょうか? dはfor文内でしか利用しませんのでスコープを限定したいのですが.
393 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:32:14 ] 以前、関数から参照する外部変数や値の影響についてなどを関数仕様書に書いた。 すると技術の若造が「そういう事は止めてくれ。」と言われた。 「どうして?」の問いに、「そんな事を書いたら分かっちゃうだろ。」の回答。 C言語好きでNE○の系列会社に入社する奴はヲタクなお山の大将が多かった。
394 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:34:30 ] >>393 ドキュメントとソースの乖離が発生することを懸念して、じゃなくて、分かっちゃうからってところがwww
395 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:35:35 ] >>393 日本語でおk
396 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:38:36 ] >>392 { int d; for(;;) { d = 0; (dを用いた適当な処理) } } とかは? これってgccしかできなかったっけ? >>393-394 意味がわからねえw
397 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:40:28 ] メーカー製の場合、見えてはいけないものが多い。 特に地上デジタル放送関連は、結局はドライバで制御している以上、 「バレるとB-CASなしでも見られてコピーし放題」って芸当も出来るようになる。
398 名前:デフォルトの名無しさん [2008/11/06(木) 00:50:07 ] コメントなしね〜HTMLならしかたないとこあるけどね〜
399 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:52:21 ] >>397 外に見せる?資料と内部では違うだろ・・ 内部のものまで「書かない」が徹底されてるのか?
400 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:56:22 ] >396 VC6なんで出来るけどステートメントが深くなるからあんまりやりたくないです. それよりfor文の中に入れたときに何度もdが宣言されるけどそのときのオーバヘッドが気になります.
401 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:57:17 ] >>393 ソフトさんですか。
402 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:59:12 ] オーバーヘッド気になるなら実測なりアセンブリ見るなりすればいいだろ。
403 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:59:44 ] for(ここにおけば?;;) vc6だとグローバルスコープだったような気がするけど でもそれはc++だったような期もするけど
404 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:03:51 ] >>400 宣言文は実行ステートメントではないから、 実行時のオーバヘッドにはならないだろ。
405 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:06:48 ] ____ .ni 7 /ノ ヽ\ 内部にも見せないよ l^l | | l ,/) / /゚ヽ /゚ヾ\ .n 以前、それで営業がポカやらかしたし ', U ! レ' / / ⌒ ⌒ \ l^l.| | /) 絶対に流出させられないから / 〈 | (____人__) | | U レ'//) ヽ\ |lr┬-l| / ノ / /´ ̄ ̄ノ ゙=ニ二" \rニ | `ヽ l
406 名前:デフォルトの名無しさん [2008/11/06(木) 01:41:40 ] B-CAS廃止されたんじゃなかったか?
407 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:48:54 ] まだよ
408 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:51:04 ] >>401 妙に納得した。 >>392 そのケースなら、コンパイラはどちらも同じようにコンパイルしてしまう。 スコープを限定してくれた方が読むにも判り易いからどんどん限定してくれたまえ。 # それこそ某N∈Sみたいな所の仕事だと全て関数の先頭で宣言しろとか言われかねないけど。
409 名前:393 mailto:sage [2008/11/06(木) 02:10:15 ] >>397 そういうカッコいい理由ならまだいいんだがw NE○の通信系には変な田舎者の高専や専卒出身の奴が多いのは確かだよ。 カモフラージュ気取りのアメージングコード、騙しの#includeなどは当たり前。 例えば、ANSIの定数をコソーリとトリッキーなビットシフトで何重にも再定義してたりで デバッガで動かすと、EOFが5に見えたりするんだが、奴らはその自分達の技術に対する 他人の反応を見て楽しんでたんだよ。(家で人知れず独りでオナニーしてろってwww) >>401 昔はT芝相手で設計部門向けのCADなどのソフトもやってましたよ。その他にも監査に 似た評価・検証系もしてたので、よく使うコンパイラ数本のC標準ライブラリのヘッダやソースまで ほぼ暗記してました。
410 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 09:12:19 ] >>352 遅レスだけど、エラーの指摘はTURBO C1.0対MS-C3.0の頃からborlandの方が出来が良い。 使いやすさじゃ勝負にならないけど、学習用途なら色々動かして、気に入った物を使うといいよ。
411 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 09:12:56 ] 悪いがマ板でやってくれ
412 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:14:28 ] >>378 やっぱ一回実行して呼び出しスタック覗くのが一番早い気が。 gdbにもあったはずなんで、大抵の環境で可能だと思う。
413 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 17:19:50 ] fnameに/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data とかはいってたとして、次のファイル操作 printf("%s",fname); if((fp = fopen(fname, "rb")) == NULL ) { fprintf(stderr,"ERR;入力ファイル error;read_inputfile\n"); exit(EXIT_FAILURE); } これをかいて実行すると開けないってエラーがでるんですけども。なぜだと 考えられますか?ちなみに、emacsから/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data だと開けます。開けるからわからないんですけど。ファイルネームにラストに改行はいってるみたいで。 ただそれでエラーがくるのかと。3.dataはバイナリのデータです。
414 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 17:26:44 ] 改行入ってたら、実際のファイルの名前にも改行入ってないと開けないぞ
415 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:13:23 ] >ただそれでエラーがくるのかと ファイルを指す文字列をどう解決するかは当然OSに依存する あいにく君の使っている環境は、末尾の\nを排除してファイルを探すことができなかった それだけのことであって、そもそもCの話ではない
416 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:14:42 ] C言語を志すならばやはりK&Rは買わないとダメでしょうか?
417 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:17:30 ] 別になくても困りはしないよ
418 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:19:39 ] もちろんあったほうがいいけど必須ではないよ CFAQを読んだ上で、規格合致ギリギリのラインを攻め込んだりしない限り問題ないと俺は思う
419 名前:デフォルトの名無しさん [2008/11/06(木) 18:20:37 ] >>416 K&R自体は買わなくても他に手はいくらでもあるが たかが3千円弱の自己投資をためらうようならお先真っ暗だ
420 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:22:34 ] 買ったけど内容は入門書と変わらない 正直要らないよ
421 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:24:44 ] K&Rってのは、C言語をマスターしている人間が買う入門書。 マスターしてるなら買うわけないじゃん、と思うだろうが まさにその通り。 あの本は、読んでる人間はC言語を完全にマスターしてること前提で書いている。 辞書で言うならこんな感じだな レバレッジ 株用語のひとつ。 リスクヘッジ リスクをヘッジすること。 ってな
422 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:56:30 ] >>416 優れた医者は毒を薬とするという例えがあるようにその本を毒とするか薬とするかは自分次第 他人の評価を聞いて悩むより本屋でちょっと覗いてみて興味を持ったら買うのが一番 図書館で借りたって良いんだしさ 百聞は一見に如かずだよ
423 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:50:09 ] >>416 そうそう、積読の価値はあると思います。いつか、ふとしたときに手にとって、おもわず読みふけってしまう、ということがあると思います。
424 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:41:57 ] >>421 そんなことはない。 Prefaceに書いてあるとおり、他の言語は知ってるけど、C言語は 知らないって人向け Cの文法は知ってるけど、書き方を知らないような人にも向いてると思う
425 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:44:04 ] でも本に書いてあるものは全部よい書き方だと思っちゃうようなひとには向いていない
426 名前:デフォルトの名無しさん [2008/11/06(木) 22:04:00 ] 「よい書き方」について論じている本ではないことくらいわかれ・・・・無理なのか?
427 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:00:10 ] 趣味でプログラムを覚えようと思うのですが、最初はC言語でいいんですよね? おすすめの入門書、サイトがありましたら教えて下さい。
428 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:04:30 ] >>427 いきなりCだなんて。えっち。 それはともかく、おすすめしない。
429 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:12:41 ] time_t tp; time(&tp); sprintf(buf,sizeof(buf),"%Y%m%d",localtime(&tp)); ↑こんな感じのを sprintf(buf,sizeof(buf),"%Y%m%d",localtime(time(&tp)); ↑こんな感じで一行で書きたいんだけど。 もちろん、この書き方が駄目なのは分かるんだけど。 関数の戻り値のアドレスを渡したいんだよねー
430 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:13:07 ] はじめてのC
431 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:14:31 ] >>429 上のもダメですが
432 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:16:55 ] >>429 なんでこだわるの?
433 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:18:29 ] つーか、それstrftime()の間違いだろ。
434 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:51:25 ] >>427 C言語に興味があるのならC言語にすればよい。 入門書は、本屋に置いてあるのでいいと思うよ。 例えば、ポニョのとかLepton先生のとかカニハンのおっちゃんのとか。 ああ、でも『はじめての~』は買わない方がいいと思う。 厨房のとき読んでコードギアスの2ndOPになった。 あまり評価高くないけど、河西本とかもオヌヌメ。もう記述が古いけど厨房でも理解できた。 ウェブサイトは、使わない方がいいよ。コピー&ペーストで終わらせようとする衝動に負けるだろうから。 手で打って覚えるんだよ。目でコードの美しさに感動するんだよ。体でプログラミングの楽しさを感じるんだよ。 本気でC言語を使って思い通りにプログラミングできるようになりたければ、 他人の評価は気にせずに自分の直観を信じて本を読んでいった方がいいよ。 そのレビューをした人と自分の言語理解度が必ずしも同じであるわけではないのだから。 1冊読んでいい気になるなよ、そこの自称中級者。 うわっキモ。米大統領選:オバマ氏、共和党地盤・インディアナ州奪取 まで読んだ。
435 名前:デフォルトの名無しさん [2008/11/07(金) 00:15:14 ] 猫Cのこのページ ttp://www.kumei.ne.jp/c_lang/intro/no_13.htm のPGMをコーディングして実行したんだけど 結果が 「time1=1225984391 time2=0」となってしまう。 printf ("time2=%ld\n",t2) と単独で出力すればちゃんと「time2=1225984392」になる。 何が間違ってるんでしょうか
436 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:16:03 ] 実行環境はMicrosoft Visual C++ 2008 Express Editionの Win32 コンソールアプリケーションです
437 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:35:33 ] TCP/IPのソケットを使って互いに通信するプログラムを作りたいのですが、正直さっぱりわかりません どこか詳しい説明とサンプルプログラムがあるサイトはないでしょうか?
438 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:38:07 ] ほれ x68000.q-e-d.net/~68user/net/
439 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 02:21:40 ] >>435 %ld に対応するのは long 型であって、time_t 型ではありません。 long 型と time_t 型のサイズが等しい環境では上手くいくかもしれませんが、 あらゆる環境で常にそれが成立するわけではありません。
440 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 02:57:52 ] ネコなんかで勉強しようなんてするから嵌まるんだ。 long(t1)とでもすれば"%ld"で出力されるだろ。
441 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:14:22 ] >>440 やってみたけどダメです。。。 じっさい、t1のほうは「%ld」でちゃんと出力されてるんですが。 ブレイクポイント設定して見てみるとちゃんと変数の中身は変わってます。 なのに「"\ntime1=%ld time2=%ld\n"」で標準出力するとtime2=0 になっちゃう
442 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:41:07 ] >>441 64bit環境? %ld のかわりに、%I64d でやるとどうなる?
443 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:54:50 ] って環境は>>436 か time_tは typedef __int64 __time64_t; /* 64-bit time value */ typedef __time64_t time_t; /* time value */ だから64bit整数だな。%I64dか%lldで。
444 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:57:58 ] つーか、longが64bitじゃないんだから、>>440 でいいはずだな。 >>441 はなにをやってみたんだ? printf("\ntime1=%ld time2=%ld\n", long(t1), long(t2));だぞ?
445 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:07:02 ] >>444 その通りやってみたんですがダメですね・・・ printf ("time2=%ld\n",t2) だと正常に出力されるので%ldの型指定に問題があるとは思えないのです。 なんで0が出力されるのか、全く見当が付きません・・・
446 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:12:17 ] 本についてるプログラム(C言語を習得する類の本ではありません)で ただのint型変数にファイルから100000という値を読み込んでる ものがあったんですが、一般的に見てこのコードは正しいんでしょうか?
447 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:13:42 ] >>446 どのあたりが疑問なんだ?
448 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:21:58 ] >>447 int型で表せる値の範囲についてです。 環境によるかもしれませんが 参考書には-32767〜32767と載っていたもので
449 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:23:22 ] >>445 えーとだな、まず64ビット整数はたとえば0x0000000012345678 という数値なわけだ。 これをスタックに積んで、32ビットで取り出すと、0x12345678 と 0x00000000の2つの数字がとれるわけ。 なんで2番目が0になるかわかったろ?
450 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:17 ] >>445 >printf ("time2=%ld\n",t2) この場合も、0x0000000012345678を積んで、0x12345678だけ取り出したから たまたまうまくいってるように見えるだけで、上位32ビットは切り捨てられている。
451 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:44 ] >>448 それは少し古い時代のint型だな 今は大抵4バイトなんで-2147483648 to 2147483647 を表せることが多い
452 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:45 ] intが16ビットなんて8ビットパソコンの時代じゃないか(80年代) 参考書が古すぎ
453 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:35:38 ] >>451 そうですか、分かりました。 どうもありがとうございます。
454 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:52:02 ] >>449-450 ありがとうございます。上手くいきました。 t1-long(t2) ってやってました。>>445 を読むまで理屈が判りませんでした。 VC6とかだと上手くいってたのかな?サンプルコードも油断ならないですね
455 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:56:54 ] × >>445 を読むまで理屈が判りませんでした。 ○ >>449 を読むまで理屈が判りませんでした。 安価間違えたorz
456 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:00:00 ] >>454 long(t1)は、time_t型のt1の値を、long型にキャストすると言うことだ。 t1 - long(t2)では、time_t型のt1からlong型にキャストされたt2の値を引こうとしてしまうので、 time_t型の実態であるlong long型にキャストして引き算を行なってしまうので結果はlong long型のまま。 引き算する場合はlong(t1 - t2)としなくては意味がない。 そもそもtime_t型は実態が32ビット整数だった時代が長いから無理もないとは思うが、 32ビット整数である保証がないのでちゃんとキャストするべき。それをしていないサンプルは、当てにならないと言うこと。 尚、time_t型同士の引き算は本来なら、difftime()を使うべき。
457 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:09:00 ] >>456 結局のところ、printf("%g\n", difftime(t1, t2))ってことね。 # だからといって、printf("%g\n", difftime(t1, 0))する奴ぁいねぇと思うが。
458 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:34:56 ] 対角要素に0があっても正しく動く逆行列を求めるソースおちてないですかね?
459 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 12:48:52 ] 同じx86-64bitでも、Windows系の64と、Unix/BSD/Linux系の64アーキテクチャの違いも・・・
460 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:07:30 ] >>427 自分もプログラミング入門者なんだが、苦しんで覚えるC言語ってサイトがわかりやすいと思う お互い頑張りましょう。
461 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:13:02 ] >>446 コードそのものは正しい 16bit環境には対応していないというだけ
462 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:23:20 ] >>460 俺も昔、苦しんで覚えたなw 血便、下血、終電、睡眠デバッグ・・・
463 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:32:19 ] >>460 「苦しんで覚えるC言語」リンク先のsetjump/longjump >プログラムの流れをグチャグチャにする凶悪な関数であり、よほどの事情でもない限り使用してはいけない。 ワラタ 後に例外処理 try 〜 chatch に衣替えして支持を得る、元祖例外処理サポート関数のデビュー作なのに、 誰も正しい使い方を広められず、gotoと併せて鵜呑み受け売りで語り継がれて忌み嫌われたんだよね。
464 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:39:18 ] longjumpが悪だとは決して思わないけれど 忌み嫌われる程度には危険で使いにくいと思う
465 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:41:11 ] 海の怖さを知って初めて一人前の猟師 そういうことさ
466 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:44:09 ] コードの海は俺の海
467 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:51:00 ] そして怖い膿を知った
468 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:57:00 ] まあデストラクタが呼ばれないから実際使えなかったわな。
469 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:26:41 ] 「今は大抵○バイト」 一番ダメな考え方 こうやって決め打ちすると、そこから変わった場合に一切対処できずに泣いて誰かに助けを頼むことになる 「ママが○バイトだって言ってたから○バイトじゃなきゃダメなんだあああウワアアアアン!」
470 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:30:46 ] 分かったからお前が解説してやってくれ
471 名前:デフォルトの名無しさん [2008/11/07(金) 18:47:01 ] >>468 おまえC使いのくせにスタックの巻き戻し程度のものが自分で実装できんのか?
472 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:17:37 ] 関数にn次の2次元配列を渡す場合はどう書けばいいですか? double data[n][n]とかいう配列です
473 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:31:08 ] void func(double **data)
474 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:32:14 ] >>472 void hoge(double *pData) とか void hoge(double Data[n][n]) じゃだめ?
475 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:35:34 ] >>473 渡すときは func(data)ですか?
476 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:38:37 ] ああ間違えた。>>473 が正しい。 ポインタじゃなくて実体そのものをコピーしていいなら俺のでもいい・・・はず・・・ pc11.2ch.net/test/read.cgi/tech/1225320579/ の379の質問か。
477 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:40:15 ] >>475 そう >>476 間違っています 勉強しなおしましょう
478 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:40:44 ] >>476 >>475 +>>473 だとコンパイルがとおらないんです
479 名前:デフォルトの名無しさん [2008/11/07(金) 19:43:19 ] >>473 であるべき、と強硬に言い張る奴が昔いた 一生懸命 malloc してたw
480 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:44:01 ] >>473 は大嘘 普通は func(double data[][n])
481 名前:476 mailto:sage [2008/11/07(金) 19:45:25 ] >>477 あ、下のほうって意味だったんですが、VC++で動くけど問題なんでしょうか? 以下のソースで動きました。 void test(int data[2][2]) { printf("%d\n", data[0][0]); printf("%d\n", data[0][1]); printf("%d\n", data[1][0]); printf("%d\n", data[1][1]); } int main(int argc, char *argv[]) { int data[2][2] = {0,1,2,3}; test(data); return(0); }
482 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:48:29 ] void test(int data[][2]) { printf("%d\n", data[0][0]); printf("%d\n", data[0][1]); printf("%d\n", data[1][0]); printf("%d\n", data[1][1]); } int main(int argc, char *argv[]) { int data[2][2] = {0,1,2,3}; test(data); return(0); } これでいい
483 名前:476 [2008/11/07(金) 19:50:57 ] >>482 関数で一次限の配列の要素数を書かない理由はポインタ渡しにしたいからですか? それとも別の理由?
484 名前:デフォルトの名無しさん [2008/11/07(金) 19:50:58 ] K&R で書くなら ANSI 混ぜるなよ
485 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:56:33 ] >>472 関数に配列を渡すことはできない。渡されるのは常に配列の戦闘要素へのポインタである。 double data[X][Y] という配列があるとき、data は double の配列の配列であり、 これを関数呼び出しの引数に書くと、それは double の配列へのポインタに変換される。 実際に関数にわたるのはこのポインタで、その型は double (*)[Y] である。 だから関数の仮引数の宣言は以下のようになる。 int func(double (*data)[Y]) …@ ただし、これは次のように書いてもいい。 int func(double data[X][Y]) …A int func(double data[][Y]) …B Aは配列そのものを表しているが、既に述べたように関数が配列そのものを受け取ることはない。 そこで、関数の仮引数に配列が書かれたときには、配列がその先頭要素へのポインタに置き換わるのと同様に、 その配列要素へのポインタを宣言したのと同じに扱われることになっている。だからAの持つ意味は@と同じである。 ここでAがポインタに置き換わるとき、当然最初の添字Xは無視されることとなる。つまりBのように省略が可能である。
486 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:59:26 ] >>483 最初の添字が無意味だから したかろうがしたくなかろうが配列を引数に書いたら 絶 対 に ポインタ渡しになる
487 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:02:33 ] 配列を値渡ししようとしてもポインタの値渡しになるから 値そのものは渡せない
488 名前:476 [2008/11/07(金) 20:09:51 ] >>485-487 丁寧な説明ありがとうございます。 おかげでポインタの理解が深まりました。 人の質問に答えて見るもんですね。 同様に構造体の配列も要素数書いてもポインタになるのを始めて知りました。 試してみたらアドレス一緒でビックリ! でも、なんでdata[0]->data1じゃなくてdata[0].data1なんでしょうか? typedef struct{ int data1; int data2; }TEST_TABLE; void test(TEST_TABLE data[2]) { printf("%d\n", data[0].data1); printf("%d\n", data[0].data2); printf("%d\n", data[1].data1); printf("%d\n", data[1].data2); } int main(int argc, char *argv[]) { TEST_TABLE data[2] = {0,1,2,3}; test(data); return(0); }
489 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:23:24 ] まったく理解できてねぇwwwwwww
490 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:40:40 ] >>429 これでいいじゃない。 struct tm *v_localtime(time_t t) { return localtime(&t); } strftime(buf, sizeof buf, "%Y%m%d", v_localtime(time(0));
491 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:41:33 ] >>488 dataがポインタだから data[0]は構造体自体
492 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:42:27 ] >>488 []演算子に*の意味が入っているから。
493 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:03:43 ] 1 TEST_TABLE data[10]; TEST_TABLEを要素とする配列。 2 data[0] 先頭要素。 3 &data[0] 先頭要素のポインタ。 4 data だけ書いたら↑3と同じ。 5 TEST_TABLE *p = &data[0]; 配列先頭要素へのポインタで変数 p を初期化。 6 TEST_TABLE *p = data; ↑5 と同じ。 7 p->data1 ポインタを使って要素へアクセス。 8 data->data1 ↑6,7 から、これは 7 と等価。 9 data と p は等価だから、data[0] は p[0] と等価。 10 つまり *p は p[0]。 11 (*p).data1 *演算子はポインタから実体を返す。だから要素アクセスはドット。 12 (*data).data1 上と同じ。 13 data[0].data1 ↑2で書いたように要素なのでアクセスはドット。 14 data[1] 二番目の要素。 15 &data[1] 二番目の要素のポインタ 16 以下 data[0] と同じ。 17 data[2] 三番目の要素。 18 以下↑と同じ。 19 p = dataのとき、 data[1] は *(p + 1) と同じ。 20 つまり、&data[1] は p + 1 21 data[1] は data[0] の後ろにくっついてるわけだから 22 &data[1] と &data[0] の間のアドレス距離は data[0] の大きさ分ある。 23 つまり、 p+1 と p では data[0] の大きさだけ移動してる。 24 等価等価言ってきたけど、 p++ はできて、data++ はできない。 25 以上とは関係なく、関数の仮引数では data[] は配列じゃなくポインタ。
494 名前:476 mailto:sage [2008/11/07(金) 21:11:52 ] >>491-493 またまた詳しい説明、ありがとうございました。 ポインタに関して理解していないところの多さを感じました。 まだまだ勉強不足ですね。 さて、名無しに戻って元々したかった質問をします。
495 名前:デフォルトの名無しさん [2008/11/07(金) 21:16:40 ] VC++でファイルからデータを読み込み分解するプログラムを作りたいです。 ファイルには hoge:aaa\r\n hage:bbb\r\n のように記述されていて、 hoge:に対する記述は hoge:aaa\r\n hoge:bbbb;012\r\n と";"の後にもデータが続いている場合があります。 aaaやbbbbの文字数は一定ではないです。 これを読み出すときに、 sscanf(bBuf,"hoge: %s",&data[HOGE][0]); としているのですが、";"以降がdataに入りません。 どうしたらいいでしょうか?
496 名前:デフォルトの名無しさん [2008/11/07(金) 21:33:13 ] >>493 > 3 &data[0] 先頭要素のポインタ。 > 4 data だけ書いたら↑3と同じ。 ダウト sizeof &data[0] != sizeof data
497 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:46:16 ] >>496 それは例外事項 data だけなら先頭要素のアドレスで正しい
498 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:49:47 ] ん?
499 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:52:25 ] 不毛だ
500 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:58:46 ] うるせーな 気にしてんだよ
501 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:18:19 ] data と p が等価で、 sizeof data が例外なのか。 p = data ができるのが例外なのか。