1 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:34:33 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 19 pc11.2ch.net/test/read.cgi/tech/1190342593/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 97代目 pc11.2ch.net/test/read.cgi/tech/1191937213/
2 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:35:19 ] Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/ Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/ Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/ Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/ Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/ Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/ Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/ Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/ Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/ Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/ Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/ Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/ Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/ Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1190331997/
3 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:37:06 ] >>1 乙 >>2 Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
4 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:48:13 ] 前スレのこれお願いします。 行数はいくつかの行数の違うファイルを取り入れるので 違いますが、列数は同じファイルです。Mとでもしましょうか 996 :デフォルトの名無しさん:2007/10/15(月) 21:50:49 ファイルから数値を読み取るとき、 その数値をに二次元配列にいれるとして そこの二次元配列の最初の領域確保はどうするべきですか? できるだけ領域を使わないとすると。
5 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:55:37 ] >>4 ファイルのサンプルうp!
6 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:57:13 ] 適当に100行分くらい確保しといてもいいんじゃない 最後にreallocで縮小すれば
7 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:58:48 ] >>4 その数値は整数?小数? それととりうる値の範囲がわかればどの型を使えばいいか決まる あとファイルの先頭に列数や行数が書かれていれば領域確保が楽になるけどそういうのは無いんだよね?
8 名前:4 mailto:sage [2007/10/15(月) 23:08:18 ] 0: -20.903 -0.245 -0.851 5.156 8.659 12.120 1.665 -2.565 0.404 -2.526 0.322 -0.025 -0.120 0.521 0.237 0.490 -0.202 -2.928 -4.003 1.254 0.634 -1.119 1.177 0.601 -0.482 -0.007 1: -18.858 1.046 -1.616 4.023 1.857 4.207 6.451 0.989 -3.807 0.744 2.020 -0.532 -0.124 0.566 0.415 0.174 -0.942 -3.092 -3.921 0.331 0.705 0.091 0.528 -0.378 -0.225 -0.009 2: -19.319 0.295 1.983 4.715 -2.581 -3.939 5.541 -1.169 -3.084 1.723 2.476 -2.182 -0.151 0.387 0.489 0.140 -0.311 -1.611 -3.145 -2.083 -0.260 0.625 -0.204 -0.429 0.494 -0.009 こういうファイルを取り入れて 小数点だけ取り入れる。「1:」とか「2:」とかが行の番号にしてるつもり 1行ごとに26個の数値がある。 ちなみにこのファイルは横に広げれば26個小数点の数値が並んでます
9 名前:4 mailto:sage [2007/10/15(月) 23:09:27 ] でこの行数が違うファイルをどんどん取り入れるというわけです。 26というのは変わりません
10 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 23:10:41 ] floatでいいな
11 名前:4 mailto:sage [2007/10/15(月) 23:15:29 ] floatは使いません。 正直floatは使う価値なしだと思います
12 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 23:16:42 ] なんだ釣りか
13 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 23:20:48 ] >>11 float の有効桁数を知っているの? できるだけ領域を使わないんじゃないの?
14 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 23:20:56 ] じゃあ文字列として読み込むんだろうな
15 名前:4 mailto:sage [2007/10/15(月) 23:21:57 ] 大体110〜140くらいのファイルばかりだから150くらいでいいか とも思うんですけど。 一般的に>>8 みたいな数値多いファイルは どのように取り込むのがいんでしょうか?
16 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 23:26:55 ] >>11 ほう 理由言ってみ?
17 名前:4 mailto:sage [2007/10/15(月) 23:29:21 ] 自分で計算するのは対数でだけど 検算するときには少数で計算するんだがその時に floatでは表せなくなるから
18 名前:4 mailto:sage [2007/10/15(月) 23:33:30 ] あと計算はdoubleのほうが早いと聞いたから
19 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 23:35:20 ] m9(^Д^)プギャー
20 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 23:39:07 ] doubleの方が速いとか何時の時代ですか
21 名前:4 mailto:sage [2007/10/15(月) 23:44:03 ] どっちにしろfloatじゃ検算不可能だから使わない
22 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 23:46:06 ] 浮動小数点数で検算とな?
23 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 23:51:23 ] 検算できる。 計算途中や計算結果を入れる変数までfloatを使えとは言って無いだろうが。 それはdoubleでやればいい。 今問題になってるのはファイルから読み込んだ値を保持する方法だろ。
24 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 00:04:09 ] 新スレ開始早々こんなアホが来るとは
25 名前:4 mailto:sage [2007/10/16(火) 00:04:22 ] そうですね。 まーfloatを使ってあるアルゴリズムの処理をしてて その計算をfloatじゃ表示できなくなるのでdoubleで計算してたんすよ。 あとでその計算はlogでやるんだと聞かされて。 検算のためにdouble、logで処理するから処理はfloatで行えるように 変更してみます。
26 名前:4 mailto:sage [2007/10/16(火) 00:06:50 ] で聞きたいのは>>20 どっちが速いの? ぐぐったら大体doubleのほうが速いし正確だと書いてある。 どっちが信用できるんですか?
27 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 00:08:15 ] ベンチマークの基本は実測
28 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 00:12:07 ] できるだけ精度が欲しいって場合は、double型を、 できるだけ計算速度が欲しいって場合は、float型を取り扱う float型を使う理由は、ズバリいってメモリの節約です。 また、メモリ転送量が少なくすむので、データ量が膨大なときは高速になることもあります。 と書いてある
29 名前:デフォルトの名無しさん [2007/10/16(火) 00:13:50 ] doubleのほうが速いし正確 floatの計算はdoubleに変換される 計算後元に戻すから鈍い 利点は半分のメモリで住む
30 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 00:17:39 ] >>29 そんなの鵜呑みにせず実測しろ したのなら環境とソースコードを晒せ
31 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 00:18:42 ] つまりアーキテクチャに依存するわけですよ
32 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 00:19:49 ] >>31 が全て ということで自分の環境で測れ>>4
33 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 00:25:05 ] 今ならながらほとんどをlogで処理するのにdoubleで計算ってどうなんだって思った。 ただ扱うファイルが非常に多いからfloatでいいかなー。 あるファイルを入力 2500個のファイルで検査、その出力結果が一番高いものが 入力のファイルと一致するかを見る。 それを3000回だよ。 ちなみに2500個のファイルの中身にまたファイル名が書かれてて その中身のファイルの数値を取り入れるんだけどね。
34 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 00:27:45 ] floatの方がSSEの最適化が効く
35 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 00:36:12 ] 最近makeを見飽きてきた。 make,make,make,make
36 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 00:40:28 ] 一瞬化粧の濃い人を思い浮かべてしまった
37 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 00:50:31 ] C言語の浮動小数点はライブラリの関数がすべてdoubleで かかれているという罠があるのは有名な話だな…… Cのfloatは遅いという話の出所。 もう昔の話だったか……
38 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:06:31 ] Cには暗黙の昇格ルールというものがあってだな。float=float+floatはfloadt=(float)((double)float+(double)float)なのよ。 C++ではルールが違うけれども。
39 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:08:06 ] かなりの初心者で悪いが、質問させてくれ 最近C言語をやりはじめたんだが、gccを入力するとバッチファイルとして認識されてないって出るんだ 環境変数もいじってみたがよくわからない 教えてくださいエロい人
40 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:13:22 ] OSは?「gccを入力すると」を具体的に。
41 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:14:40 ] ファイルが多くなってくると分割コンパイルちょっと時間かかるよね。 あれがちょっといや。 コンパイルされたのはわかったけどダラダラと書きやがってと。 エラーでるときはcc -c file.cとかと一緒にでるし。
42 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:15:24 ] 察するにWindows環境? 環境変数PATHを直せば良いんじゃないか?
43 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:17:45 ] ググレカス
44 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:22:06 ] これか? ttp://ja.uncyclopedia.info/wiki/%E3%82%B0%E3%82%B0%E3%83%AC%E3%82%AB%E3%82%B9
45 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:23:05 ] >>40 詳しいこと書かなくてごめん OSはWindowsXP gccはそのままだよ。コマンドプロンプト開いて、gccでファイル実行しようとすると “gcc”は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。ってでる そんでググってみて環境変数のpathに含まれてないからってでたからちょこちょこ環境変数いじってみたけど駄目だった 説明下手くそですまん
46 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:26:17 ] シグインでいいじゃん
47 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:26:46 ] >>45 ちょこちょこじゃなくてしっかりいじってこい そうしてhelloworldくらい実行できるようになってからこのスレにこい
48 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:29:57 ] いじるのめんどいんだったら 10GB削ってLINUXいれたら すぐ使えます
49 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:34:58 ] >>47 そうだよな…ありがとう でもググッてみてもいじり方がよくわからないんだ 何十回も変更してみたけど駄目だった もうちょっと頑張ってみる >>48 ありがとう それも試してみる
50 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:36:58 ] どうみても48が一番時間かかるとおもうけど
51 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:55:13 ] >>46 が真実
52 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 03:43:10 ] @rem gcc.bat @echo off del /F /Q %*
53 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 03:44:27 ] >>49 もしかしてUNIXバイナリをWindowsに持って来て動かそうとしてないか? Windowsネイティブでgcc動かすのは結構敷居が高いぞ? おとなしくCygwin使うか、Windows限定で良いならMSVC++2005Expressやbccのほうがラク。
54 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 11:06:11 ] >>29 >floatの計算はdoubleに変換される 計算後元に戻すから鈍い >>38 >Cには暗黙の昇格ルールというものがあってだな。float=float+floatはfloadt=(float)((double)float+(double)float)なのよ。 真っ赤な嘘乙。 整数型の場合と違って、実数型は(c89ですら)単精度同士の演算が認められている。 >>34 >floatの方がSSEの最適化が効く 常にそうではないが、可能性が高いとはいえるね。 >37 >C言語の浮動小数点はライブラリの関数がすべてdoubleで >かかれているという罠があるのは有名な話だな…… C99にはmath.hの全ての関数にfloat版が用意されている。そのお蔭か、本来ない筈のC++でも使えることが多い。 >Cのfloatは遅いという話の出所。 いや、藤原の翁によると、あくまで関数は副次的としていて、実数演算がdoubleで実装されているのが理由だとしているようだ。
55 名前:デフォルトの名無しさん [2007/10/16(火) 12:10:15 ] セレロンだがfloatが速い #include<stdio.h> #include<time.h> #define N 50000000 floatloop(){ int i,c=clock();float r=1.0; for( i=0 ; i<N ; i++ ){r *= 2.5;r/=2.5;r+=1.001;r-=1.001;} c=clock()-c;printf( "float %dmsec value %f\n", c ,r);} doubleloop(){ int i,c=clock();double r=1.0; for( i=0 ; i<N ; i++ ){r *= 2.5;r/=2.5;r+=1.001;r-=1.001;} c=clock()-c;printf( "double %dmsec value %f\n", c, r);} main(){ floatloop();doubleloop();}
56 名前:デフォルトの名無しさん [2007/10/16(火) 12:16:41 ] math.hもfloatの方が速い #include<stdio.h> #include<time.h> #include<math.h> #define N 5000000 floatloop(){ int i,c=clock();float r=10.0; for( i=0 ; i<N ; i++ ){r=log(r);r=exp(r);r=pow(r,2);r=sqrt(r);} c=clock()-c;printf( "float %dmsec value %f\n", c ,r);} doubleloop(){ int i,c=clock();double r=10.0; for( i=0 ; i<N ; i++ ){r=log(r);r=exp(r);r=pow(r,2);r=sqrt(r);} c=clock()-c;printf( "double %dmsec value %f\n", c, r);} main(){ floatloop();doubleloop();}
57 名前:デフォルトの名無しさん [2007/10/16(火) 12:19:16 ] CPUでハードウェア的に計算可能なのはdoubleだときいた だからfloatは鈍いと 違うのか
58 名前:デフォルトの名無しさん [2007/10/16(火) 12:21:45 ] ハードウェアとして浮動小数点演算が組み込まれているはずだ すると今のCPUは、doubleもfloatも入っているのか?
59 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 12:42:15 ] >>55 素朴な疑問だが、最適化掛けるとループの中身が消えそうだがコンパイラとオプションは? # まぁ、floatが速いと言うことには同意だが。 >>56 うーん、こっちは辻褄が合わないなあ。コンパイラとオプションはどうなっている? # 関数を適切に呼び出しているなら、float ⇔ doubleの変換が頻繁に入るから遅くなる筈なんだ。 >>57 大丈夫、今時のCPUはfloatでも計算可能だ。 >>58 そそ、そういうこと。 実際、加減算、乗算は速度的にビット幅は余り影響しない。まして除算はビット幅が広いほど確実に遅くなる。
60 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:08:44 ] 一つ発見。>56をgccでコンパイルしたら、log()ではなくlogf()、exp()ではなくexpf()を呼び出していたよ。 それならそれで、floatの方が速いのも納得。尤も、初期のXeonでは有意差が得られなかったけれど。 # gcc(3.4.6)使用。オプションは -O3 -msse2 -lm、-msse2は事実上影響なかった。
61 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:04:37 ] C言語を勉強しようと思ってるんですけど、 普通のエディタじゃできないんですか? コンパイラがよく分からなくて何かできないんですけど。
62 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:08:19 ] >>61 コードを書くだけならどんなエディタでも構わないと言えば構わない。 コンパイラにVisualStudioのような統合環境を使うのなら、ビルトインのエディタを使うのが無難だと思う。 コンパイラにbccやlsicを使うのはよした方がいい。 コンパイラにgccを使うのならコマンドライン環境そのものの使い方にも慣れる必要がある。 まぁもっとも、一部の天才のように読むだけで勉強できるのならエディタもコンパイラも要らないわけだが。
63 名前:デフォルトの名無しさん [2007/10/16(火) 14:09:09 ] 普通のエディタでかける でも初心者は、BCC developerつかっとけ
64 名前:BCC Developer導入法 [2007/10/16(火) 14:15:01 ] BCC Developer導入法 www.codegear.com/jp/downloads/free/cppbuilder へ行って Borland C++Compiler / Turbo Debugger Windows 5.5 8.85 MB をクリックして、必要事項を記入してファイルを落とす 落としたら、メールで送られてきたパスワードを入力してインストールする デバッガをインストールするときのパスワードは ReadmeInstall.txt に書いてある つぎに BCC Developerをインストールする 下をダウンロードする www.vector.co.jp/soft/dl/win95/prog/se180695.html www.cmagazine.jp/download/setbcc15b.exe 解凍したフォルダをbccdevに名前を変更して、C:\borlandへ移動する 一方でsetbcc.exeを起動して、すすむを5回押して設定を押す その後、C:\borland\をbccdev\BccDev.exeを起動して コンパイラ C:\borland\bcc55\Bin\bcc32.exe デバッガ C:\borland\bcc55\Bin\TD32.EXE を入力して設定ボタンを押す ファイル→新規作成 を選んで、ディレクトリは、C:\borland\bccdev、プロジェクト名はtestとしokボタンを押す 再び、ファイル→新規作成 を選び、ファイル名のところへhello.cppを入力してokボタン #include<stdio.h> int main( ){ printf( "Hello world!\n" ); return 0;} をコピペして、プロジェクト→メイクしてMake End!!が出ればコンパイル成功 次に実行→実行してHello world!がDOS画面に出れば成功
65 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:26:23 ] 今MKEditorを使ってるんですけど、 これじゃできませんか?
66 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:27:24 ] それとBCC Developerって無料ですか?
67 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:29:28 ] >>66 >62は無視ですか?
68 名前:デフォルトの名無しさん [2007/10/16(火) 14:32:08 ] MKEditorで書けるが、コンパイルは自分でやる必要あり BCC Developerは無料で簡単
69 名前:デフォルトの名無しさん [2007/10/16(火) 14:34:09 ] BCC Developerなら、今ならの導入でわからないところを教えてやるよ
70 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:40:53 ] >>67 すみません、よく分からなくて。
71 名前:デフォルトの名無しさん [2007/10/16(火) 14:41:45 ] とりあえず >>64 をやってみ
72 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:42:33 ] どうしてもBCCDeveloperを勧めたい香具師がいるらしいから、一緒に地獄に落ちておけばいいと思うよ。
73 名前:デフォルトの名無しさん [2007/10/16(火) 14:46:26 ] じゃあどれか良くて、BCCDE
74 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:46:57 ] www.sgnet.co.jp/c/ このサイトの勉強をしたいんですけど。 できますか?
75 名前:デフォルトの名無しさん [2007/10/16(火) 14:46:59 ] じゃあどれか良くて、BCCDevloperのどこが悪い?
76 名前:デフォルトの名無しさん [2007/10/16(火) 14:49:16 ] >>74 BCC Developerでできるが、そのサイトは勉強にむいていない 質が良くない
77 名前:デフォルトの名無しさん [2007/10/16(火) 15:04:36 ] ここは初心者向きの勉強サイト ある程度わかったらSTLへ進むと良い hp.vector.co.jp/authors/VA001944/c-begin/text01.html effy.ldw.jp/c/index.html
78 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 15:08:28 ] >>74 できますか?って…自分の頭のことを他人に聞くなよw
79 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 15:12:38 ] まずはBCC Developerをダウンロードすればいいんですよね?
80 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 15:12:42 ] >>77 後者は兎も角、前者はLSI-C86を使っている時点でアナクロに過ぎると思う。
81 名前:デフォルトの名無しさん [2007/10/16(火) 15:13:29 ] >>79 >>64 の順序どおりにやってみて
82 名前:デフォルトの名無しさん [2007/10/16(火) 15:14:56 ] >>80 そこは見なかったことにすれば初心者向き
83 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 15:15:35 ] わかりました。 皆さんありがとうございます。
84 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 15:23:01 ] >74のサイトは他のスレでダメ出しされていた。 私も間違いを指摘するメールを出したが改めるどころか返事もなかった。
85 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 16:06:18 ] >>54 C++でもISO/IEC 14882:2003 (X3014:2003)では、 float版とlong double版がdouble版の関数名で多重定義されている。 ほげfとかほげlみたいな関数はないことになっているだろうけど。
86 名前:デフォルトの名無しさん [2007/10/16(火) 16:35:58 ] [1] 授業単元:プログラミング2(C言語) [2] 問題文(含コード&リンク):マージソート merge(data1,n1,data2,n2,data3)を使い,merge_sort(data1,n,data2)を作成せよ。 関数の再帰的定義(?)というものを使って作成するみたいです。注:nへはdata1の要素数(整数型)を代入する。 注:data2はdata1を整列した配列とする。 用意された整数値データ int data[20]={9,10,8,7,6,20,-4,8,9,11,5,15,-7,12,23,3,24,-11,30,6} [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:? 学校ではktermでcc [ファイル名]とやっています [3.3] 言語:C [4] 期限: ([200?年10月17日24:00まで] [5] その他の制限:merge()は自分で作りました。 #define N 10 void merge(int data1[], int n1, int data2[], int n2, int data3[]){ int index1, index2, index3, i; index1 = index2 = index3 = 0; while(index1 < n1 || index2 < n2){ if(index1 < n1 && index2 < n2){ (data1[index1] >= data2[index2])?(data3[index3++] = data1[index1++]) :(data3[index3++]=data2[index2++]); for (i=0; i<(2*N) ;i++) printf("%d,", data3[i]); printf("\n");} else if(index1 < n1){ for (;index1 < n1 ;index1++) data3[index3++] = data1[index1]; } else {for( ; index2 < n2 ; index2++) {data3[index3++] = data2[index2];}} } }
87 名前:デフォルトの名無しさん [2007/10/16(火) 16:39:32 ] 自力で頑張ろうとしてたんですがどうしてもうまくできません。。 提出期限は明日までですが、ここまで頑張ったならしっかり理解して終わりたいです。 期限すぎてからでもいいのでどなたかお願いします。。 コンパイルエラーが出るので使えませんが一応自分の作り書けたものも載せておきます。 もし構想みたいなのはよければどこがダメなのか教えてもらえれば明日頑張って続き作ります>< void merge_sort(int data1, int n, int data2) { int i,j, cut = n / 2; if ( cut > 0 ){ int samp_left[cut],samp_right[n - cut]; for( i = 0 ; i < cut ; i++) samp_left[i] = data1[i]; for( i = cut ; i > n ; i++ ) samp_right[i]=data1[i]; if( n != 2 ){ merge_sort(samp_left,cut,data2); merge_sort(samp_right,n - cut ,data2); } } merge(samp_left,cut,samp_right,(n - cut),data2); }
88 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 16:55:17 ] C/C++の宿題を片付けます 97代目 pc11.2ch.net/test/read.cgi/tech/1191937213/l50
89 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 17:27:20 ] >>87 とりあえずぱっと見ておかしいところ…… >void merge_sort(int data1, int n, int data2) data1とdata2は配列だから、int data1[]とかint *data2とかやらないと。 >for( i = cut ; i > n ; i++ ) 継続条件の不等号が逆だと思う >samp_right[i]=data1[i]; iがcutから始まってるから、samp_rightの添え字がずれちゃうね 足し引きして調整しないと >meege_sort(samp_left,cut,data2); >merge_sort(samp_right,n - cut ,data2); merge_sortの第三引数は結果を受け取る変数だから、 双方ともにdata2に受け取ったら上書きされちゃうと思う。 meege_sort(samp_left,cut,samp_left);みたいにして同じ配列で受け取るか、 sorted_leftとかの配列を新たに宣言して、それを第三引数に指定すべき。 >merge(samp_left,cut,samp_right,(n - cut),data2); もしsorted_leftとかを新たに作るんだったら、ここの引数も直す そうでないならこのままでいい 大筋としては特に考え方が間違ったりはしてないと思うよ 今は携帯だからこれ以上無理 >>88 丸投げしたいわけでもないみたいだし、いんじゃね 何で宿題スレのテンプレ使ってるのか知らんけど
90 名前:デフォルトの名無しさん [2007/10/16(火) 17:33:35 ] 汎用性を重視しているのですが、DLLを使う場合に一般的なのは、 LIBファイルを使って最初からリンクしてしまうパターンでしょうか? それともLoadLibraryで随時リンクするパターンでしょうか?
91 名前:89 mailto:sage [2007/10/16(火) 17:37:31 ] あ、書き忘れ cut==0のとき(n==1のとき)、samp_leftとかが宣言されてないからmerge関数を呼び出すとこでエラーが出る とりあえずの対処法としては、mergeをifブロックに押し込んで、 n==1 (cut==0)の時はdata2にそのままデータを入れる
92 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 17:38:22 ] >>90 スタティックリンクだとDLLのバージョンで悩まなくて済む
93 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 17:44:33 ] てか宣言されていないとか以前の問題か スコープが……
94 名前:デフォルトの名無しさん [2007/10/16(火) 17:57:32 ] VCExpress2008Beta2で以下のような最小Winプログラムを実行しようとしたのですが、 ビルドに失敗してしまいます。何故なのでしょうか? #include <windows.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd) { return 0; } エラー 1 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup MSVCRTD.lib エラー 2 fatal error LNK1120: 1 unresolved externals C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\test\Debug\test.exe
95 名前:デフォルトの名無しさん [2007/10/16(火) 18:01:43 ] >>94 Windowsアプリを作るなら、コンパイルオプション設定する必要があるんじゃないか。 VCは知らんが、例えばBorlandなら「-W」とか。
96 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 18:05:53 ] >>95 プロジェクトの設定を変えたら動きました。ありがとうございます
97 名前:デフォルトの名無しさん [2007/10/16(火) 18:23:12 ] なんてスレ違いのやつなんだ
98 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 20:02:52 ] >>87 marge関数内ではdata1[],data2[]は読み込みしかしていないから >merge_sort(samp_left,cut,data2); >merge_sort(samp_right,n - cut ,data2); は merge_sort(data1,cut,samp_left); merge_sort(data1 + cut,n - cut ,samp_right); としてもいいと思う。 (merge関数がブラックボックスなら宣言にconstついてない時点で却下だけど) あとC言語だと配列宣言時の要素数指定に変数が使えないから >int samp_left[cut],samp_right[n - cut]; はだめだと(C++では通ってしまう) int *samp_left,*samp_right; samp_left = malloc(cut*sizeofint)); samp_right = malloc((n-cut)*sizeofint)); として当然merge呼び出した後 free(samp_left);free(samp_right); とする。
99 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 22:57:09 ] INT_MAX + 1 とすると、オーバーフローを起こすのですが INT_MAX + 1.0 にすると、2147483648.000000 と出て、エラーが出ません。 double型はどこまで値を扱えるのか誰か教えてくださいませんか?
100 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 22:58:10 ] struct node{ T data; node *left; node *right; }; void deletetree(node *t){ if(t==NULL)return; deletetree(t->left); deletetree(t->right); delete t; } void deletetree(node *t){ node *route[1024]; node *p,q; int n=0; for(p=t;){ while(q=t->left;q!=NULL;q=q->left){route[n]=p;n++} delete p; } }