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; } }
101 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 22:58:54 ] ごめんなさい誤爆しました
102 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 23:08:42 ] >>99 DBL_MAX まで DBL_MAX は float.h で定義されている
103 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 23:29:39 ] 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458 953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304 583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 こんな数が得られましたw ありがとうございます
104 名前:デフォルトの名無しさん [2007/10/17(水) 03:18:10 ] あるコンパイラで作ったC言語のライブラリを 別のコンパイラから利用できることってあるんですか?
105 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 03:21:06 ] あります
106 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 03:28:42 ] ありがとうございました。
107 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 05:49:34 ] XP使ってるんですが、どうもコンパイラをうまく設定できません。 LSI C-86というのの設定がわからず、Borland C++ Compiler 5.5 ってのも 落とせるところのリンクが死んでます・・・手っ取り早くコンパイルするにはどうすればいいでしょうか
108 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 07:38:10 ] >>107 www.forest.impress.co.jp/lib/stdy/program/progdevenv/ VC2005ExpressかTurboC++ExpressをDLすればよし。どちらもコマンドラインでコンパイル可能。
109 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 08:40:31 ] >>107 Borland C++Compiler 5.5 www.borland.com/jp/products/cbuilder/freecompiler.html ここのダウンロード、まったく反応ありませんね〜。 昨日からC言語をはじめた者ですが、どこかにミラーサーバ ありませんか??
110 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 08:53:02 ] >>109 ttp://www.codegear.com/jp/downloads/free/cppbuilder
111 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 13:41:44 ] うーんBorland C++Compiler 5.5って落とせたけどコンパイル、実行の仕方がわからない・・・ インストールしても実行ファイルがなくてどうすればいいのやら
112 名前:BCCはこれよめ [2007/10/17(水) 14:02:15 ] 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画面に出れば成功
113 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 14:09:45 ] 入門編ってのはあくまでC言語の入門であってPC入門じゃない コンパイラ自体はただのソフトなんだからそれぐらい自分で解決できるようになっておけ
114 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 15:37:49 ] >>110 ありがとうございました! 無事Win95で起動させました! このPCの余生の用途が決まりました。
115 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 15:50:58 ] >>111 実行ファイルが無いって…… インストール先をちゃんと見てみたのか?
116 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 15:52:05 ] というか別に実行ファイルを探す必要は無いんだよ PATHを通せば
117 名前:998 [2007/10/17(水) 19:19:02 ] 前スレでfopenでセグメンテーション違反が出て、 ポインタの取り扱いミスとの指摘を受けたものです。 ポインタ勉強したのですが、イマイチ分かりません。 数値計算用プログラムで配列の要素をかなりたくさん使っているのですが、 それも原因として挙げられますか?
118 名前:デフォルトの名無しさん [2007/10/17(水) 19:20:13 ] 質問させてください 数字、文字、それ以外の1つの文字列を入力し入力後に その文字列を数字、文字、それ以外の各配列に分けそれぞれの内容を 表示するプログラムなのですが int i, suji_cnt = 0, moji_cnt = 0 ,kigou_cnt =0; char str[NUM],suji[NUM],moji[NUM],kigou[NUM]; printf("Input:"); scanf("%s",&str); for(i=0; str[i] != '\0';i++){ if(str[i]>='0' && str[i]<='9'){ suji[suji_cnt++] = str[i]; } else if(str[i]>='a' && str[i]<='z'){ moji[moji_cnt++] = str[i]; } else{ kigou[kigou_cnt++] = str[i]; } } printf("数字: %s Input Length : %d\n", suji,suji_cnt); printf("文字: %s Input Length : %d\n", moji,moji_cnt); printf("それ以外: %s Input Length : %d\n", kigou,kigou_cnt); return 0; } と書くと表示されるとき最後のほうで変な記号? みたいなものも表示されるのですがどこがおかしいのでしょうか? よろしくお願いします。
119 名前:デフォルトの名無しさん [2007/10/17(水) 19:22:56 ] 数値の符号を反転させるにはどうしたらいいですか?
120 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 19:30:34 ] >>118 文字列を'\0'で終わらせてないから。
121 名前:119 mailto:sage [2007/10/17(水) 19:33:10 ] すみませんつけたしです。 反転の他に、(+)にする、(-)にする方法もあれば教えて頂きたいです。 数値は signed前提です。
122 名前:119 mailto:sage [2007/10/17(水) 19:42:44 ] 連投すみません。 なんとか解決できたかも知れません。 符号を反転させるには、 x *= -1; でき、 if( x < 0){ x *= -1; } ------------ if( x > 0){ x *= -1; } で、できそうです。 もっとスマートな方法があれば教えて頂きたいです。 よろしくお願いします。
123 名前:デフォルトの名無しさん [2007/10/17(水) 19:43:33 ] >>120 ありがとうございます。 解決できました。
124 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 19:51:30 ] 符号をプラスにするなら x = x * x / x; とかでできるんでない?多分
125 名前:124 mailto:sage [2007/10/17(水) 19:52:50 ] やべ、何言ってんだ俺w 今の無しにしてorz
126 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 19:56:38 ] >>117 ソースうp!
127 名前:124 mailto:sage [2007/10/17(水) 19:58:37 ] 改めて…… >>122 x = -x;
128 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 19:59:27 ] >>119 数値計算の速度がシビアじゃないところなら >>122 よりも x=-x; x=abs(x); x=-abs(x); が分かりやすい (オレはね)
129 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:08:56 ] 高速さがシビアに要求されるなら、 むしろ乗算を使わない128のほうが速い気がする。
130 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:11:47 ] 誰か測れ
131 名前:デフォルトの名無しさん [2007/10/17(水) 20:18:07 ] #include <iostream> #include <time.h> #include <math.h> #define N 500000000 using namespace std; f0(){int x=10,n,c; c=clock();for(n=0;n<N;n++)x=-x;c=clock()-c; cout << x<<" "<<c<<endl;} f1(){int x=10,n,c; c=clock();for(n=0;n<N;n++)x=abs(x);c=clock()-c; cout << x<<" "<<c<<endl;} f2(){int x=10,n,c; c=clock();for(n=0;n<N;n++)if(x>0)x=-x; else x=-x;c=clock()-c; cout << x<<" "<<c<<endl;} main(){ f0();f1();f2();}
132 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:20:20 ] この範囲でランダムの数値を取るってどうすればいいんでしょうか? a = rand() これをいじって10以下でランダムとかにしたいのですが・・
133 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:27:08 ] ヒント:剰余算
134 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:34:22 ] >>132 rand()%10 // 0〜9 までの乱数 rand()%11 // 0〜10 までの乱数
135 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:45:02 ] 1〜10の範囲で乱数を得たい場合。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int lower = 1, upper = 10; srand((unsigned int)time()); fprintf(stdout, "%d", rand_xtoy(lower, upper)); return 0; } int rand_xtoy(int lower, int upper) { return rand() / (INT_MAX + 1.0) * upper + lower; }
136 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:55:26 ] >>135 誤解しそうな関数 rand_xtoy( 9 , 10 ) が返す値の範囲は?
137 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 21:12:55 ] >>136 サッカー見ながら書いたら間違ったw int rand_xtoy(int lower, int upper) { return rand() / (INT_MAX + 1.0) * (upper - lower + 1) + lower; }
138 名前:137 mailto:sage [2007/10/17(水) 22:02:12 ] なんか寝ぼけてるようだ…orz int rand_xtoy(int lower, int upper) { return rand() / (RAND_MAX + 1.0) * (upper - lower + 1) + lower; }
139 名前:998 [2007/10/17(水) 23:01:00 ] >>126 ごめんなさい。 ソースはうpできないんです。
140 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:17:53 ] >>139 バッファオーバーフローにより、 書き換えてはいけないところが書き換えられているか、 未初期化のポインタを操作している可能性が高いです
141 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:43:32 ] >>139 「fopenでエラーが出る」と判明しているのなら、 ファイルオープンに失敗したNULLポインタを使ってるんじゃないの?
142 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 00:55:45 ] 分割コンパイルでなんかもうファイルの数がすげー多くなってきて makeかけたら結構の行いくんだよね。 1つのファイルに2、3個の関数書くもの?
143 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:18:25 ] myheader.h:20: error: 配列の型が不完全要素型を持っています 20行めの関数プロトタイプ void fileinput(char [][],int ); どういうエラーですか?
144 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:30:44 ] >>143 配列の要素数を省略できるのは最初の [ ] だけ。 void fileinput(char [][10],int ); とかにする必要がある。10 かどうかは知らんが。
145 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:40:41 ] >>143 >void fileinput(char [][],int ); 二次元配列を受け取る時は、一次元目の要素数を指定しなければならない void catch_two_dimensions_array(char s[][5] , int n){ int i; for(i=0; i<n; i++) printf("%s",s[i]); } int main(){ char str[3][5] == {"hoge" , "hage" , "func"}; catch_two_dimensions_array(str , 3); return 0; } なお、 void catch_two_dimensions_array(char (*s)[5] , int n); としてもおk(結局同じこと)
146 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:47:52 ] >>122 分岐しないで絶対値をとる方法です。(普通使いません) int abs(int x) /* |x| */ { int mask = x >>(CHAR_BIT*sizeof(int)-1); return (x + mask)^mask; } int minus_abs(int x) /* -|x| */ { int mask = x >>(CHAR_BIT*sizeof(int)-1); mask = ~mask; return (x + mask)^mask; }
147 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 02:06:50 ] >>122 1ライナーな符号変転(整数限定、マクロで書いてみた) #define NEGATIVE(x) (~x+1) これは有名だと思う。
148 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 02:42:08 ] >>142 1ファイルに関数1つなんて規則はない。 ある程度同じ関連のものは1ファイルにまとめた方が管理もしやすいと思う。 そのあたりは書いた人のセンスだろうが…。 1ファイル1関数にすると1関数の行数が多くなりがちと読んだことがあるが 本当なのかなぁ
149 名前:デフォルトの名無しさん [2007/10/18(木) 02:44:13 ] 関数を始める時に int kansuu(int a, int b, char *c){ という風に書きますよね。 これを int kansuu(a, b, c) int a; int b; char *c; { と書き換えることができると聞いたのですが、コンパイルが通りません。 後者の書き方は一般的ではないのでしょうか?
150 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 02:46:31 ] >>149 Cでは出来るがC++では無理だったかと
151 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 02:51:30 ] ということは古い書き方ってことですか。前者を使う方が良さそうですね。
152 名前:デフォルトの名無しさん [2007/10/18(木) 07:13:56 ] フリーのリンクソフトってある? あったら教えてくれ
153 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 07:30:13 ] >>55 のソースで予想通りの結果が出ません。 現在の時刻: 7:28:12.80 新しい時刻を入力してください:_ と表示されます。
154 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 07:33:05 ] >>153 .\time .\time.exe
155 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 07:53:16 ] >>154 ありがとうございます。実行できました。
156 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 08:48:38 ] 関数内に関数を書く方法は、いつできたのでしょうか? C言語作成当初からあったのでしょうか? (自分の環境がC99な為、C89等他の環境でもビルドできるか知りたいです)
157 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 08:50:57 ] C89じゃできないよ
158 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 14:17:05 ] >>156 大丈夫、C99でもできない。恐らくgccの拡張だろ。
159 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 14:38:12 ] >>関数内に関数を書く方法 C++でなおかつ関数じゃなくてクラスor構造体or共同体なら宣言できるが…。 gcc拡張使ってないから分らない… (ヲイヲイ)
160 名前:998 [2007/10/18(木) 16:03:26 ] >>139 >>140 ありがとうございます!! スタックサイズを無制限にしたら解決しました。
161 名前:デフォルトの名無しさん [2007/10/18(木) 16:04:49 ] >>156 gccの拡張。 また、gccでも、CではできるがC++ではできない。 例: void func(int x[], int y[], int n) { int i; double average(int x, int y){ return (x + y) / 2; } for(i = 0;i < n;i++) printf("%d\n", average(x[i], y[i])); } みたいな感じで使う(例が悪くてすまん)
162 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 16:25:47 ] 始めて知ったが、果てしなく謎だな。 カプセル化したいんならC++でやるべきだろ
163 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 19:29:20 ] pascalはふつーに関数を入れ子にできたから、昔はCにもあればいいのにって思ってたよ。
164 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 19:36:17 ] double a,b; if(b==0.0 || a%b!=0.0) { } がコンパイル通らないんですが、doble型の%演算は
165 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 19:36:48 ] ミスりました double a,b; if(b==0.0 || a%b!=0.0) { } がコンパイル通らないんですが、double型の%演算はできないんですか?
166 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 19:41:08 ] つ fmod 浮動小数点数の比較で ==, != を使うのはどうかと思うがな。
167 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 19:41:19 ] >>165 ないです。fmod関数を使ってください
168 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 19:43:20 ] わかりました!
169 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 19:46:27 ] どらえもんは何言語でできてるんですか?
170 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 19:49:21 ] >>169 Fortran
171 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:22:15 ] #include <stdio.h> int main (void) { int a=0xFFFA; printf("%d,%p",a,&a); return 0; } 仮に&aのアドレスが0012FF88だった場合に 1バイト目(FA)は0012FF88ですが、 int aの2バイト目(FF)のアドレス 0012FF89を 得るにはどうしたらいいでしょうか?
172 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:32:35 ] >>171 #include<stdio.h> int main(void){ int a=0xFFFA; printf("%d,%p\n", a, &a); printf("%p\n", (char*)&a+1); return 0; }
173 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:37:14 ] intのバイトオーダーはCPUによって異なる Windows(Intel)の場合はこうでなかったかな? 0012FF88 00 0012FF89 00 0012FF8A FA 0012FF8B FF
174 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:39:01 ] >>171 #include <stdio.h> struct int_filter{ char byte[sizeof(int)/psizeof(char)]; }; int main (void) { int a=0xFFFA; struct int_filter *f; f = (struct int_filter *)&a; printf("a:value->%d,address->%p",a,&a); printf("filter:[0]->%p,[1]->%p,[2]->%p,[3]->%p"f->byte,f->byte+1,f->byte+2,f->byte+3) return 0; }
175 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:41:14 ] 何故わざわざ構造体を……
176 名前:173 mailto:sage [2007/10/18(木) 20:42:23 ] まちがえたみたいね 無視してくださいw
177 名前:171 [2007/10/18(木) 20:48:12 ] >>172 できた〜〜〜ありがとうございます。 >>174 174さんのコピーして貼り付けたんですが、 コンパイルできませんでした。 初心者なのでソースが難しすぎてどこを直せばうごくかさっぱりですが どうもありがとうです。
178 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:56:25 ] >>173 sizeof(int)==4なら 0x00FFFAは FA,FF,00,00 でしょIntel系なら。 00,00,FF,FA の順ががモトローラ系(スペル忘れちった)
179 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 21:21:57 ] エンディアンの違いはいい迷惑。
180 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 21:51:54 ] >>177 >>174 のヤツ。 psizeof→sizeofのタイプミス 2つ目のprintf、閉じる方の「"」の後ろに「,」が無い。文の最後に「;」がない。 ミス自体は初心者レベルのモンだな。 まぁどうでも良いけどな・・・
181 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:35:06 ] スタックとキューの初歩を勉強してるんですが。 #include <stdio.h> #define MAX_SIZE 30 int stack[MAX_SIZE]; int sp = 0; void push( int x ) { stack[sp] = x; sp++;} int pop(void) { int x; x = stack[sp-1]; sp--; return x;} 〜スタックが空か判定(省略)〜
182 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:36:16 ] void show( void ) { int i; printf( "size = %2d:", sp ); for( i = 0; i < sp; i++ ){ printf( " %4d", stack[i] ); } printf( "\n" ); } int main() { push( 1 ); show(); push( 2 ); show(); push( 3 ); show(); printf( "pop: %4d\n", pop() ); printf( "pop: %4d\n", pop() ); printf( "すべてpopします...\n" ); while( !is_empty() ){ printf( " %4d", pop() ); } return 0; } スタックの内容を少しずつ表示していくものなんですが、 これだとpush関数とpop関数の所は場合によっては危ないよ、と言われました。 ポインタとか使ったほうが良いんでしょうか? 危ない、の意味すらわかりません。分かる人居たら教えてください。
183 名前:デフォルトの名無しさん [2007/10/18(木) 22:39:55 ] すたっくはSTLつかっとけ
184 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:40:20 ] たぶんpushやpopする前にバッファが残ってるかチェックしてないからじゃね たとえばpushしてないのにいきなりpopするとか
185 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:44:34 ] しかし、STLはC++という罠。 >>181 ようするにMAX_SIZE以上pushしようとしたときと、 空の時にpopしようとしたときにまずい。
186 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:48:17 ] 「危ない、の意味」をボカしてるのは、自分で考えさせようという親心? なら俺も黙っとく。
187 名前:デフォルトの名無しさん [2007/10/18(木) 22:48:19 ] >>181 ,182 pushする時にはオーバーフローしないか(配列から溢れないか)、 popの時にはスタックが空でないかチェックするのは鉄則 pushなら if(sp < MAX_SIZE) popなら if(sp > 0)でチェックすればいい
188 名前:186 mailto:sage [2007/10/18(木) 22:50:08 ] (´д`;)
189 名前:181 mailto:sage [2007/10/18(木) 22:58:36 ] 皆さんありがとうございます。 危ない、ってそれのことだったんですね。 push関数で最大値以上にpushしたらどうなるのか、エラー出てないし まあ良いかと思ってたんですが、油断していました。 (181の最後で「空かどうか判定」の部分は省略しましたが、 そこのことだと思ってました。) 自分でちょっと直してみます。
190 名前:デフォルトの名無しさん [2007/10/19(金) 06:02:19 ] #include<stdio.h> int main(){ char *str="test"; str[1]='s'; printf("%s\n",str); return 0; } これを試してみたのですが、何も表示されません。 どこが問題なのでしょうか?
191 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 06:10:36 ] 釣りにしか見えない
192 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 06:27:51 ] >>190 ポインタや配列に関する知識が中途半端な証拠
193 名前:デフォルトの名無しさん [2007/10/19(金) 06:37:35 ] char str[]="test";
194 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 06:42:43 ] >>190 それは処理系によって動作が異なる。 何も表示されないどころかエラー吐いて止まる場合もあるし、 >>190 の望みと思われるtsstを表示して正常終了する場合もある。 つまり、コンパイルできるからといって書いてはいけないコード。
195 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 06:43:49 ] 明らかに欠陥だな
196 名前:デフォルトの名無しさん [2007/10/19(金) 06:45:17 ] でも、とりあえずstr[1]='s'をコメントアウトして printf("%c",str); とした場合には、ちゃんとeが表示されます。 これってつまりstr[1]には文字が入っているということですよね。 では何故そこに代入することができないのでしょうか?
197 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 06:59:28 ] >では何故そこに代入することができないのでしょうか? そこってどこだと思う?
198 名前:デフォルトの名無しさん [2007/10/19(金) 07:11:28 ] 文字列の先頭アドレスからsizeof(char)一つ分進んだ所ではないのですか? そこにsを代入しようと思うのですが。
199 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 07:26:45 ] とあるビルの2階に手紙を届けたいが届けることが出来ない。なぜだろう? →そのビルへは階数に関わらず手紙を届ける事が禁止されている
200 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 07:32:38 ] こういう回りくどく説明してるのは傍から見てうざい
201 名前:デフォルトの名無しさん [2007/10/19(金) 07:34:31 ] ポインタに代入した文字列はconstなんですか?では何故コンパイルエラーが出ないのでしょう? 出ないにしても、代入が無効になるだけだと思うのですが、表示すら何もされなくなるのは何故なのでしょうか。
202 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 08:46:11 ] 文法的に正しくても配列のメモリ格納形式が処理系異存だから うまくいかない環境もあり,うまくいく環境もある
203 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 08:48:31 ] >>201 配列とポインタが同じように扱える保証はないからな
204 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 10:52:15 ] プログラムの勉強を始めようと思って、分りやすい教科書を 探しているんですが、何かおすすめの本てありますか? 今手元にあるのはメディックエンジニアリングの「これから はじめるC言語基礎の基礎」という本なんですが・・・・
205 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 10:58:28 ] nai
206 名前:デフォルトの名無しさん [2007/10/19(金) 11:50:24 ] >>202-203 いやでもやってることは、文字列の先頭から2バイト目に文字を代入する、ってことですよね? 配列で宣言してもポインタで宣言しても、データがメモリに連続で格納される、という点は変わらないはずです。 いくら処理系依存と言っても、配列だけ何故か1KBごとに飛び飛びで格納する、 なんてトリッキーなことはしていないと思うのですが、しているのですか? もしそうならば、わざわざ配列の格納方式だけ処理系依存にする意味なんてあるんですか?
207 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 12:04:51 ] >>206 文字列リテラルと配列の区別をつけよう。
208 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 12:05:18 ] とりあえずさ、 >>190 のコードで実際にどんな値が入ってるか、確認してみれば? printf("%d" , str[1]); %cじゃなく%dで もし代入失敗してるなら代わりに何が入ってるか確認できるし
209 名前:デフォルトの名無しさん [2007/10/19(金) 12:12:01 ] >>207 機能として違うのはわかりますが、メモリの格納方式まで別々にする意味は何でしょう? 単に不便にしているだけとしか思えないのですが。 >>208 同じ値が入っていました。さすがにこれはおかしいと思い、VCのモードをReleaseに変えたら動きました。 しかし根本的な問題解決にはなっていません。何故こう無駄に不安定なのか…
210 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 12:27:50 ] 無駄じゃないだろ
211 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 12:30:35 ] >>209 「このモジュールはデバッグモードでコンパイルして こっちはリリースモードでコンパイルしないとダメだからな」 嫌すぎる…
212 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 13:22:06 ] >>209 文字列リテラルを使うときに、メモリを節約できるから。 つまり、次のコードは、同じ値を出力するかもしれない。 # コンパイラとオプションによって変わる -- void exsample() { const char * foo = "abcde"; const char * bar = "abcde"; printf("%p, %p\n", foo, bar); } -- 勿論、次のコードは只の配列だから違う値が出力される。 void exsample2() { char foo[] = "abcde"; char bar[] = "abcde"; printf("%p, %p\n", foo, bar); }
213 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 13:23:23 ] げ、どうでもいいけど関数名がtypoだ _/ ̄|◯
214 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 13:29:26 ] 自分が間違ってんのに仕様の方に文句をつけるやつは、Cどころか学習自体に向いてないよ
215 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 13:56:58 ] 新しい言語作ればいいと思うよ
216 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 15:42:13 ] #include <stdio.h> int main (void){ double a,b,c,x; printf("Please type 1st Number >> "); scanf("%xf",&a); printf("Please type 2nd Number >> "); scanf("%xf",&b); printf("Please type 3rd Number >> "); scanf("%xf",&c); x=(a+b+c)/3; printf("Average = %xf\n",x); return 0; } なぜか、計算結果が違う・・・ %f が違うんでしょうか?
217 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 15:46:25 ] >>216 %xf を %lf にしてみたらどうかな?
218 名前:215 mailto:sage [2007/10/19(金) 16:07:13 ] >216 ありがとうございました。
219 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 20:17:42 ] >>201 文字列リテラルの内容を書き替えるプログラムの挙動は未定義。 文字列リテラルの型はchar配列となっているが、これは過去との互換性のため。 蛇足だがC++ではconst charの配列となっている。 (ただし、またも互換性のためchar*への型変換は定義さらている) >>206 組み込みではROMに配置できるようになる。 Windowsなど高水準なOSでは、規格の規定から 文字列リテラルの書換はするべきでないと 認知されているため、文字列リテラルが 格納されている辺りを読取専用にする。
220 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 21:09:41 ] まぁ結局ROMに配置すんのもメモリの節約だし、 「メモリの節約のため」でまとめちゃってもいい気もするけどね。 なんかメモリの節約以外の理由で文字列リテラルはROMのが良い理由があったら、 後学のために教えたって欲しいかも。
221 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 21:39:11 ] まぁROMは遅いから結局実行時にRAMにコピーしちゃったりるすんだけどね
222 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 22:18:08 ] 開いたりしていないファイルポインタを fclose(fp); とすると、どうなるのでしょうか?
223 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 22:21:13 ] fclose関数でエラーが返されると思います。
224 名前:デフォルトの名無しさん [2007/10/20(土) 12:19:02 ] >>222 詳しく言うと、エラー時にはEOFが返される。 成功時は0が返される。
225 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 13:31:04 ] その前に開いてない fp ってどっから持ってくるんだ NULLかゴミ値じゃねぇの?
226 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 13:47:34 ] FreeBSD系だとfcloseにNULLを渡したら例外が起きるらしい。 以下はMac OS X Tigerのfclose(3)から引用 > The fclose() function does not handle NULL arguments; they will result in > a segmentation violation. This is intentional - it makes it easier to > make sure programs written under FreeBSD are bug free. This behaviour is > an implementation detail, and programs should not rely upon it. 実際にfcloseにNULLを渡してみたらsegvが発生した。 おっしゃるとおりの御利益はあるかもしらんが、ちゃんと規格に準拠しようぜ…
227 名前:デフォルトの名無しさん [2007/10/20(土) 18:16:47 ] 例えば const char test[] = {"abcdef"}; で cとdの間に0x04を入れたい場合どう書けばよいのでしょうか
228 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 18:31:08 ] "abc\x04def"
229 名前:227 [2007/10/20(土) 18:42:47 ] 了解
230 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 19:12:41 ] "abc\04def"とも書けなっかったかな。 \04は8進表記。
231 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:04:00 ] doble型の変数をprintfで表示するときには整数で表示するにはどうしたらいいですか?
232 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:08:21 ] double x = 1; printf("%d\n", (int)x); こうか?
233 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:08:42 ] >>231 %.0f
234 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:09:56 ] >>232 >>233 どちらでもできました!ありがとうございました
235 名前:デフォルトの名無しさん [2007/10/20(土) 20:30:34 ] 今までCとC++は同じものだと思っていたけれど、 MFCを使ったC++プログラミングは、C言語と似ているようで 似ていないですね。
236 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:36:52 ] C++はCの拡張だから、Cと同じように書くこともできる 単にC++をCとして使ってただけだろ
237 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:37:27 ] BetterC
238 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:40:47 ] CとC++は全然違う言語だと思ってもいいよ クラス、例外処理、テンプレート、新たに覚えることはたくさんある
239 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 21:02:21 ] >>238 の言うとおり、別物と認識した方がいい。 同じだと思っている人と一緒に仕事するとよーっくその事を実感することになる。
240 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 23:10:59 ] 引数の数が可変の関数の作り方を勉強したのだが、 printfって、%fでdouble型もfloat型も受けるよな? それが、よく分らなくなった。 double型とfloat型って、サイズが違うはずだから、 引数から取り出すとき、区別がつかなくて、おかしくならないか?
241 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 23:13:34 ] www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html というわけで、可変引数だと暗黙的にfloatはdoubleに変換されるらしい
242 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 23:13:52 ] 可変引数では int以下→int、float→double になる
243 名前:デフォルトの名無しさん [2007/10/20(土) 23:50:12 ] >>240 でもそういうのってコンパイラによって違うのでは? それってANSI Cで決められてたっけ?
244 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 00:07:10 ] >>243 ANSIというか規格で決まっている。 floatは受ける型がわからない関数に渡されるときはdoubleに格上げされる。 これはプロトタイプの与えられていない関数の引数、あるいは可変引数のときに起こる。 なので、printfに渡すときはfloatもdoubleもどちらもdoubleとして渡されることになる。 似たようなことがcharにも言えて、これはintに格上げされる。
245 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 01:21:25 ] ちょっと聞きたいんだけど #include "myheader.h" int main(){ int list_num[100]; FILE *fp; int i; char buf[100][30]; というプログラムの最初の部分において gcc -c main.c main.c: 関数 `fgword' 内: main.c:3: error: 文法エラー before '{' token main.c:9: error: 文法エラー before "fp" make: *** [main.o] エラー 1 main関数内でいきなりこういうエラーがでるんだけど どういうことなんでしょうか? main関数内にfgwordは使ってないんですけど
246 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 01:22:49 ] たぶん myheader.h の中がおかしい
247 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 01:35:24 ] myheader.hの中身のプロトタイプの int fgword(int); にセミコロンがなかったからこういうエラーがでたようです。 ありがとうございます。 突然こんなエラーでてきてびびった。
248 名前:デフォルトの名無しさん [2007/10/21(日) 03:41:30 ] デスクトップパソコンで 処理させるのと ノートパソコンで処理 させるのと 音が違うな。 デスクトップはうるさくてやってられない。 実行に10分くらいかかるプログラムを動かしてるとき デスクトップだとかなり沸いてくるし。
249 名前:デフォルトの名無しさん mailto:age [2007/10/21(日) 03:45:40 ] videointroplayer.web.fc2.com/v.htm?ii9YN1kO-TK36%+8mdKsm-z3pn32%+WhqyiIrhz0F110%+iwCjWdz0Gid150%+Kjtps4byn7a119%+@1@_%E4%BC%9A%E9%95%B7%E7%89%A9%E8%AA%9E
250 名前:デフォルトの名無しさん [2007/10/21(日) 12:38:50 ] 1bitのファイルはつくれるんでしょうか? charだと8bitになってしまいます
251 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 12:39:12 ] char* ch; ch = "test1"; ch = "test2"; ↑で"test2"を代入した時点でメモリリークしてますか?
252 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 13:11:01 ] >>251 メモリリークの意味を考えてください 確保したメモリを使用後も開放せずにいることですよ で、それは該当すると思いますか? そもそも領域確保していないのに
253 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 13:13:03 ] >>251 「動的に」が抜けてた 静的に確保されたものは終了後、自動的に開放されます
254 名前:デフォルトの名無しさん [2007/10/21(日) 13:59:07 ] スレッドが開始される前に、mainで全ての処理を終えてしまうようです そのためスレッド稼働中の判定がうまくいきません どうしたらいいですか? #include <process.h> #include <stdio.h> #include <windows.h> void fnc(void *p){ int m=(int) p; Sleep(m*400); printf("%d end\n",m);} main(){ HANDLE m[10]; DWORD tp[10]; int n=0,k; for(k=0;k<10;k++)tp[k]=0;k=0; while(n<100){ GetExitCodeThread(m[k], &tp[k]); if(tp[k]!= STILL_ACTIVE){ m[k]=reinterpret_cast<HANDLE>(_beginthread(fnc, 0, (void *)n));n++;} k++;} Sleep(10000);}
255 名前:254 [2007/10/21(日) 14:04:27 ] まちがえました
256 名前:254 [2007/10/21(日) 14:11:11 ] HANDLE m; DWORD flg; m=reinterpret_cast<HANDLE>(_beginthread(fnc, 0, NULL)); このようにスレッドを開始したとき、スレッドが終わると次の関数を終了コードを返すはずですよね? GetExitCodeThread(m, &flg); なんかいつまでもアクティブのままなんですが
257 名前:254 [2007/10/21(日) 14:18:10 ] _beginthreadは終了しても終了コード返しませんか?
258 名前:デフォルトの名無しさん [2007/10/21(日) 14:20:02 ] なんかクリエイトスレッドは、不都合があるってかいてあったんですけどこっちのほうがいいですか?
259 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 14:29:28 ] msdn2.microsoft.com/ja-jp/library/kdzttdcb (VS.80).aspx >start_address で起動されるルーチンは、__cdecl 呼び出し規約を使用する必要があり、戻り値を持つことはできません。
260 名前:デフォルトの名無しさん [2007/10/21(日) 14:36:49 ] _beginthreadexを使ったらうまくいきました
261 名前:デフォルトの名無しさん [2007/10/21(日) 14:56:09 ] 質問なんですけど、全てのスレッドが終了したら停止したいんですけど、最後の部分の判定は駄目なんでしょうか? なんか作業が終わる前に停止してしまいます #include <process.h> #include <stdio.h> #include <windows.h> #define ThreadNum 100 unsigned __stdcall fnc(void* p){ int m=(int) p; Sleep((m%10)*10); printf("%d end\n",m);} main(){ HANDLE m[ThreadNum]; DWORD tp[ThreadNum]; int n=0,k; for(k=0;k<ThreadNum;k++)tp[k]=100;k=0; while(n<100){ GetExitCodeThread(m[k], &tp[k]); if(tp[k]!= STILL_ACTIVE){ m[k]=reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL));n++;} k++;if(k>=ThreadNum)k=0;} do{n=0; for(k=0;k<ThreadNum;k++){ GetExitCodeThread(m[k], &tp[k]); if(tp[k]!= STILL_ACTIVE)n++;} }while(n>=ThreadNum); }
262 名前:デフォルトの名無しさん [2007/10/21(日) 14:57:22 ] すべてのスレッドがアクティブでは無いとすれば、作業が全てすんでいると思うのですが
263 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 14:57:52 ] いい加減スレ違いだって気づけ
264 名前:デフォルトの名無しさん [2007/10/21(日) 14:58:41 ] すみません 解決しました 一番最後は while(n<ThreadNum); でした
265 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 15:19:53 ] 停止を待つなら for(n=0; n<ThreadNum; n++) { if(m[n]) WaitForSingleObject(m[n], INFINITE); } というかreinterpret_castってC++じゃねーかww
266 名前:デフォルトの名無しさん [2007/10/21(日) 15:30:27 ] >>265 それはEXではない方の場合でしょうか?
267 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 15:34:46 ] マルチスレッドという時点でVisual C++依存 よってCの範疇ではないのでスレ違い
268 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 15:46:23 ] マルチスレッドなんて素人が無理に使うもんじゃないよ。
269 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:16:06 ] こういう簡単なポインタに関するプログラムがあるんですが、 実行するマシンによって(無論コンパイルはそのコンピュータ上でやり直している) 値が変動したりしなかったりします。 どうしてでしょうか? --------------------------------------------------- #include <stdio.h> main(){ int i,*x; x=&i; *x=1; printf("x=%o *x=%d\n",x,*x); } --------------------------------------------------- コンパイルコマンドは gcc hoge.c 以下は4回分の出力を横に並べたもの Fedora7 x=27775464634 *x=1, x=27747676054 *x=1, x=27773760474 *x=1, x=27764163514 *x=1 Vine x=27767545704 *x=1, x=27770645104 *x=1, x=27777542624 *x=1, x=27775054324 *x=1 OS X(10.3) x=27777776240 *x=1, x=27777776240 *x=1, x=27777776240 *x=1, x=27777776240 *x=1 HP-UX x=17777772540 *x=1, x=17777772540 *x=1, x=17777772540 *x=1, x=17777772540 *x=1
270 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:19:54 ] *xの値が変わってないんならどうでもいいことじゃね?
271 名前:デフォルトの名無しさん [2007/10/21(日) 16:21:56 ] OSのメモリ管理法にもよるだろ。
272 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:24:15 ] >>269 xは変数iのアドレス(スタック上の) OSによって異なるだろうし、同じOSでもコンパイラによっても異なる
273 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:27:19 ] 質問があるんですが int input(char *pstr1) { char *ppstr1; fgets(pstr1,SIZE_ARR,stdin); fflush(stdin); ppstr1=strchr(pstr1,'\n'); if(ppstr1!=NULL){ *ppstr1='\0';} return 0; } このコードは、fgets関数で読み込んだ文字列から改行記号を探し ヌル文字と改行文字を入れ替えをするということをしてるんですが 「*ppstr1='\0';」は、なぜ間接演算子抜きの「ppstr1='\0';」ではダメなんでしょうか ご教示ください
274 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:30:24 ] >>270-272 なるほど、ありがとうございました。
275 名前:デフォルトの名無しさん [2007/10/21(日) 16:39:43 ] >>273 strchrは見つかった場所へのポインタを返すから、char *型のppstr1で受け取ってるだろ? char *型、つまりアドレスを表してるわけだから、ppstr1だけだと、その見つかった場所のアドレスになるんだ。 だから、アドレスを書き換えても意味がない。 ここでやりたいのは改行をヌル文字に変える作業だから、ppstr1というポインタを介して値を変更しないといけない。 だから、間接参照演算子を使って代入作業を行わないと駄目ってこと。
276 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:43:25 ] >>273 ところでstdinからfgetsで取得したデータの改行は\0に変換されていなかったっけ? まちがっていたらソマソ
277 名前:デフォルトの名無しさん [2007/10/21(日) 16:45:34 ] >>276 変換というより、最後に\0を付加するんだよ。
278 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:49:55 ] >>276 そいつは多分getsと勘違いしてるとオモ。 getsは最後の改行コードを文字列に含まない。 fgetsは改行コードを文字列に含む。
279 名前:276 mailto:sage [2007/10/21(日) 16:54:10 ] >>278 なるほど納得
280 名前:273 mailto:sage [2007/10/21(日) 16:56:00 ] >>275 なるほど・・・ 易しい説明どうもありがとうございました!
281 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:58:54 ] 地銀はマーチが多いよ
282 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 17:00:34 ] ↑誤爆
283 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 17:00:41 ] 大文字か小文字かどっちだ?
284 名前:デフォルトの名無しさん [2007/10/21(日) 17:34:01 ] 一般的に、スレッドの関数はインライン展開できますか?
285 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 17:40:37 ] >>284 日本語でおk
286 名前:デフォルトの名無しさん [2007/10/21(日) 17:41:03 ] for ( k=0; k<10; k++ ) x+=f(k); というのはインライン展開しませんか? x= f(0) + f(1) + ・・・ だとインライン展開しますか?
287 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 17:46:41 ] 内部でfor, while, switchを使った関数はinllineの指定をしてもinline展開されないみたいだよ
288 名前:デフォルトの名無しさん [2007/10/21(日) 17:48:40 ] それならprintfを使っても駄目ですよね
289 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 20:17:10 ] 初歩的な問題ですみません。 等比数列の初項aと公比rを入力し、格項の値とn項までの総和を計算し出力せよ。ただし、r!=1とする。(for文を使用する) 等比数列: a, ar, ar^2,・・・・・ar^(n-1) 等比数列の和:Sn=a+ar+ar^2+・・・・+ar^(n-1) for文の部分だけでもお願いします。
290 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 20:18:41 ] それは質問じゃないだろ 宿題スレ行け
291 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 20:22:34 ] >>288 printfは非inlineな関数だから関係ないような気がするけど…。
292 名前:デフォルトの名無しさん [2007/10/21(日) 20:22:44 ] >>290 申し訳ない。宿題スレの存在しらなかったっす
293 名前:名無し [2007/10/21(日) 21:58:06 ] 配列名のsumって何?
294 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 22:01:21 ] 英和辞書にでも聞け
295 名前:名無し [2007/10/21(日) 22:12:13 ] なるほど。
296 名前:デフォルトの名無しさん [2007/10/22(月) 15:14:45 ] void add1(int i); int add2(int i); void add3(int *p); int main(void) { int n; /* n の値の変化に注目する */ printf("Input integer: "); scanf("%d", &n); printf("Original: %d \n", n); ???????; /* 関数add1 に nを適用する */ printf("After Add1: %d \n", n); /* 関数add1 を適用した後の nを表示する */ printf("Add2: %d \n", ???????); /* nを適用した関数add2 の値を表示する */ printf("After Add2: %d \n", n); /* 関数add2 を適用した後の nを表示する */ ???????; /* 関数add3 に nを適用する */ printf("After Add3: %d \n", n); /* 関数add3 を適用した後の nを表示する */ return 0; } void add1(int i) /* i に1を加えて,表示する */ { ???????} int add2(int i) /* i に1を加えた値を返す */ { ??????? } void add3(int *p) /* ポインタの指す値に1を加えて,表示する */ { ??????? } ????の部分を埋めてください。
297 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 15:17:57 ] そういうのは宿題スレへ pc11.2ch.net/test/read.cgi/tech/1191937213/
298 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 16:09:03 ] VS2005でC言語の勉強をしています。 char str[]="日本語"; のような感じで、文字列リテラルとしてUTF-8を指定することは可能でしょうか? ソースの文字コードをUTF-8にしても、strにはSJISのコードが入ります。
299 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 18:15:23 ] wchar_t str[] = L"日本語"; で UNICODE が使える。文字コードは処理系依存 どうしても UTF8 が必要なら変換するしかないと思う。
300 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 18:27:11 ] 配列を大量に使ってプログラム書いてるときに気をつけないといけないことはなに? 領域こえたらセグメンテーションでるのはわかる。
301 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 18:29:18 ] >>300 全然分かってないじゃん
302 名前:それはセグメンテーションフォルトだろう mailto:sage [2007/10/22(月) 18:30:41 ] >>300 おまえは何か勘違いしている。領域を越えたらセグメンテーションが出ると言うわけではない。
303 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 18:40:05 ] わかってないからきいてんじゃん
304 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 18:42:01 ] 配列を大量に使うプログラムにろくなのが無いこと
305 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 18:43:36 ] あれをリストで実装はできない
306 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 18:46:45 ] どんなアルゴリズム?
307 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 20:18:18 ] 配列好きだけど 総素数の最大数が分かっているときはリストなどより配列を使ったほうが プログラムは簡単になるし、性能もいいのができる。 ただし、以下のことは注意しなくてはいけない。 1.要素数の最大値が決まっていないとき 最大数を超えたときにリアロケートするという手もあるが、そういう時はリストにする。 2.中身がスカスカの配列 メモリーの無駄。メモリーが十分あればそれでも良い。 3.配列が確保できない スタック上に配列を作成するときはよくある。 こういうときはヒープは外部変数にとる。
308 名前:デフォルトの名無しさん [2007/10/22(月) 22:40:56 ] fgetsで入力のおわりを'\0'にする方法ってありますか? scanfだと空入力したとき結果が出ないし getsは禁止らしいので fgetsしか使う方法がないのですが・・・
309 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:43:06 ] >>308 >>273
310 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:40:50 ] >>308 fgetsで読み込まれた文字列の改行文字の後は'\0'です。 改行文字を含めたくないなら 273 の方法です…。
311 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:48:13 ] fgetsは自動的に\0で終わる 改行文字が付いてるのを気にしないなら何もする必要なし
312 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 01:06:28 ] img_data = (HOGE)malloc( sizeof( GEHO ) * img_height ); for ( int i = 0; i < img_height; i++ ) { img_data[i] = (HOGE)calloc( sizeof( GEHO ), 3 * img_width ); } とメモリを確保した場合、どのようにメモリを開放したらいいのでしょうか?
313 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 01:45:44 ] for ( int i = 0; i < img_height; i++ ) free(img_data[i]); free(img_data);
314 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 01:53:37 ] >>312 img_dataの型がよく分からないのだが…… img_dataもimg_data[i]も両方HOGE型てなんなん int **ar,i; ar = (int**)malloc(sizeof(int*)*HEIGHT); for(i=0; i<HEIGHT; ++i) ar[i] = (int*)malloc(sizeof(int)*WIDTH); こういうのをイメージしてるなら、こう↓ for(i=0; i<HEIGHT; ++i) free(a[i]); free(ar);
315 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 02:12:47 ] >>307 ありがとう。 種類の違うデータを二次元配列にいれたりしてるんだけど、 printfで表示させてもあっているのに、 あるアルゴリズムをかけると変な値がでるんだよなー。 ある空白の二次元配列の1行ずつに、違う二次元配列の1行ずつを代入して 足し算していくような感じのプログラムなんだけど。 計算が対数計算だから場合わけが非常に精密にしないとだめなんだよね。
316 名前:312 mailto:sage [2007/10/23(火) 02:13:07 ] ありがとうございます。 img_dataを開放しても、img_data[i]は開放されないんですね。
317 名前:プリンがー mailto:aaa [2007/10/24(水) 00:15:56 ] 1から10の2乗を3桁で表示するプログラムを作れ。 #include<stdio.h> void main (void) { int x i; double y; for(i=0;i<=9;i++){ printf("数値を入力して下さい"); scanf("%d",&x); y=x*x; printf("y=%3lf\n",y); } return0; } であってますか?
318 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 00:24:43 ] >>317 10の二乗は? というか、実行すればいいだろ
319 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 00:28:55 ] >>312 exit(0);
320 名前:318 mailto:sage [2007/10/24(水) 00:29:56 ] >>317 ごめ 間違えた #include<stdio.h> int main(void) { int i, x; for(i=1;i<=10;i++){ printf("%d の二乗を入力して下さい : ", i); scanf("%d", &x); printf("%3d\n", x); } return 0; }
321 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 01:00:02 ] printf("%3d\n", x); printf("%3d\n", x); printf("%3d\n", x);
322 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 02:18:57 ] コマンドプロンプトでコンパイルするような 無償コンパイラが欲しいんですがないですか?
323 名前:デフォルトの名無しさん [2007/10/24(水) 02:20:05 ] 問題に反してるだろ?1〜10の二乗を表示なのに、11以上の二乗も表示できるようになっとるぞ?フローチャートなどで考えたらどうだ?ただプログラムを組むだけでは、上達しないよ。
324 名前:318 mailto:sage [2007/10/24(水) 06:12:02 ] >>322 MinGW Visual C++ 2005 Express Lcc cint LSI-C86 評価版
325 名前:318 mailto:sage [2007/10/24(水) 06:13:11 ] printf("%d の二乗を入力して下さい : ", i); scanf("%d", &x); ↓ x=i*i;
326 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 10:29:58 ] >フローチャートなどで考えたらどうだ? なるほど、>323のようになれると。
327 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 12:04:28 ] >>322 Turbo-C 2.01 ttp://bdn.borland.com/museum/ お薦め。
328 名前:プリンがー mailto:aaa [2007/10/24(水) 12:29:22 ] プログラム演習の初心者からできるいい問題集ありませんかね? 大学生協は置いてなくて・・・ 講義では問題解くってことはしないのでorz
329 名前:318 mailto:sage [2007/10/24(水) 12:41:42 ] >>328 推薦図書/必読書のためのスレッド 37 pc11.2ch.net/test/read.cgi/tech/1190192944/
330 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 12:42:28 ] Boland C++ Compiler が抜けてるな
331 名前:プリンがー mailto:aaa [2007/10/24(水) 12:53:45 ] >>318 プログラムってどこで実行できるんすか??
332 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 12:54:43 ] NG
333 名前:takumi [2007/10/24(水) 14:13:59 ] XPでvisualstudioを使ってます。 問題:長さ100のint型配列 int a[100]がある。a[0]〜a[99]には整数が収められているする。 この100個の中で一番小さい数を求め、画面に出力するプログラムを作成せよ。 出力形式は「ans.=???」とせよ。???の部分は答え。 なんですが、全くわからないので教えて下さい。。
334 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 15:08:21 ] 宿題スレへ pc11.2ch.net/test/read.cgi/tech/1193150915/l50
335 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 16:24:03 ] コテ付目欄空欄… どこの中学生掲示板だよ
336 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 17:59:26 ] つか入力がわかっているのになぜscanfを使う必要あるんだよ。
337 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:19:58 ] 未経験ということでソフトウェア開発企業に入社したんだけど、whileのところで早速詰まった('A` 0〜9 までの数字を、0 から1個ずつ増やしながら 10行表示しなさいっていうプログラムを作るんだけど、 0 01 012 0123 01234 012345・・・ とはならずに 0 1 2 3 4 ってなっちゃいます。というかそういう風に書いてるのもわかるんですが、 #include <stdio.h> int main(void) { int a = 0; a = 0; while(a < 10) { printf("%d\n" ,a); a++; } return 0; } ↑whileの中をどうすればいいんでしょう・・・。
338 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:26:55 ] while(a < 10) { int b = 0; while(b <= a) { printf("%d", b); b++; } printf("\n"); }
339 名前:デフォルトの名無しさん [2007/10/24(水) 21:29:01 ] #include <stdio.h> int main(void) { int a,b; for(a=0;a<10;a++) { for(b=0;b<=a;b++)printf("%d" ,b); printf("\n"); } return 0; }
340 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:32:40 ] >>338 ああああありがとうございます! whileの中にwhile使うとは盲点。 流れも理解できましたありがとうございます!
341 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:35:51 ] >>340 for文を使ったほうがベター
342 名前:デフォルトの名無しさん [2007/10/24(水) 21:38:14 ] そこまで出来ないでよく仕事になるな 入って2週間以内とかか? それならいい
343 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:38:43 ] >>341 そうなんですよね。 他にもwhileを使って、2個入力した文字列が、同じ文字列かどうか判断するプログラムを作ったんですが、 ifelse使った方が手っ取り早かったり、一応基本中の基本ということで頑張ってますが、 とりあえずとことん覚えてみようと思います。
344 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:40:48 ] >>342 まだ3日目です('A`)('A`)('A`) 初日はOSインスコとかパソコンに関する事を教わって(というか何回もやってきた事なので余裕でした) 二日目は%dやらfloat=小数点やら、long=スゲーでかい数とか、配列とかを覚えて 本日三日目でif else for を覚えたんですが、whileがなんかスゴイ曲者というか、問題がクセものでてんてこ舞いです。。。
345 名前:デフォルトの名無しさん [2007/10/24(水) 21:44:45 ] >>343 実戦力高めるならSTLだな たとえば2つの文字列比較するならこうやればいい #include <iostream> #include<string> using namespace std; main(){ string a,b; a="こんにちは"; b="こんばんわ"; cout<<a<<" と "<<b<<"は "; if(a==b)cout<<"一致"; else cout<<"違う"; }
346 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:59:46 ] 行列を計算するときにライブラリって使えるの? 固有値を求めたいんだけど。
347 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 22:09:40 ] >>345 初心者(それも++じゃなくてCっぽい)にそんなこと教えたら、 同じ文字列が入ったchar配列を==比較して「あれ? 同じのはずなのに……」てことになるぞ
348 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 22:16:49 ] >>346 標準ライブラリーにはない 特殊な科学技術計算用のライブラリーを手に入れるか、自作するか
349 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 08:26:44 ] >>346 clapack
350 名前:デフォルトの名無しさん [2007/10/25(木) 22:25:22 ] typedef struct{ int hoge; int hage; int hige; int huge; } HOGE; と言う構造体があるとして、hoge = 1; hage = 0; hige = 1; huga = 1;となっているとします。 その構造体の中で、値が"1"になっている物を見付けたいのですが、そういうことはできないですか? 構造体内の変数の値を調べ、それが条件にあっていれば別々の処理をしたいです。
351 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 22:28:28 ] Cじゃムリ。 リフレクションのある言語ならできる。
352 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 22:39:37 ] 意味がわからんぽ メンバ名で参照したくないって事? 構造体先頭からのオフセットでアクセスするとかかな
353 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 22:50:11 ] >>350 配列にしない(できない)理由はあるの? typedef union{ struct{ int hoge; int hage; int hige; int huge; } int array[4]; } HOGE;
354 名前:350 mailto:sage [2007/10/25(木) 22:57:44 ] >>353 なんですかそれは… 始めてみました。 意味がちょっとわかりません… その形にしておいて、 HOGE u_hoge; .... u_hoge.array[0]にしたら、hogeにアクセスできるって事ですかね?
355 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 22:58:37 ] 共用体でググってくるんだ!
356 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 23:55:24 ] だんだんと解ってくると、プログラム書くのが面白くなってくるなぁと思った超初心者な俺。
357 名前:デフォルトの名無しさん [2007/10/26(金) 00:26:59 ] fgetsで入力した後'\n'を消す方法はありますか? あまりポインタは使いたくないんですが・・・
358 名前:aho mailto:sage [2007/10/26(金) 00:29:26 ] >>350 構造体のポインタを利用してみました。 #include <stdio.h> typedef struct{ int hoge; int hage; int hige; int huge; }HOGE; int main(){ HOGE* hogep = NULL; try{ hogep = new HOGE(); }catch(...){ printf("new error!\n"); } /* メンバ変数の初期化 */ hogep->hoge = 1; hogep->hage = 0; hogep->hige = 1; hogep->huge = 1; printf("%d\n", hogep->hoge); return 0; }
359 名前:デフォルトの名無しさん [2007/10/26(金) 00:40:51 ] >>357 fgets(buf, n, fp); if (buf[strlen(buf) - 1] == '\n') { buf[strlen(buf) - 1] = '\0'; } ・・・?
360 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 00:44:21 ] >>357 fgets(buff, sizeof buff, stdin); for(i=0; buff[i]; i++) if(buff[i]=='\n') { buff[i] = '\0'; break;}
361 名前:デフォルトの名無しさん [2007/10/26(金) 01:39:24 ] C++Compiler / Turbo Debugger をzipから解凍したらフォルダに何も入ってなかったんだけど・・・ どこでパス入力するの?
362 名前:教えてください mailto:sage [2007/10/26(金) 03:23:34 ] C言語についての質問です。 下記の素数か素数でないか調べるコードで、 @変数名にis_primeとありますが、isは何を意味しているのですか? Ais_prime = 1;とするのがわかりません。 B以下、return 0; まで、どういう流れかわかりません よろしければ1行ずつ教えてもらえるとうれしいです。 #include <stdio.h> int main(void) { int num, i, is_prime; printf("判定したい数を入力してください: "); scanf("%d", &num); /* 約数があるかどうか調べる */ is_prime = 1; for(i=2; i<=num/2; i=i+1) if((num%i)==0) is_prime = 0; if(is_prime==1 && num > 1) printf("素数です"); else if (num > 1) printf("素数ではありません"); return 0; }
363 名前:デフォルトの名無しさん [2007/10/26(金) 03:44:59 ] num is_prime なんだろ
364 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 08:08:18 ] >>362 適当な数字入れて処理追いかけてみろよ。
365 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 08:13:38 ] なんにもわかってないってことかよw
366 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:02:57 ] >>362 You is fool.
367 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:26:14 ] >>361 解凍しなおしてみたら?
368 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 12:54:26 ] You are Shock!
369 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:24:17 ] atofとか解読できなさそうだな
370 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:55:39 ] 数値計算において 不等号の>>と>の判別ってプログラム的にどうすべきですかね? 計算は対数でするんだけど。
371 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 14:35:43 ] 差が閾値を越えるかどうかで判定 もしくは比が閾値を越えるかで判定
372 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 15:09:54 ] その問題では>>と>=で計算方法違うんだよ。 今計算してみると対数の値をexpかけてみて値をみていくと 値がかわってくるのが差が10から15あたりのときみたいだから 閾値を15で計算をかえてみることにするわ。
373 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 15:49:02 ] for(;loc<100;loc++){ if(loc<100){ printf("氏名を入力して下さい(空白で終了):\n"); fgets(data[loc].namae,39,stdin);←この行 if(!*data[loc].namae)break; printf("電話番号を入力して下さい:\n"); fgets(data[loc].denwa,39,stdin); printf("市外局番を入力して下さい:\n"); fgets(str,9,stdin); data[loc].sigai=atoi(str); } } 上の行のfgetsをgetsに変えるとEnterでbreakするんですけど fgetsのままでは動作しません。どうすればfgetsのままで動作しますか?
374 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:10:04 ] >>367 何回解凍しなおしてもダウンロードしなおしても空… zipファイルはちゃんと容量あるのに解答してできたフォルダには容量が全くなくなる。
375 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:15:36 ] >>374 解凍ソフトは何? パス付きに対応してないやつなんじゃね?
376 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:17:32 ] >>373 fgetsは改行も取り込むから、 fgets(data[loc].namae,39,stdin); if(data[loc].name[0] == '\n') break; これでおk
377 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:26:35 ] >>376 出来ました。ありがとうございます。
378 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:30:47 ] fgetsの解説ですが ohmoriws1.ms.kagu.tus.ac.jp/1997/sotsuken/miyakosi/c04.html ここは間違ってる?もしくは誤解される様な感じなのですか・・? 一度参考にしたんですが・・。
379 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:46:34 ] >>378 '\n'を取り除くとも書いてないから間違いとは言えない。 しかし、その直後のfputs()の説明が間違っているから信用できない。
380 名前:デフォルトの名無しさん [2007/10/26(金) 17:20:43 ] すいません超絶初心者な僕に教えて頂きたいことがあるます 1行64バイトのファイル(行数可変)のデータに何回も文字列の検索を行ういアウトプットするプログラムを作っています。 fgetsを使い何回もファイルを読み込んで一行ずつ比較するというようにできたにはできたのですが、 行数可変で多い場合100000行超えたりするファイルに対してはえらい時間がかかります。 メモリにぶちこんでそこから何回も検索を行いたいと思うのですが、どう組んだらいいでしょうか。
381 名前:これ参考に [2007/10/26(金) 17:37:47 ] #include <stdio.h> #include <time.h> #include <string.h> int N; void serch(char* x,char* str,int* adr){ char t[256];int n,M,k,su=0; for(M=0;;M++)if(str[M]=='\0')break; for(n=0;n<256;n++)t[n]=M; for(n=1;n<=M;n++){k=(unsigned char)str[M-n];if(t[k]==M)t[k]=n;} n=0;while(1){ for(k=0;k<M;k++)if(str[k]!=x[n+k]) break; if(k==M){adr[su]=n;su++;n+=M;} else {k=(unsigned char)x[n+M];n+=t[k];} if(n+M>=N){adr[su]=-1;return;}}} main(){ N=18000000;char *x=new char[N];N=0; char buf[120],k,n; FILE *fp=fopen("2ch.txt","rb"); while(k=fread( buf,1,100,fp)){ for(n=0;n<k;n++)x[N+n]=buf[n];N+=k;} fclose(fp); printf("データロード完了!\n測定中です・・・\n"); int adr[30000]; char str[]="名無し"; serch(x,str,adr); }
382 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:07:20 ] >>381 変数の使い方、変数の名前が気持ち悪い >>380 malloc,realloc使うべし
383 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:08:40 ] あ、いや、バイナリならftellとfseekでサイズが分かるから、 reallocはいらないやも
384 名前:デフォルトの名無しさん [2007/10/26(金) 18:24:22 ] >>381 さん ありがとうございます >>382 さん mallocを使った場合どのように組めばいいでしょうか?
385 名前:デフォルトの名無しさん [2007/10/26(金) 18:35:14 ] 一番簡単な方法おしえてやる
386 名前:デフォルトの名無しさん [2007/10/26(金) 18:36:04 ] >>375 ありがとう。 解凍ソフト変えたらできた。
387 名前:デフォルトの名無しさん [2007/10/26(金) 18:53:06 ] #include <iostream> #include <string> #include <fstream> using namespace std; int main() { fstream fp("test.txt"); string str,buf; do{ fp >> buf; str+=buf; }while((!fp.eof())); int n=str.find("会議"); cout << n; }
388 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:53:49 ] >>381 だからその入力ロジックを何とかしろって
389 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 19:06:04 ] >>384 適当に書いた例だけど FILE *fp; char *data; ... //省略 data = (char*)malloc(sizeof(char) * 128); /とりあえずchar128個分確保 if(data==NULL) return 1; //エラー処理 int i=0,size=128; while((data[i] = getchar()) != EOF){ if(++i >= size){ char *tmp; tmp = realloc(data,sizeof(char) * (size + 50)); //50ずつ拡張 if(tmp == NULL){ /* reallocは元の領域を解放するが、失敗時は解放せずにNULLを返す そのため、失敗時に解放できるように、別変数で一度戻り値を受けてから、エラーチェックする */ free(data); //mallocやreallocで確保した領域は必ず解放する return 1; } else { data = tmp; size += 50; } } } free(data) //必ず解放
390 名前:デフォルトの名無しさん [2007/10/26(金) 20:26:58 ] #include<stdio.h> int A; int B; void X(int a[],int b[]){ printf("%d",a); printf("%d",b); } void main(void){ //省略 X("A","B"); 質問させてください 変数A Bを引数使って表示させたいんですけど、コマンドプロンプト?で実行させると警告がでてちゃんと表示されません。 どうすればいいでしょうか? 説明不足ですみませんがよろしくお願いします
391 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 20:29:39 ] 関数の引数としてポインタを渡して、そのポインタの変数に値をいれているのですが、 関数を呼び出す時によって、値をいれる必要が無いときがあります。 不要な値のために変数を宣言したくないのですが、変数を宣言しないでいい方法などはありませんか? hoge( &x, &y, &height, &width); と呼び出すのですが、&heightと&widthの結果を使わないときもあるので、 int x, y; だけ宣言して、heightとwidthは変数宣言したくないと思っています。
392 名前:デフォルトの名無しさん [2007/10/26(金) 20:30:26 ] 型がヘンすぎる 勉強不足
393 名前:デフォルトの名無しさん [2007/10/26(金) 20:31:42 ] >>391 C++は入れない場合も同じ名前に出来る 2つ書けばいい
394 名前:デフォルトの名無しさん [2007/10/26(金) 20:33:40 ] int hoge( a, b, c, d);を定義して たとえばcとdを使わないなら、hoge( a, b) { return hoge( a, b , 0 , 0);}
395 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 20:34:45 ] >>391 NULL を使えばいいと思うよ >>393 ここはC言語のみ C++なら誘導してからにしてください
396 名前:391 mailto:sage [2007/10/26(金) 20:39:55 ] >>393 すみません、C言語です。 >>394 すみません。 私が関数ではないため動作が変えれないのと、不必要な値は6この引数のうち、 1, 2, 5が不要になったりする場合もあります。 >>395 すみません。 NULLを使うと言うのは、どのようにすればいいのでしょうか? 型を、castするという意味でしょうか?
397 名前:391 mailto:sage [2007/10/26(金) 20:48:00 ] 連続投稿失礼します。 hoge( &x, &y, NULL, NULL); とすれば、コンパイルは通ったのですが、これは正しいのでしょうか? 簡単に動作を説明して頂けるとありがたいです。
398 名前:デフォルトの名無しさん [2007/10/26(金) 20:50:47 ] >>397 動作はNULLで通るように自分で書かなければ行けない
399 名前:391 mailto:sage [2007/10/26(金) 21:26:43 ] >>398 > 自分で書かなければいけない と言うのは、関数をそのように修正すると言うことでしょうか? 関数は自分で作ったもので修正はできないと思います。
400 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:27:56 ] >>399 NULL の指す先を読み書きしないようにするだけ
401 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:00:33 ] >>399 hoge()の仕様がわからないと、引数でNULLを渡していいかどうかは判断できない。
402 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:44:08 ] heightとwidthは>>391 が使わないというだけでhogeは内部で値を設定しようとするからNGだと予測する俺エスパー
403 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:51:54 ] まともな関数ならチェックしてるだろうけど・・・
404 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:01:40 ] 昔はチェックしてたけど不定値渡されて以来チェックするのをやめた
405 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:10:28 ] >>404 あなたが hoge() か
406 名前:デフォルトの名無しさん [2007/10/27(土) 00:15:31 ] #include <stdio.h> int f(int &x){ if(&x==NULL) return -1; return x+10;} int main(){ int x=0; printf("%d\n",f(x));}
407 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:23:05 ] >>406 それじゃポインタ渡した意味な(ry
408 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:29:32 ] -1がreturnされることってある? てか参照渡しってCで使えるの?
409 名前:デフォルトの名無しさん [2007/10/27(土) 00:38:22 ] #include <stdio.h> int f(int *x){ if(x==NULL) return -1; return *x+10;} int main(){ int x=0; printf("%d\n",f(NULL));}
410 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:42:57 ] それがどうしたと言わざるをえない
411 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:45:11 ] assert(p != NULL); で十分。
412 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:50:42 ] assertと引数チェックは違うんだぜ・・・
413 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:30:01 ] 引数チェックが一番の使いどころだろ > assert()
414 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:34:02 ] >>413 へぇ、永遠のデバッグビルドか
415 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 09:58:07 ] >>414 sunも引数チェックにassert使えって言ってるよ。
416 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 10:40:38 ] それは引数を渡す方も一緒に開発してる時だろ 内部的なエラーでも無い限りNULLになる事はありえない前提
417 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 11:38:55 ] 自分で作ってるライブラリじゃなくても、仕様にNULLを渡した時の動作が書いてなかったら、 NULLを渡すなんてありえない。
418 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:10:15 ] 引数チェックはやって当然。
419 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:15:39 ] 両方書いておけばおk
420 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:20:57 ] ポインタで渡される引数のチェックって NULL比較?
421 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:39:12 ] mallocとかポインタがわけわかりません。 図とかでイメージしやすく解説してください
422 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:44:10 ] >>391 カリー化
423 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:45:58 ] >>421 本読め
424 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:46:25 ] mallocって char *str; /* 文字列のためのメモリを確保 */ str = (char *)malloc(100); こんな感じに書いてるけど char str[100] ってやった方が楽じゃん。なんでmallocなんて使うの?
425 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:49:17 ] >>391 型が分からなかったので適当に決めた int hoge_wrap(int *x, int *y, int *width, int *height){ int dummy=0; if(x==NULL) x=&dummy; if(y==NULL) y=&dummy; if(width==NULL) width=&dummy; if(height==NULL) height=&dummy; return hoge(x, y, width, height); }
426 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:50:10 ] >>424 必要ないなら無理して使わなくても良い物です
427 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:52:55 ] >>426 無理して使えるようになるためにおせーてよ 何か新天地が開けるかもしれないじゃん というか教えてくださいお願いしますガンダム見ませんから
428 名前:デフォルトの名無しさん [2007/10/27(土) 17:56:59 ] newやvectorつかえば十分 性能も変わらない
429 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:58:13 ] char型で考えるから分かりにくいことになる。
430 名前:デフォルトの名無しさん [2007/10/27(土) 18:00:08 ] char だと領域確保に制限がある new mallocは巨大なのが出来る
431 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:00:14 ] newやvectorがわからないっす
432 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:04:55 ] >>427 char array[100]; のかわりにchar *p; p=(char*)malloc(100);を使うとき 1.配列のサイズが未定のとき 実行時にしかか配列のサイズ(この場合100)がわからないとき 2..配列のサイズが大きすぎて内部変数として確保できないとき 外部変数を使うという手もある
433 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:05:28 ] ここって C++ ありだっけ?
434 名前:デフォルトの名無しさん [2007/10/27(土) 18:09:53 ] char型だと巨大配列を確保できない #include <iostream> #include <vector> using namespace std; #define N 10000000 main(){ int *x; x=new int[N]; vector<int> y; y.reserve(N); // char z[N];z[0]=1; for(int n=0;n<N;n++)x[n]=y[n]=1; printf("%d",x[0]);}
435 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:10:55 ] >>433 なし
436 名前:デフォルトの名無しさん [2007/10/27(土) 18:11:16 ] mallocとnewに性能の違いはなく、vectorはちょっと高性能でちょっと動作に負担がかかる
437 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:30:06 ] (ノ∀`) アチャー
438 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:58:41 ] >>418 状況による。 たまにいる、必ずやるってやつは素人。
439 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 19:23:20 ] >>424 配列サイズが分からなかったり、途中で増える可能性がある時に使う
440 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 19:35:21 ] >>438 やらないとLintに叱られます
441 名前:プリンがー mailto:aaa [2007/10/27(土) 19:55:12 ] 問題を解く時、まず問題を見て引数があるかないかってどうやって分かります?
442 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:02:57 ] 問題ってのが仕事上の問題なのか学校で先生に出された問題なのかによる
443 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:03:16 ] エスパー!! エスパー!!
444 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:07:27 ] >>440 そんなlintありません。
445 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:21:30 ] >>434 スタックサイズを増やせばおk ま、普通はポインタにして malloc するがな
446 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:37:47 ] >>424 char str[100] の[]の中に変数を入れるとコンパイルエラーになるが、 mallocだとそれができます。
447 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:42:54 ] コンパイラによってはエラーにならないけどな
448 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:55:01 ] C99
449 名前:プリンがー mailto:aaa [2007/10/27(土) 22:06:09 ] >>442 学校で先生に出された問題ってか演習問題とか
450 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:11:41 ] >>449 コンピュータじゃないんだから人間的に考えればいいと思うよ
451 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:16:35 ] 入力として必要なものは引数なんじゃね
452 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:19:56 ] 1 getchar() を用いて 1 文字入力を行い、Ctr+Z が入力されるまで次の処理を繰り返しなさい。 大文字、小文字に関係なく、アルファベットを入力した場合には、それぞれの入力した個数を数えなさい。 2. 1. の処理終了後、アルファベットをそれぞれ何個ずつ入力したか出力しなさい。 これなんですがどう頑張っても意味不明です・・・ ヒントとして ?入力アルファベットの個数を数えるカウンタは大きさ 26 の配列で用意。 最初に、配列の 26個の要素すべてを0クリアすること。 ?A〜Z、a〜z は ASCIIコードの 65〜90、97〜122 に該当することを考えれば、配列の何番目をカウントUP するかは計算で求められるはず。 実行結果 入力文字 14abcaaabccdzzgk(リターン) aabc147cab8cc3c(リターン) CTRL+Z(リターン) とすると a = ○○個 b = ○○個 c = ○○個 改行 d = ○○個 e = ○○個〜〜〜 と一覧を出力させたいんです。 とあるんですが、どう書いたらいいんでしょうか・・・('A` switch使ってみたりしたんですが、イマイチ意味がわからなくなってきました・・・。 ちなみに今まで習った事は、 if if else for while break continue goto 算術関数 strcpy等、 等の初歩的なことだけです。。。
453 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:22:10 ] >>452 宿題スレ行け
454 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:25:32 ] どこがわからないのかが分からないが 65-65は0 90-65は25 97-97は0 122-97は25 ってことじゃね
455 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:25:45 ] 今まで習った事の中にgotoがあるのが気になる・・・ 普通初心者にgotoは教えないだろ
456 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:25:56 ] >>152 宿題スレに行け……と言いたいところだがヒントをやろう 'a'-'a' == 0 'z'-'a' == 25 'A'-'A' == 0 'Z'-'A' == 25
457 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:29:12 ] goto嫌いな人ってbreakとかcontinueとかも嫌い?
458 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:30:44 ] goto が嫌いな理由は goto に過剰反応する人を呼ぶ事
459 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:33:50 ] gotoが嫌いというよりは、(gotoを)初心者に教えるのが嫌い
460 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:56:35 ] あーいえA=65とかで、考え方としては、 scanfで変数cに文字を入れた場合、変数cから65を引いた数、例えばAなら65で0となり、Cなら67で2となり、 配列a[26]の[]内をcとして、そこに+1づつカウントしていく というのはわかるんですが、 どう書いていいのかチンプンカンプンなんです・・・。 そもそもgetcharって1文字入力なのに演習問題の実行例には abcdddef14(return) afijjgjkk(return) CTRL+Zってなっててなんで文字列での入力になってるんだろうとか思ったり('A` ちなみにgotoは多段ループから強制的に抜けたい場合にのみ使ったほうがいいかもしれないけどオススメはできないとも書いてありました。
461 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:01:19 ] あ、ちょっと頑張って書いてみます。 なんとなくわかりかけたかも・・・? ちなみにC言語学んでからまだ5日目です('A`
462 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:03:27 ] getcharで一文字ずつ取り出す 意味のある文字はアルファベットとCTRL+Z。 それ以外の(return)とか数字とかは無視すればいいんじゃね? CTRL+Zはなんだっけ・・・EOT?
463 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:09:23 ] >>462 whileでのgetcharでのループから抜け出すための CTRL+Z=EOF っす。 a と入力して、画面に a = 1個 と入力させるのはかけるんですが、 abcと入力した場合は配列使うと思うんですが、まずそもそも getcharでabcの場合 while ((c = getchar()) != EOF) //cは配列 配列に入力 CTRL+Zを押すとwhile終了。 でc[]にc[0]=a c[1]=b c[2]=cとなる・・・の?あれ理解しかけてきました。 ずっとc[0]にabcとなると思ってました・・・。 文字列の場合はgetsになるんですね、このすぐ先に習う項目にgetsあってみてみたら文字列って書いてあってアッーって思いました。
464 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:10:57 ] 勘違いしてるっぽい
465 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:12:50 ] ・「abcと入力した場合」でもgetcharは「a」を入力した時点で抜けてくる ・c = getchar()のcは配列である必要ない のはず・・・
466 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:20:45 ] ナンダッテー! 見た目的には a と打ち込むだけでは エンターを押さない限り文字入力待機画面になってるんですけど、(上記問題の場合はwhileなので文字→エンター→入力待機→文字→エンター→入力待機となるのはわかります) 内部的には処理されているということですか? aだけ押す、エンターは押さない→画面には入力待機状態であるが、内部的には処理されている? ちょっとやってみまつ。
467 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:24:39 ] 内部的にどのタイミングで処理してても、変わらないんだが。
468 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:26:04 ] ということはgetcharでabcdefと入力した場合は aからfまで順に1つ1つ処理していくということになるんですか?
469 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:30:56 ] while ((c = getchar()) != EOF) { puts("なんか入力された\n"); }
470 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:34:00 ] エンターを押した時点で処理が開始されるが、文字列をまとめてじゃなくて一文字ずつ読み込む
471 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:35:44 ] #include <stdio.h> int main(void) { int c; while ((c = getchar()) != EOF) { printf("%d\n" ,c); } return 0; } 出力した結果、>>470 さんの言ったとおり、例えばAAA(リターン) の場合綺麗に65656510と表示されました! これで問題に取り組んでみたいと思います! ありがとうございます!!!
472 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:37:46 ] あれ?Enter待ちになるのか/(^o^)\ 引っ込んでようorz
473 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:40:34 ] いえいえ、協力してくれようとしてくれただけでも感謝感激雨霰です。 皆さん本当にありがとうございました。
474 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:41:46 ] 霰が霧に見えた orz
475 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 09:44:07 ] goto嫌いな人が do{}while(0) で break を使っているのを見て泣けた。
476 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 11:44:11 ] VisualStudio2008で作ったプログラムなんですが、 重複したシンボルがある(?)とか怒られてて困っています 原因がわかる方いませんか?おねがいします www.uploda.org/uporg1085799.zip.html 一応ファイルをうpしました
477 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 11:56:55 ] >>476 マルチうざい
478 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 13:19:04 ] >>476 どのシンボルが重複してるかまで表示されてるだろ? それが重複してるんだよ。
479 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 13:41:16 ] >>478 ありがとうございました。よく見たら書いてました。
480 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 15:03:31 ] 2バイト文字の扱いがよくわからないです 例えば、配列の中身を順に表示させようと思っても文字化けします array[11] = {"しーげんご"}; Shift-Jisとかに変換してから使うんですか?
481 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 15:17:35 ] >>480 > 配列の中身を順に・・・ 1バイトずつの表示はできない。
482 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 15:30:49 ] >>481 そうなんですか・・・ じゃあ半角英字みたいに平仮名でも文字コードに数字を足して 次の文字へ!みたいな処理はできますか
483 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 15:54:37 ] なんの文字コードを使っているのかわからないが、 いちど使用している文字コードの文字コード表を見ることを薦める。 ちなもに、S-JISでは、「あ」「い」「う」は,それぞれ,0x82a0, 0x82a2, 0x82a4
484 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 16:02:41 ] >>483 調べてみたんですが、SーJISで「あ」を表示させるには %cを2回と0x82,0xa0をつかって表示させると書いてありました。 ほかの表示方法は見つけられなかったのですが、ありますか?
485 名前:452 mailto:sage [2007/10/28(日) 17:12:30 ] 無事できました! が、次の問題で一点引っかかる事が('A` 終了条件eまたはEってどういう風に記述するんですか? while(gets(str) != ○○) の○○にeかEを入力した場合で終了という風にしたいのですが・・・。 'e' とか'E'は駄目みたいです。
486 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 17:13:57 ] なんでgetsになってんの?
487 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 17:17:56 ] あ、ごめんなさい。 習う順番でgetchar+putchar → gets+putsという風になってて 問題が、 gets() を用いて、テストの点数を文字列として入力しなさい。 上記処理中、eかEを入力した場合は下記処理をスキップさせ、内容を出力せよ っていう問題なんです。 考え方としては、今まで習ってきたように ○○が入力されるまでは処理を続けるというwhileループでの処理だと思うんですが・・・。
488 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 17:21:55 ] 文字列の中に'e'か'E'があるかどうかをチェックする
489 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 17:33:29 ] ありがとうございます>< int変数aというものを新たに用意し、 getsで入力した中に、a = 'e' か a='E' での判定を入れたら無事とおりました><
490 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 19:18:39 ] どうしてもwhile内で済ませたかったら、 while(gets(str)[0] == 'E') とか? 試してないけど NULLが返ってきた時に危険だなw
491 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 19:42:10 ] ttp://a-draw.com/contents/uploader2/src/up0121.txt できたました! こんな長い(すごい短いんだろうけど・・・)の書いたの初めてです・・・。
492 名前:デフォルトの名無しさん [2007/10/28(日) 19:47:06 ] 3つの整数値を読み込んでそれらの値がすべて等しければ「3つの値は等しいです」と、 どれか2つの値が等しければ「2つの値が等しいです」と、そうでなければ「3つの値が異なります」と表示するプログラムをつくりなさい #include <stdio.h> int main(void) { int n1,n2,n3; printf("整数A"); scanf("%d", &n1); printf("整数B"); scanf("%d", &n2); printf("整数C"); scanf("%d", &n3); if(n1==n2==n3)printf("3つの値は等しいです"); else if(n1==(n2||n3)) printf("2つの値は等しいです"); else if(n2==(n1||n3)) printf("2つの値は等しいです"); else if(n3==(n2||n1)) printf("2つの値は等しいです"); else printf("3つの値は異なります"); return(0); } このように組んで整数Aに1整数Bに2整数Cに3を代入すると2つの値は等しいですと表示されてしまいます 問題点を教えてください><
493 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 19:53:17 ] n1==n2==n3 は n1==(n2==n3) で、意味が違う。 n2||n3 n2||n1 n1||n3 は、それぞれ両方0のとき0、それ以外だと1になる。
494 名前:デフォルトの名無しさん [2007/10/28(日) 19:55:04 ] #include <stdio.h> int main(void) { int n1,n2,n3,k=0; printf("整数A "); scanf("%d", &n1); printf("整数B "); scanf("%d", &n2); printf("整数C "); scanf("%d", &n3); if(n1==n2)k++; if(n1==n3)k++; if(n2==n3)k++; if(k==3)printf("3つの値は等しいです"); else if(k==1)printf("2つの値は等しいです"); else printf("3つの値は異なります"); }
495 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 19:56:48 ] 問題点を聞かれてるのに、俺プログラムを自慢されても困る
496 名前:492 [2007/10/28(日) 20:05:56 ] >>493-494 ありがとうございました。||の使い方をかんちがいしていました。。。
497 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 20:33:46 ] >>491 なんか無駄が多い気がするが、まあそれは眼をつむっておこう だがgetsの入力先配列が要素数2てのは……誤入力もあるだろうし、せめて256くらい確保した方が良い気がする というか、要素数2だとヌル文字入らないじゃん(というか100も入らないし) atoiってヌル文字入らないと変な動作になることあるはず
498 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:06:24 ] >>497 むむ、 getsでの取得は 例えば入力が50なら、charだから配列[0]に50 で配列[1]に\0が入る=2個で足りるってことじゃないですか? もしgetsでの取得変数がintの場合なら点数最大100(つまり3桁)は最低でも[4]になるのはわかります。 まぁでも、教えてもらっている人にも、配列は無駄でもいいから多く取った方がいいと教わりましたので、多くとる事を、この先心がけていきます! ありがとうございました!
499 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:21:49 ] ごめんなさいボクが馬鹿でした。 ためしにcharでの変数aに入力したものを、出力させるのかいてみて a[0]をやったら、最初の1文字しか出力されませんでした。 本当にありがとうございました。
500 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 22:56:33 ] int *foo int* foo の違いを教えてください>< 今までint *foo しか使ってなくて いきなりint* fooが出てきてわけわかりません><
501 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 22:57:42 ] >>500 次は int * foo だ
502 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:00:18 ] 宣言時のアヌスの位置くらい自由にさせてあげてください
503 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:03:21 ] いまだにforの無限ループを見ると悲しくなる( ; ; )
504 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:04:11 ] >>501 そんなのもあるのですか ソース解読してる途中にこんなの出てきてわけわからんのです すいませn助けてください。ほんと 何でグぐれ場いいのかもわからなくて すんません、マジで
505 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:07:39 ] >>504 int *foo; int* foo; int * foo; は全部一緒
506 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:09:54 ] ありがとうございます なんでこんな風に書き方分けてるのか
507 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:14:35 ] *は型名にも変数名にも使えないから問題ない
508 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:35:53 ] 初歩的な質問なのですが for(int i = size >> 1 ; ; i >>= 1) というループがあったのですが size >> 1 や i >>= 1 というのはどういう意味なのですか?
509 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:37:41 ] int*foo;もいけるんじゃない?
510 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:40:19 ] >>508 ビットシフト
511 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:44:55 ] >>508 のだとiをビットシフトするとどうなるんでしょう あとforの2つ目のところが空白なのもわけがわかりません
512 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:46:35 ] i >>= 1 すると i の各ビットが右へ 1 桁ずつずれる forの2つめが空白の場合は条件なしの繰り返し=無限ループ
513 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:53:43 ] >>511 iが10(2進数で1010)だとすると5(101)になる 5だとすると2(10)になる。その次はもう予想できるよな?
514 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 00:07:56 ] >>512-513 ありがとうお兄ちゃんたち!
515 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:18:22 ] >>506 俺は int* foo; のほうが好きかな 「int型へのポインタを返す」ってのをあらわしてる感じで
516 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:35:28 ] 俺は int *foo; のほうが好きかな int *foo, *bar; みたいに複数いっぺんに宣言するときわかりやすいし
517 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:35:53 ] しかしそれだと、2個目以下に*付け忘れる可能性がある。
518 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:37:09 ] 517は>>515 ね
519 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 02:21:33 ] 大きな配列の初期化って どうしていくべきですか? 100X100くらいの配列の
520 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 02:23:34 ] あんな風にしていくべきだと俺は思っている だがそういう風にするとああいうことも起きるわけでいちがいに どちらがいいとは判断しかねるな
521 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 06:11:01 ] ど素人におすすめの参考書を教えてください。
522 名前:380 [2007/10/29(月) 11:19:52 ] 先週質問させていただいた者ですが、mallocでどうしても組めません。 mallocでメモリに格納→格納した文字列を検索後抜き出す動作をもう一度ご教示いただけないでしょうか。
523 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 12:46:28 ] >>522 先ずは試しにfgets()版を見せてくれ。
524 名前:380 [2007/10/29(月) 13:16:03 ] >>523 void Hairetsu(void) { FILE *read; char fnameread[90]; char charline[90]; char KensakuName[20]; strcpy(fnameread, "*****.txt"); strcpy(KensakuName, "C3 10237"); StartTime = clock(); printf("%d\n", StartTime); while(KensakuCount < 10) { read = fopen(fnameread, "r"); if (read == NULL) { printf("ファイルがオープンできません\n"); exit(1); } while(1) { fgets(charline, 90, read); if (strcmp(charline, "ENDDATA\n") == 0){ ***ファイルは必ず最後の行にENDDATAと記載されています break; } if (strncmp(charline, KensakuName, 16) == 0) { ***ここで検索に引っかかった行から新たな要素を取り出して再度同ファイル内で検索をかけます ***その際にまた先頭行から読み直してfgetsを用いて検索をしこれをこのif内で3回程度繰り返えします。 } } fclose(read); } }
525 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 13:31:08 ] >>524 =380 「えらい時間」とあるけど、どれくらい掛かるの? 試しに>524相当のロジックを書いて10万と1行のファイルで動かしてみたが、1秒も掛からないんだが。
526 名前:380 [2007/10/29(月) 13:37:22 ] >>525 これを1行目から順に繰り返すので総読み出し回数は10万行^5になります。 それで更にその中に計算式が組み込まれていますので・・・・
527 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 13:45:24 ] >これを1行目から順に繰り返すので総読み出し回数は10万行^5になります。 >524からこれは読み取れないわけだがw つーか、それはそもそもアルゴリズムに問題がないか? オンメモリでもそれだけアクセスすればそれなりに遅いと思うぞ。
528 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 13:49:43 ] どうでもいいが、10万行^5は10^25だな。 仮に1nsで処理できる凄まじいコンピュータがあったとして、ざっと3億年掛かる計算だが。
529 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 14:58:18 ] ポインタ配列のキューに文字列を挿入するプログラムを作っているのですがうまくいかないです。 挿入後に現在入っているキューを全部表示するようにしたいのですが、最後に挿入した文字列しか表示されないです。 ちなみに変数opをint型に変えると期待通りに出力されます(intのscanfだと数値以外の文字も0と認識してしまうので使えない)が、 char型だとなぜこうなってしまうのでしょう? 実行結果(変数opがchar) Operation(0:enqueue 2:quit)0 input string : a String Queue : [a] head[0] tail[1] Operation(0:enqueue 2:quit)0 input string : b String Queue : [b] head[0] tail[1] Operation(0:enqueue 2:quit) 実行結果(変数opがint) Operation(0:enqueue 2:quit)0 input string : ab String Queue : [ab] head[0] tail[1] Operation(0:enqueue 2:quit)0 input string : bc String Queue : [ab] [bc] head[0] tail[2] Operation(0:enqueue 2:quit) 次レス以降にソースを書きます
530 名前:1/2 mailto:sage [2007/10/29(月) 14:58:49 ] #include "stdio.h" #include "stdlib.h" #include "string.h" struct structQ { char Q[5];}; int next (int x){ if(x==4) return 0; else return x+1; } void enqueue(char *s, int head, int *tail, structQ *AllQ){ if(next(*tail)==head) printf("OVERFLOW!\n"); else { strcpy(AllQ[*tail].Q, s); *tail = next(*tail); } } void printQueue(int head, int tail, structQ *AllQ){ int h; printf("String Queue : "); for(h=head; h!=tail; h =next(h)) printf("[%s] ", AllQ[h].Q); printf("\n"); }
531 名前:2/2 [2007/10/29(月) 14:59:25 ] int main (void){ structQ *AllQ; AllQ = (structQ *)malloc( sizeof(structQ)*(5) ); int head =0, tail =0; char *s, str[100]; char op; // int op; while(1){ printf("Operation(0:enqueue 2:quit)"); scanf("%s", &op); if(op == '0') // scanf("%d", &op); // if(op == 0) { printf("input string : "); scanf("%s", str); s = (char *)malloc( sizeof(char)*(strlen(str)+1) ); strcpy(s,str); enqueue(s, head, &tail, AllQ); free(s); printQueue(head, tail, AllQ); } else if(op == '2') // else if(op == 2) break;//終了 else printf("invalid ope number!\n"); printf("head[%d] tail[%d]\n", head, tail); } free(AllQ); return 0; }
532 名前:デフォルトの名無しさん [2007/10/29(月) 15:05:00 ] >>529 STL使っておけ vector< string > x; x.push_back("文字列"); x.push_back("名無しです"); x[0],x[1]で文字列にアクセスできる
533 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:09:27 ] >scanf("%s", &op); 文字列を入力したいんなら、char じゃだめだろ char には 1 文字しか入らない char の配列にしないと
534 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:11:49 ] >>532 突っ込みどころだらけ。 >#include "stdio.h" cの規格にあるインクルードファイルは""で括ってはいけません。 また、一般的にプロジェクトローカルなもの以外は<>で括るべきです。 >ちなみに変数opをint型に変えると期待通りに出力されます(intのscanfだと数値以外の文字も0と認識してしまうので使えない)が、 %d指定で整数値を入力する場合、入力に失敗した場合は変数が更新されないので、「0と認識してしまう」というのは間違い。 >scanf("%s", &op); 文字型への%s指定は行なってはいけません。%sはあくまでも、文字列入力です。 この呼び出しで恐らくスタック領域の破壊が起こり、他の変数の値がおかしくなったせいでキュー登録に失敗した可能性があります。
535 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:12:45 ] >>532 cにはSTLなどありません。スレタイも読めないくらい頭が回らないのであれば、無理に回答しなくて宜しいかと。
536 名前:デフォルトの名無しさん [2007/10/29(月) 15:26:38 ] >>533 opはオペレーションNoの取得なので、1文字です。 指定文字列の取得はchar str[100]に入れています。 >scanf("%s", str); >>535 1文字入力の%cで >scanf("%c", &op); と変えてみました。 キューには格納されているようですが、変な出力結果になってしまいます。 実行結果 Operation(0:enqueue 2:quit)0 input string : ab String Queue : [ab] head[0] tail[1] Operation(0:enqueue 2:quit)invalid ope number! head[0] tail[1] Operation(0:enqueue 2:quit)0 input string : bc String Queue : [ab] [bc] head[0] tail[2] Operation(0:enqueue 2:quit)invalid ope number! head[0] tail[2] Operation(0:enqueue 2:quit)
537 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:30:17 ] >>536 "%c"を" %c"にして味噌。
538 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:32:33 ] >>537 できました! ありがとうございます。 %cのスキャンにはスペースが必要なんですね。 実行結果 Operation(0:enqueue 2:quit)0 input string : ab String Queue : [ab] head[0] tail[1] Operation(0:enqueue 2:quit)0 input string : bc String Queue : [ab] [bc] head[0] tail[2] Operation(0:enqueue 2:quit)
539 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:35:11 ] >>524 ファイルのデータをすべてmallocで確保したヒープ領域に読み込む。 1.fstat関数でファイルサイズを取得する。 2.そのファイルサイズ分をmallocし、そこにファイルの全レコードを読み込む。 レコードサイズ64バイトで10万レコードだと、6.4Mバイトほど。 3.検索はmallocで確保したバッファの中を検索する。
540 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:36:30 ] >>538 いや、今回はたまたまその前の%sの喰い残しの改行文字を破棄する必要があるので、空白を入れることで回避したと言うだけ。 毎回空白が必要だと言うわけではない。 scanf()の振る舞いについて、下手な入門書に頼らずきちんと確認しておくことをお勧めしておきます。 因みに、printf()とscanf()の指定子を互換性があるかのごとく並列で解説しているような入門書が多く出回っていますが、 互換性はないものと思って理解しておく方が間違いがありません。
541 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:42:20 ] >>540 scanfについて調べたら、改行の読み捨てが必要な場合があるみたいですね。 勉強になりました、ありがとうございます。
542 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 18:05:25 ] 2ちゃんのトリップ生成法なんですがC言語板をしりたいです $tripkey = "#istrip"; $tripkey = substr($tripkey,1,); $salt = substr($tripkey.'H.',1,2); $salt =~ s/[^\.-z]/\./go; $salt =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/; $trip = crypt($tripkey,$salt); $trip = substr($trip,-10); $trip = '◆'.$trip; print "$trip";
543 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 19:59:39 ] 丸投げはスレ違い
544 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 20:36:42 ] printf系の関数使わないで、浮動小数点数を文字列に変換するにはどうしたらいいでしょうか?
545 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 20:47:48 ] インクルードひとつも使わないやつ書いてやるぜ
546 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 20:51:06 ] 面倒になったので一部日本語で説明する double x;; char top[100] down[100],t,d; 小数点の一から始めて、下向きに数字を読み取ってdownにいれて 一より大きいなら上向きにtopに入れていく 最後に出力
547 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 21:53:10 ] >>544 行数の関係上汚いコードで申し訳ない。 単なる思いつきで書いたから、特に色々とは突っ込まないで欲しい。 あと、こっちの環境ではまともに動いてくれない。 小数点の精度上、 下位ビットにゴミがあってそれを取り込んでしまう。 まぁ、その辺はなんとかしてくれい。 void DoubleToStr(double f) { char up[256], down[256],temp; int d = f, i = 0, j = 0; double z = f; do { up[i++] = d % 10 + '0'; d = d / 10; } while (d != 0); up[i++] = '.'; up[i] = '\0'; i-=2; while (j < i) { temp = up[j]; up[j] = up[i]; up[i] = temp; ++j; --i; } z = f; d = f; z = z - d; i = 0; do { z = z * 10; d = z; down[i++] = d + '0'; z = z - (double)d; } while (z != 0.0); down[i] = '\0'; strcat(up, down); printf("%s\n", up); }
548 名前:プリンがー mailto:aaa [2007/10/29(月) 22:16:02 ] 100個の実数データを配列a[100]に読んで、その最大値をmaxという 変数に求め、結果を出力するプログラムを書きなさい。 #include <stdio.h> int main (void) { int i; double a[100],max=0; for(i=0;i<=100;i++){ scanf("%lf",&x[i]); if(x[i]>max){ max=x[i]; } } printf("最大値は%fです。",max); return(0) ; } これであってますか?
549 名前:aho mailto:sage [2007/10/29(月) 22:17:53 ] >>548 あってるよ〜
550 名前:プリンがー mailto:aaa [2007/10/29(月) 22:22:29 ] >>549 ありがとうございます。
551 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 22:22:40 ] あってねぇーよ double a[100]で100個用意したのはいいが for(i=0;i<=100;i++){ の行で101個目にアクセスしてるだろ。 for(i=0;i<100;i++){ が正解
552 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 22:24:32 ] 実験データは正数だけかな? 配列に入れる必要性がわからんけど後でプログラムを拡張するのかな
553 名前:aho mailto:sage [2007/10/29(月) 22:25:39 ] >>550 ばれたか。 やるな、おぬし!
554 名前:プリンがー mailto:aaa [2007/10/29(月) 23:00:39 ] 1から1000までの数値の中で、2または3の倍数でかつ4の倍数でないものを 出力するプログラムを書きなさい。 #include <stdio.h> int main (void) { int i; for(i=1;i<=1000;i++){ if(i%2=0||i%3=0){ if(i%4!=0){ putchar('\n'); } } } return(0); } これであってますか?
555 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:02:21 ] memcpy(input,output,size<<1); //array copy for(i=0; i < (size<<1); i++) output[i] = input[i]; すみません、この二つの違いを教えてください。 初めに下のほうで計算していたら望む結果が出てこなくて 上のとおりやったら出来ました… 同じことをやっていると思ったのですが、どう違うのでしょうか
556 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:03:12 ] if ((i % 2 == 0 || i % 3 == 0) && (i % 4 != 0))
557 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:04:33 ] >>554 回したら、ものすごい数の改行が出た。
558 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:07:51 ] >>555 outputとinputの型によって差がでるんじゃないかな
559 名前:プリンがー mailto:aaa [2007/10/29(月) 23:08:15 ] >>554 訂正 #include <stdio.h> int main (void) { int i; for(i=1;i<=1000;i++){ if((i%2==0||i%3==0)&&(i%4!=0)){ putchar('\n') } } return(0); } これでいいでしょうか??
560 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:09:29 ] ×putchar('\n'); ○printf("%d ", i);
561 名前:プリンがー mailto:aaa [2007/10/29(月) 23:12:32 ] >>560 ありがとうございます。
562 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:13:39 ] あってませんよ
563 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:15:45 ] >>558 どちらもint型のポインタ(1次元配列)なのですが。 単に求めた結果が出ればいいだけなら、これでいいのですが 初めのソースが合ってると信じて、違う原因がわからないのは自分でも納得がいかないので
564 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:15:54 ] テキストファイルに aあ と書いてそれを16進形式でテキストファイルに出力すると、 61 82 A0 0D 0A となりました。 ここからこの数を使って aあ と新たなファイルに表示させたいのですが、 a は出力できるのですが あ のやり方がわかりません。 どうしたら日本語の あ が出力できるんでしょうか。 ちなみにaは char temp[50] char moji[]="61"; strcpy(temp,"0x"); strcpy(temp,moji) long int aa=strtol(temp,NULL,16); fprintf(file,"%c",aa); 見たいな感じで出力しました。
565 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:22:43 ] >>564 char tmp[10]; tmp[0] = (char)strtol("82", NULL, 16); tmp[1] = (char)strtol("A0", NULL, 16); tmp[2] = '\0'; printf("%s", tmp);
566 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:23:54 ] >>555 >>563 その二つはinputとoutputがchar型配列でない限り、違う結果になる >memcpy(input,output,size<<1); ここの第三引数は、バイト単位でのサイズを指定する >for(i=0; i < (size<<1); i++) >output[i] = input[i]; こっちで指定するのは、配列の要素数
567 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:25:46 ] >>564 printf("%c%c%c",0x61,0x82,0xA0);
568 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:26:00 ] >>563 memcpyのsize<<1はバイトで for文のsize<<1はint型(4バイト?)分になるんじゃないかな? 試してないから間違ってるかもしれないけど
569 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:31:11 ] >>566 >>568 なるほど。。。と違いはわかったのですが memcpyだとinputからoutputに何がコピーされているのか混乱してきました。 sizeはint型でinput分の要素数を表しています。 0 1 2 3 4 5 6 7 の要素が入っていて それを計算したものをoutputに出力させているのです for文の方をmemcpyと同じように働かせるにはどうしたらよいのでしょうか
570 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:31:45 ] >>380 入力に何を与えたら何が出力されるのか書いてくれれば考えてみる >>524 >>526 を読んだが訳分からんかった 検索のキーとなるのは64バイトの内最初の固定 n バイトだけ?(>>524 だと n=16) 1行64バイトって改行文字を含まずに64バイト? 読み込むファイルは検索途中で書き換えられる?
571 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:36:06 ] >>569 要素数を表してるのになんでビットシフトしてるの?
572 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:39:32 ] フーリエ変換かなんか 2^n 要素数のアルゴリズムじゃね?
573 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:40:24 ] >>565 >>567 どちらもできましたありがとうございます。
574 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:40:48 ] >>571 階差数列や漸加式をイメージしてもらいたいのですが 長さの半分の式を移していくという処理をやっています。 なんか頭が熱持ってきました。。。
575 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:41:57 ] >>572 そうです、2^nの式です。。。わかるものなのですね
576 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:44:48 ] ソースが全部貼り付けられてるわけじゃないからあくまで推測だが、 sizeが正しく使われてるか確認した方がいいと思う。
577 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:48:59 ] >>576 for(i=0; i < length<<1 ; i++) input[i] = output[i]; …こうやったら、望む値が出てきました。。。。なぜ。。。。。 計算させるところを勘違いしていたのか、わけがわからなくなってきました。。。。
578 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:50:41 ] >>569 なんかよく分からんが例として int a[10],b[10],size=10,i; //何らかの代入処理 memcpy(b,a,size * sizeof(int)); //↑は↓と等価 for(i=0; i < size; i++) b[i] = [i]; こんなふうにする あと今気付いたが、memcpyの第一引数と第二引数が反対になってるよ 第二引数がコピー元で、第一引数がコピー先 代入文と同じ順序ね
579 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:55:00 ] >>578 ありがとうございます。ちょっと頭冷やして、ソースと頂いたレスを理解します。 ほんとなんかすみません
580 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 03:23:33 ] C言語初心者で、教えて欲しいのですが sin^2(x) (サインの二乗(x)) はどのようにプログラムに書けば良いのでしょうか?
581 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 03:34:41 ] >>580 sin(x)の2乗ということですよね #include <math.h> sin(x)*sin(x) /* sin(x)の2畳 */ sin関数を2階呼ぶのが面倒なら double y; y = sin(x); y*y
582 名前:581 mailto:sage [2007/10/30(火) 03:36:22 ] pow関数を使うという手もありますが 2乗なら掛け算で十分
583 名前:580 mailto:sage [2007/10/30(火) 03:41:03 ] >>581 こんなにも遅い時間にありがとうございます。 プログラミングもですが、数学もやり直してきます
584 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 03:46:08 ] 2倍角の公式の方が速い
585 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 03:51:51 ] exp( ix ) = cos(x) + i sin(x) だから2乗して実部を比較すると cos(2x) = cos^2(x) -sin^2(x) となる cos^2(x) + sin^2(x) = 1 なので 1 - 2 sin^2(x) = cos(2x) これより、(1+ cos(2x)) / 2 が求める値である
586 名前:580 mailto:sage [2007/10/30(火) 04:01:36 ] >>585 さらなる補足をありがとうございます。数学の教科書見て勉強してます
587 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 12:19:41 ] >>585 >>581 より計算量増えてね?
588 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 12:48:58 ] >>587 そもそも移項で間違ってる
589 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 12:55:03 ] sin^2(x) == (1-cos(2x))/2だな >>587 ・関数呼び出しが一回でいい(cf.sin(x)*sin(x)) ・一時的な代入がいらない(cf.y=sin(x);y=y*y;) ってことでこの方法が一番いいかと
590 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 12:58:06 ] 計算増えるっていっても2倍と1/2と足し算だからもとのよりはいいんじゃね?
591 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 13:26:48 ] おまえら、数値計算の勉強をやり直せ。 1 - cos(2x) なんて、 x = 0 の近辺で桁落ちして使い物にならないぞ。 double t = sin(x); double s2x = t * t; しか、ありえない。
592 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 13:34:29 ] 桁落ちw
593 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:50:05 ] -> これはどういう意味があるのでしょうか
594 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:54:29 ] やじるし
595 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:55:08 ] アロー演算子 構造体のポインタからメンバにアクセスするときはドット演算子ではなくこれを使う
596 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:57:52 ] struct point { int x, y; }; struct point p; struct point *pp = &p; があったとき、 (*pp).x = 1; pp->x = 1; が同じxに代入をしている。 構造体へのポインタを使う上での簡略化。
597 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 16:00:59 ] >>595 >>596 ありがとうございました
598 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 17:29:44 ] 使ってる教科書に載ってないのか?
599 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 19:46:39 ] 検索エンジンを作ろうとおもう。 まずEUC-JPに統一する。 旧字体は新字体、カタカナはひらがなにする。 ひらがなと、新字体以外は登録しない。 出現可能な文字に0から順に番号をつけて、N-germ (2-germ) で登録していく あと、ハッシュを使う為に全角2文字分を圧縮して20数ビットを使う NKF32.DLL www.vector.co.jp/soft/win95/util/se295331.html 旧字体→新字体 www.ritsumei.ac.jp/acd/cg/lt/cl/koten/newold.htm yasuda.homeip.net/misima/misima_seiji_test.html www.toyama-cmt.ac.jp/~kanagawa/language/kyuuji.html www.asahi-net.or.jp/~ax2s-kmtn/ref/old_chara.html homepage3.nifty.com/jgrammar/ja/tools/tradkan0.htm homepage3.nifty.com/jgrammar/ja/tools/ksimple.htm
600 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 19:56:23 ] 連載:検索エンジンを作る|gihyo.jp gihyo.jp/dev/serial/01/make-findspot Googleの技術は凄いと思ったがMooterっていうサイトがGoogleを上回る検索力らしい Mooter www.mooter.co.jp/ 辞書不要の形態素解析エンジン「マリモ」とは www.atmarkit.co.jp/news/200708/15/mooter.html 形態素解析について www.gengokk.co.jp/thebun.htm mecab.sourceforge.net/feature.html Google の秘密 - PageRank 徹底解説 www.kusastro.kyoto-u.ac.jp/~baba/wais/pagerank.html PageRankの基本概念 tnt.math.metro-u.ac.jp/labo/grad/2004/masa/graph/6.html
601 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 19:58:27 ] >>599 ガンバレ そしてこのスレに来るな
602 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:36:04 ] 「関数へのポインタ」は何に使うの?必要(あると便利)な状況がよくわからない。
603 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:39:42 ] qsort関数がもろに関数ポインタ使用してるじゃないか
604 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:39:56 ] qsort
605 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:41:46 ] ある関数を呼ぶときに、呼ばれた関数内部で使う関数を外から指定するときに使います。 このばあい、関数へのポインターを引数で渡します。 例) コールバック関数 リストに要素をつなげるときに大小比較関数
606 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:44:33 ] qsort関数もそうですね void qsort(void *base, size_t num, size_t size, int (*compare)(const void*, const void*)) この、int (*compare)(const void*, const void*)が関数ポインターで この場合はソートの並びを呼び出し側で制御できるようにしている。
607 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:56:19 ] うーむ、わかったようでわからない。 複数の機能(=関数の数)を内包する関数で、引数の指定によって機能を使い分ける場合ってことかな? でもそれって単なる文字列でも振り分け可能な気がするなぁ…やっぱりわからん。
608 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:59:49 ] たとえばqsortの場合、qsortの作者が想定してない型のソートもできる 単に引数で文字列を渡すだけじゃ、qsortの作者が想定している型やソート方法しか対応できない
609 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:03:25 ] >>607 ためしに qsort を使ってみろ 数値のソート、文字列のソート、自前構造体のソート・・・ そしたらわかる
610 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:04:51 ] ソート機能を提供するけど、その時必要となる比較の機能は自分で作ってね ってこと 一人で作業する分にはあまり使う必要無いと思う
611 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:35:24 ] 比較関数はプログラマ側が用意できるので、昇順や降順、どの値を比較対象とするか等を任意に作れる。 そしてどんな比較関数でも同じ手続きで利用するために、関数へのポインタを使っている。 …で合ってる?
612 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:37:46 ] ポインター自体を完全に把握してないんじゃないかね? あれ覚えるのやっかいだし
613 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:38:33 ] ソート関数とかわかりずらい STLつかっとけ
614 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:50:45 ] ポインタはそんなに分かりづらいとは思わなかったなぁ。 いっぺん練習で、全ての変数をポインタとmallocでコーディングしたらイヤでも理解出来るよ。
615 名前:デフォルトの名無しさん [2007/10/31(水) 00:00:58 ] EUC-JPコードをファイルから読み込んだとき、char やstringでは何コードで記録されるんですか? 指定できますか?
616 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 00:29:42 ] OSは何を使ってるとか、コンパイラは何とかそういう情報も書いておこうぜ
617 名前:プリンがー mailto:aaa [2007/10/31(水) 00:47:58 ] データa1,a2---,a10及びb1,b2,----b10を読み、積和 S=a1b1+a2b2+-----a10b10を計算せよ。 #include <stdio.h> int main (void) { int i,a[10],b[10]; int S; for(i=1;i<=10;i++){ scanf("%d",&a[i]); scanf("%d",&b[i]); S+=a[i]b[i] } printf("積和は%dです。\n",S); return(0); } これであってますか??
618 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 00:49:34 ] >>617 ・Sの初期化がされていない。 ・a[i]*b[i];
619 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 00:49:35 ] >>617 >S+=a[i]b[i] とりあえずコレが間違ってる *と;が足りない
620 名前:プリンがー mailto:aaa [2007/10/31(水) 01:07:16 ] >>618 >>619 S=0 S+=a[i]*b[i]; ですね。 ありがとです。
621 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 01:12:26 ] >>620 セミコロン(;)忘れるなよ
622 名前:プリンがー mailto:aaa [2007/10/31(水) 01:31:53 ] うるせーバーカ
623 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:04:27 ] かなり初心者です。 unsigned char afo_1,afo_2,afo_3,...afo_n; とafo_1からafo_nまで宣言したい時はどうしたら良いですか?
624 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:09:22 ] >>623 配列じゃダメなの?n=10なら unsigned char afo[10]; 配列の各要素へのアクセスは添字を指定する。 afo[0] = 'a'; afo[1] = 'b'; 〜 afo[9] = 'j';
625 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:09:30 ] >>623 全部書くしかない。 配列でいいなら配列使え。
626 名前:623 mailto:sage [2007/10/31(水) 02:15:12 ] >>624 ,>>625 nが決まった値では無いので、今の路線は無理ですねー。。 配列で頑張ってみます。夜遅いのにすみません。素早い対応ありがとうございます。
627 名前:627 [2007/10/31(水) 04:16:28 ] 明日提出のレポートのプログラムなのですが どうしても実行後うまくいきません 簡単なプログラムで 入力された文字を”#”で表すというものですが 指摘お願いします upsurusuru.hp.infoseek.co.jp/index.html にアップしましたので怪しいむと思いますが 助けてくださいお願いします 07/10/31(Wed),04:10:07 この時刻にアップしました 拡張子を.cに変更してください だれかおねがいします
628 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 04:30:05 ] >>627 うちの環境だとコンパイルできないから確認してないけど、 isalphaとisdigitが逆なんでねーの?
629 名前:Pもかっこわりぃなぁ mailto:sage [2007/10/31(水) 10:42:33 ] >>627 どうでもいいけど、ABCDEFGHIしKLMNOPQRSTUVWXYZになっている。
630 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 13:33:38 ] printfとprintf_Pの違いを教えてください
631 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 13:43:36 ] printfで数字を表示するときも”123”のように”を使いますか?
632 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 14:07:34 ] 数値と数字の違いが分からんのか
633 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 14:20:54 ] >>631 5点
634 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 14:58:30 ] キーが押されたら何かアクションを起こすってするにはどうすればいい? 例) enterを押すと計算をするみたいに enterキーが押されたっていう結果をどうやって取り込むか教えてください
635 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 15:09:11 ] >>631 いいえ ”ではなく"を使いましょう
636 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 15:21:24 ] >>634 getchar()でもしておいたら?
637 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 15:28:13 ] >>634 環境による。つかキーボードドライバの仕様による。
638 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 16:35:44 ] >>634 コンソールで? ウィンドウで?
639 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 16:41:08 ] ウインドウだってコンソールの一種だろ。
640 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 17:22:57 ] >>639 >>639 >>639
641 名前:プリンがー mailto:aaa [2007/10/31(水) 17:45:50 ] >>622 俺の猫かぶりすんなや!
642 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:16:08 ] OSかかないと困るんだなって今日始めてしった MS-DOSで実行した場合int型って2バイトづつのメモリじゃん? でもXP上で実行したらint型だと4バイトづつになって超悩んでた結果、 16ビットマシンと32ビットマシンって事って始めて知ったよ・・・
643 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:23:53 ] System.arraycopy(コピー元,コピー開始位置,転送先,転送開始位置,要素数) のJAVAの関数を memcpy(コピー先,コピー元,, n バイト分) に置き換えたいのですが 要素数をnバイト分であらわすか、 nバイト分を要素数に変えるにはどうすればいいか教えてください sizeof(nバイト分)ではダメでした
644 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:24:58 ] >>643 sizeof(要素)*要素数
645 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:27:05 ] >sizeof(nバイト分) その発想は無かったわ
646 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:38:59 ] >>644 できました!!!!!!!!!!!!!!!!!!!11 すいませんが、何をやっているのか教えていただけませんか? >>645 バカですいません
647 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:50:11 ] >>646 sizeof(要素)で1つあたりのバイト数が出る 要素数をかけ算すればn バイト分が求まる。 かけ算は小学校三年生だっけ?
648 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:55:23 ] 理解できました。 memcpyではあくまでバイトを扱うのであって 要素数分のバイトを3つ目に入れないとダメなわけですね。。。ありがとうございました
649 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 01:53:40 ] ここのスレのひとはgdbの 使い方完全に理解してるのかな? 関数の中の関数とかどうやって見るの?
650 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 02:03:28 ] >>640 コンソールって何のことだと思ってんの?
651 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 07:16:51 ] unsigned int **pi, i, j; if ((pi = malloc(sizeof(unsigned int *) * 32)) == NULL) { fputs("しっぱい", stdout); exit(0); } for (i = 0; i < 32; i++) { if ((pi[i] = malloc(sizeof(unsigned int))) == NULL) { fputs("しっぱい", stdout); exit(0); } } for (i = 0; i < 32; i++) { fprintf(stdout, "%8u %8u", pi[i], &pi[i][4]); fputc('\n', stdout); } for (i = 0; i < 32; i++) free(pi[i]); free(pi); return 0; pi[i][4] と pi[i + 1][0] のアドレスが一緒になっちゃうんだけど、なんで?
652 名前:650 mailto:sage [2007/11/01(木) 07:26:15 ] >>651 自己解決しました。バカだなオレ…orz
653 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 07:37:41 ] >>650 ウィンドウって何のことなの?
654 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 12:06:05 ] 構造体配列を宣言するとき二次元配列として宣言できますか? typedef struct bridge{ int a; int b; int c; }DATA; DATA m[5][5]; こんな感じです。
655 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 12:09:01 ] >>654 全然おk
656 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 12:10:10 ] >>655 すばやいレスありがとうございます。
657 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 13:21:06 ] 先ほどの654のものですが宣言で以下のようにしましたがうまくいきません。 typedef struct bridge{ int a; int b; int c; }DATA; DATA m[5][5] = { {-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0}, {-1,0,0},{0,0,0},{0,0,2},{0,0,0},{-1,0,0}, {-1,0,0},{0,1,5},{0,0,0},{0,1,3},{-1,0,0}, {-1,0,0},{0,0,0},{0,1,2},{0,0,0},{-1,0,0}, {-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0} }; 構造体を二次元配列で宣言する場合はどのようにすればよいのでしょうか。 アドバイスお願いします。
658 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 13:32:45 ] >>657 DATA m[5][5] = { {{-1, 0, 0}, ...}, ... };
659 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 13:40:09 ] >>658 本当に申し訳ありません。 単純なミスでしたorz ありがとうございます。
660 名前:デフォルトの名無しさん [2007/11/01(木) 14:29:42 ] >>639 CUI || GUI ?
661 名前:デフォルトの名無しさん [2007/11/01(木) 14:57:27 ] int型の数値をchar型の文字列配列に入れたいんですけどできますか?
662 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 15:05:21 ] >>661 char ci[100]; int i = 2007; sprintf(ci, "%d", i);
663 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 15:09:29 ] そういう意味だったのか さすがエスパー
664 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 15:12:44 ] >>662 ありがとうございます!
665 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:18:05 ] >>660 ttp://www.excite.co.jp/dictionary/english_japanese/?search=CONSOLE&match=beginswith&dictionary=NEW_EJJE&block=36319&offset=400
666 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:20:06 ] >>660 こっちのほうが解りやすいかな。 ttp://www.excite.co.jp/dictionary/japanese/?search=%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB&match=beginswith&itemid=07660600
667 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:25:24 ] >>665 え? >>634 のプログラムの話なんだけどなんなの?
668 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 20:52:53 ] ポインタ意味わかんねええええええええええええええええ *pだとしたら p = &a ってアドレスのみ格納? でこの場合 *pはaの中身そのまま、pならaのアドレスそのまま &pならポインタ変数pのアドレス。 これでいいのかい!? でポインタのポインタとかイミフ!
669 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 21:04:02 ] >>668 >*pはaの中身そのまま、pならaのアドレスそのまま &pならポインタ変数pのアドレス。 >これでいいのかい!? まあ大体はおk >でポインタのポインタとかイミフ! 単純に上のaがポインタだと考えればいいんだよ
670 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 21:33:12 ] >>669 ソノハッソウハナカッタワ すげー単純にわかった。thx
671 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:42:44 ] while(count < 20) { aiai = rand(); if (aiai >= 0 && aiai <= 100) { count2 = 0; while(count2 < 3) { test[count][count2] = aiai; count2++; printf("%4d ",test[count][count2]); } printf("\n"); count++; } 配列二次元目をまず3つ埋めた後、 縦に20個の繰り返しで乱数での数字を埋めたいんだけど、 どーもcount2が機能してないみたいで、全部初期化した0が返ってくる。 なんでなんだぜ? 二次元目って変数指定できないの?
672 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:43:48 ] あ、ごめん上の見やすくするためにスペース入れてたらifの閉じるの消えちゃってる。 それはご愛嬌で><
673 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:47:36 ] ごめんなさい。 よくよく見直したら count2++; printf("%4d ",test[count][count2]); これ処理の順番逆でした・・・。
674 名前:プリンがー mailto:aaa [2007/11/02(金) 00:35:43 ] - x(エックスバーってどうやったら入力できますか?
675 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 00:36:39 ] >>674 ja.wikipedia.org/wiki/%E3%82%A8%E3%82%AF%E3%82%B9%E3%82%AB%E3%83%AA%E3%83%90%E3%83%BC
676 名前:デフォルトの名無しさん [2007/11/02(金) 01:12:30 ] プログラム初心者です。 乱数のrand()を使って勝、負のとこを帰れば丁、半にかえるプログラムですが これで問題はないでしょうか? #include <stdlib.h> main(){ int a; a= rand() % 2; if(a==1){ printf("勝"); }else{ printf("負"); } } プログラムの意味でifは基本なのでわかりますが ↓ここの部分があまりよく分からないんですが a= rand() % 2; if(a==1){ %2は2つの数のどちらかを出すと考えたのですがそれでよろしいでしょうか? a==1のとき勝が表示されます。 a= rand() % 2で1が表示された場合 elseはa==0ということで負と表示されていると考えていのでしょうか? 応用として甲、乙、丙をランダムに表示させる場合はif(a==2)、else if(a==1)、else として甲、乙、丙を表示させると考えるとかんがえていいのでしょうか? 分かる方がいればよろしくお願いします。 初心者用の参考書には乱数関係の説明がほとんどないんで…。
677 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:14:18 ] 乱数の説明はなくても%の説明がない参考書はないだろ。
678 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:15:57 ] #include <stdio.h> int main(void) { while(1) { float kyori; int ryokin; printf("距離?"); scanf("%f", &kyori); if(kyori <= 0.0) return; for(ryokin = 1300; kyori > 8.0; kyori -= 2.0) ryokin += 200; if(kyori <= 5.0) ryokin = 870; if(kyori <= 3.0) ryokin = 550; if(kyori <= 2.0) ryokin = 380; printf("料金 : %d\n", ryokin); } } ↑のプログラミングリストでfloatの型使わないで表すとどうなるでしょうか? お願いします
679 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:19:40 ] 宿題スレで聞け
680 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:28:03 ] >>676 rand()は0以上RAND_MAX以下の整数を返す関数 %2は2で割った余り(剰余)を求める 2で割った余りは0か1だからrand()%2は0か1どちらかをランダムに生成するという意味 甲乙丙なら3種類の乱数(0,1,2)をランダムに生成すればいいからrand()%3とすればいい
681 名前:デフォルトの名無しさん [2007/11/02(金) 06:18:49 ] >676より >680 ありがとう。 rand()%◆では◆で割った余りをランダムに表示させるという方法で 乱数をだしているんですね。 >677 それは分かるんです。質問の仕方が悪かったようで申し訳ないです。
682 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 10:10:23 ] 表示
683 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 10:50:31 ] char *const p; char *const *pp = &p; pp = foo // 可能? *pp = bar // 可能? char *const *ppとあるとき、 *constと*はどっちが元のもの? ポインタのポインタのポインタの…は、 どっち方向に * が伸びていくの?
684 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 12:18:41 ] >>683 fooとbarは何の型?
685 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 12:29:03 ] char c; char *const p = &c; char *const *pp = &p; char *const **ppp = &pp; char *const ***pppp = &ppp; pp = foo; // 可能 *pp = bar; // 不可能 **pp = hoge; // 可能
686 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 12:41:26 ] char *const *pp はconstなchar* のポインタ char const **pp はconstなcharのポインタのポインタ と認識してるけど・・・ char *const p; char *const *pp = &p; //OK char const *p; char *const *pp = &p; //NG
687 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 14:14:02 ] char *const *pp charへのconstポインタへのポインタ? charへのポインタへのconstポインタ? char **const p charへのconstポインタへのconstポインタ? charへのポインタへのconstポインタ?(char *(*const) p相当?)
688 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 14:15:29 ] >>685 さんの説(?)で行くと、 char *const *pp はcharへのconstポインタへのポインタ、ということになる。
689 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 14:17:26 ] >char *const *pp charへのconstポインタへのポインタ >char **const p charへのポインタへのconstポインタ >charへのconstポインタへのconstポインタ? それは char *const *const p; と書く
690 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 15:58:45 ] おまえらはオレの脳を破壊する気ですか?
691 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:28:04 ] >>683-が一切わからん
692 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:50:59 ] 要するにconstあり/なしの組み合わせの数がたくさんあるってこと。 ポインタじゃないただの変数の場合、constあり/なしの2種類しかない。 char c; const char c; ポインタには、指す先のconstあり/なしとポインタ自体のconstあり/なしがあるから、全部で4通りになる。 charへのポインタ … char *p; charへのconstポインタ … char *const p; const charへのポインタ … const char *p; const charへのconstポインタ … const char *const p; ポインタを指すポインタは、指す先が4種類あって、ポインタ自体のconstあり/なしもあるから、全部で8通り。 charへのポインタ へのポインタ … char **p; charへのconstポインタ へのポインタ … char *const *p; const charへのポインタ へのポインタ … const char **p; const charへのconstポインタ へのポインタ … const char *const *p; charへのポインタ へのconstポインタ … char **const p; charへのconstポインタ へのconstポインタ … char *const *const p; const charへのポインタ へのconstポインタ … const char **const p; const charへのconstポインタ へのconstポインタ … const char *const *const p;
693 名前:デフォルトの名無しさん [2007/11/02(金) 17:53:33 ] もうやめて>>692 !>>690-691 のライフは0よ!
694 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:56:01 ] >>692 まとめおつ!!
695 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:01:20 ] 「ポインタ完全制覇」だっけかに考え方が書いてあるよ const char **const p; の場合、右から順に考えて p が const *p はノーマル **p が const という風に機械的に解釈するといいらしい
696 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:03:18 ] どうせコンパイラも機械的に解釈してるしな
697 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:09:13 ] 初心者だが上に挙げた事例でどこら辺の物まで 実際のプログラムで活用されるの? なんか、>>692 とかわけわかめなんだ。
698 名前:プリンがー mailto:aaa [2007/11/02(金) 18:11:37 ] 三角形の面積を求めよ。 #include <stdio.h> int main (void) { double height teihen; double S; printf("height="); scanf("%lf",&height); printf("teihen="); scanf("%lf",&height); S=height*teihen/2; printf("面積S=%f\n",S); } これであってますか?
699 名前:プリンがー mailto:aaa [2007/11/02(金) 18:20:13 ] e=1+1/1!+1/2!+・・・+1/10!を求めよ。 #include <stdio.h> int main (void) { int i; double e; for(i=1;i<=10;i++){ e+=0.1+1/i!: } printf("e=%f\n",e); return(0); } あってます?
700 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:21:53 ] constのポインタだと どこらへんがおいしいの?
701 名前:デフォルトの名無しさん [2007/11/02(金) 18:22:44 ] >>698 teihen の値が怖いwwwww >>699 e+= が怖いwwwww
702 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:23:54 ] !
703 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:27:18 ] >>697 例えば、 Manpage of QSORT ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/qsort.3.html に、(char * const *) p1が出てくる。
704 名前:デフォルトの名無しさん [2007/11/02(金) 18:34:47 ] e+=0.1+1/i!: eが初期化してない。 1/i!なんて式初めて見た。
705 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:38:43 ] for(i=1;i<=10;i++) のケースだと i! はいつも 0 になり、ゼロディバイドw
706 名前:デフォルトの名無しさん [2007/11/02(金) 18:43:07 ] >>705 !iならそうだろうけど・・・。 i!でもおk
707 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:52:45 ] >>703 thx 使うときは使うんだな。もっかいポインタやりなおすわ。
708 名前:プリンがー mailto:aaa [2007/11/02(金) 19:10:08 ] >>701 teihenじゃなくどうすればいいですか?ippen? >>704 初期化・・このときe=0の初期化が必要なんですか?
709 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:14:25 ] >>708 printf("teihen="); scanf("%lf",&height); // テーヘンだ!テーヘンだ!
710 名前:プリンがー mailto:aaa [2007/11/02(金) 19:19:49 ] >>709 あ、入力ミスですw 変数名はteihenで構わないですよね?
711 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:21:09 ] >>708 >>698 の自分のプログラムをよく見ましょう 単純なケアレスミス あとCにはi!なんて記法は存在しません
712 名前:プリンがー mailto:aaa [2007/11/02(金) 19:28:03 ] >>711 そうなんですか。 そうした場合>>699 の問題でプログラムの本体はどうすればいんですか?
713 名前:デフォルトの名無しさん [2007/11/02(金) 19:29:56 ] >>712 まずn!の意味を考えると・・・ n! = 1*2*3*4*5 ・・・ * n だ あとはそれをプログラムするだけ。
714 名前:プリンがー mailto:aaa [2007/11/02(金) 19:34:23 ] >>713 なるほど。 プログラム内に「・・・」の表記はありなんですか?
715 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:38:14 ] あまりにアホすぎて釣りにしか見えない
716 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:38:21 ] >>714 まず問題の前に書式の勉強をしておいで。
717 名前:プリンがー mailto:aaa [2007/11/02(金) 19:40:32 ] 初心者なもんですんまそ。
718 名前:プリンがー mailto:aaa [2007/11/02(金) 19:46:23 ] なしですね。
719 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:58:25 ] 本気だったならごめん 勉強がんばれ
720 名前:プリンがー mailto:aaa [2007/11/02(金) 20:00:47 ] >>719 ありがとうございます。
721 名前:プリンがー mailto:aaa [2007/11/02(金) 20:47:49 ] e=1+1/1!+1/2!+・・・+1/10!を求めよ。 これって関数使わずにプログラム作れますか?
722 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:51:06 ] mainもつかわずに?
723 名前:プリンがー mailto:aaa [2007/11/02(金) 20:51:09 ] >>721 追記 関数でfactorial使ってできるんだろな〜てのは分かるんですが関数の学習 はまだちょこっとしかしてなくて
724 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:51:53 ] ハンドルネーム使ってる時点で…なぁ
725 名前:プリンがー mailto:aaa [2007/11/02(金) 20:51:59 ] >>722 mainは使ってです。
726 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:52:24 ] プリプロセッサメタプログラミングで求めろってことか
727 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:53:00 ] 作れるよ
728 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:53:24 ] >>723 そんなのしなくても出来る。 まずn!を計算する処理を考える、 それが出来たらnn!を計算する処理を考える それが出来たら1/nn!を計算する処理を考える。
729 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:55:00 ] 関数使って作れるならそれをインライン展開したものを考えてみよう
730 名前:プリンがー mailto:aaa [2007/11/02(金) 20:55:14 ] >>727 そうですか〜。 for〜if〜使えばいいのかな?
731 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:55:59 ] うん
732 名前:プリンがー mailto:aaa [2007/11/02(金) 20:59:16 ] >>728 n!が俺には謎めいてきたw
733 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:04:13 ] >>730 二重ループは知ってる?
734 名前:プリンがー mailto:aaa [2007/11/02(金) 21:07:24 ] >>733 はい。条件分岐はだいたい分かってます。
735 名前:デフォルトの名無しさん [2007/11/02(金) 21:07:42 ] C言語結構粘るな。そろそろ終わってもいいと思うんだが
736 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:12:35 ] 答えはこのとおりだが、自分で考えたいだろうから読みにくくしている。 考え方だけ参考にして。ちなみに行儀の悪いコーディングの例でもあります #include<stdio.h> int main(void){int i,n=10; double e=1.0,x=1.0;for(i=1; i<=n;i++)e+=(x/=i);printf( "%f\n",e);return 0;}
737 名前:プリンがー mailto:aaa [2007/11/02(金) 21:20:58 ] >>736 大変ありがとうございます。 ちなみにn=10とx=1.0は必要ないですよね!?
738 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:27:23 ] >>737 何故そう思う?
739 名前:プリンがー mailto:aaa [2007/11/02(金) 21:42:12 ] >>738 n=10はiの範囲のうち。x=1.0はe+=1.0/iの1.0はiを格上げするため。 double/int→doubleここはなんて説明すればいいのか・・・
740 名前:プリンがー mailto:aaa [2007/11/02(金) 21:43:38 ] xは1.0のままだからボックスを作る必要がない。
741 名前:デフォルトの名無しさん [2007/11/02(金) 21:44:52 ] >>738 >>736 のコードが難しすぎたようだ。 初心者にe+=(x/=i);をぱっと理解できるとはおもえん。
742 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:45:00 ] 1.0のままではありませんよ
743 名前:プリンがー mailto:aaa [2007/11/02(金) 21:57:17 ] >>742 なぜ1.0のままじゃないんですか?? めんどくさくなければ教えて下さい。
744 名前:デフォルトの名無しさん [2007/11/02(金) 21:58:27 ] >>743 x /= i は x = x/i; のこと。 x/iをxに代入する。
745 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:58:46 ] >>739 の解釈だと >>736 は e=1 + 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/7 + 1/8 + 1/9 + 1/10 ってことになるよ とりあえず x の値を表示させてみては?
746 名前:プリンがー mailto:aaa [2007/11/02(金) 22:04:39 ] >>744 それは分かってます。 >>745 ちょっと説明間違ったかなー 分子は1.0のままでしょ
747 名前:デフォルトの名無しさん [2007/11/02(金) 22:17:12 ] >>746 じゃあ1/3!は 0.5/3だって理解は出来る? 同様に 1/4!は 0.166/4
748 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:21:55 ] >>746 前回のループで計算したxが分子だよ
749 名前:プリンがー mailto:aaa [2007/11/02(金) 22:22:53 ] >>747 1/3!=(1/2)/3 1/4!=(1/6)/4
750 名前:デフォルトの名無しさん [2007/11/02(金) 22:26:12 ] >>749 そうそう。 あれ、分子が1.0のまんま?はて?
751 名前:プリンがー mailto:aaa [2007/11/02(金) 22:27:29 ] >>750 頭が痛くなってきた。
752 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:29:31 ] e+=(x/=i);を分解すると、 x = x / i; e = e + x; xのところに直値で1.0を入れることはできない
753 名前:デフォルトの名無しさん [2007/11/02(金) 22:29:48 ] >>751 つまり分子は1.0のままではない。って事。 1/3!=(1/2!)/3 1/4!=(1/3!)/4 1/5!=(1/4!)/5
754 名前:プリンがー mailto:aaa [2007/11/02(金) 22:33:33 ] >>753 てか階乗の意味ってもともと 1/3!=(1/2!)/3 1/4!=(1/3!)/4 1/5!=(1/4!)/5 なの? 1/3!=1/1*2*3 1/4!=1/1*2*3*4 1/5!=1/1*2*3*4*5 じゃなくて?
755 名前:デフォルトの名無しさん [2007/11/02(金) 22:34:04 ] 西暦を入力すると干支が出るようにしたいんですが、何が違うのかわかりません。教えてください if文が全般的に違うようです。 #include<stdio.h> main() { int year(void); printf("西暦・・・"); scanf("%d", &year); if(year % 12 = 2) {printf("%d 年は戌年",year);} else if(year % 12 = 3) {printf("%d年は亥年\n",year);} else if(year % 12 = 4) {printf("%d年は子年\n",year);} else if(year % 12 = 5) {printf("%d年は丑年\n",year);} else if(year % 12 = 6) {printf("%d年は寅年\n",year);} else if(year % 12 = 7) {printf("%d年は卯年\n",year);} else if(year % 12 = 8) {printf("%d年は辰年\n",year);} else if(year % 12 = 9) {printf("%d年は巳年\n",year);} else if(year % 12 = 10) {printf("%d年は午年\n",year);} else if(year % 12 = 11) {printf("%d年は未年\n",year);} else if(year % 12 = 0) {printf("%d年は申年\n",year);} else {printf("%d年は酉年\n",year);} return 0; }
756 名前:デフォルトの名無しさん [2007/11/02(金) 22:35:47 ] >>754 意味は同じでしょ? 結果が同じならおk
757 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:36:03 ] >>755 比較は == で
758 名前:デフォルトの名無しさん [2007/11/02(金) 22:36:26 ] >>755 switchで頼むわ・・・。
759 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:37:31 ] テーブル使おうや・・
760 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:38:11 ] Hi, Let's use array.
761 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:38:14 ] int year(void); って関数じゃなくて変数の宣言をしたいんじゃないの
762 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:50:41 ] >>757-761 お前らそんな一気に言ったら>>755 が可哀想だろw >>755 これを参考に。 #include<stdio.h> const char *eto[] = {"申年","酉年","戌年","亥年","子年","丑年","寅年","卯年","辰年","巳年","午年","未年"} int main(){ int year; printf("西暦・・・"); scanf("%d", &year); printf("%d年は%s",year, eto[year%12]); return 0; }
763 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:54:15 ] >>762 year にゲタをはかせて、テーブル自体は 「子」 から始まって 「亥」 で終わって欲しい
764 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:57:06 ] >>763 ああ、まあ、そっちの方が綺麗か 適当に脳内修正しといて
765 名前:プリンがー mailto:aaa [2007/11/02(金) 23:03:11 ] >>757 ですね。ちょいとプリントアウトでもして頭整理します。 ありがとです。
766 名前:プリンがー mailto:aaa [2007/11/02(金) 23:03:46 ] >>756 だた。
767 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:29:09 ] >>755 それで警告が出るようにコンパイラオプションを指定しろ。 VC++なら/W4、gccなら-Wallとか。
768 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:30:17 ] ってそもそもエラーになるな、あほだ俺orez
769 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:30:30 ] >>767 警告っていうか、エラーにならないか?
770 名前:プリンがー mailto:aaa [2007/11/02(金) 23:43:00 ] for(i=0.5;i<=8.2;i++) このときのi++は0.1刻みに増え(i=i+0.1)ますか? それとも1ずつ増え(i=i+1)ますか?
771 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:44:47 ] >>770 やってみればいいじゃないか?
772 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:46:46 ] インクリメント・デクリメントできるのは整数型だけですよ
773 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:47:05 ] >>770 0.1刻みに増えると思う根拠は何だい?
774 名前:プリンがー mailto:aaa [2007/11/02(金) 23:47:06 ] >>771 コンパイラ?もってないからできない。
775 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:47:23 ] >>770 基本的にループ変数にfloatやdoubleを使うのはトラブルの元だよ 累積誤差が無視できない
776 名前:プリンがー mailto:aaa [2007/11/02(金) 23:48:24 ] >>772 なるほど。
777 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:48:42 ] >>774 今すぐインストールしなさい
778 名前:デフォルトの名無しさん [2007/11/02(金) 23:50:40 ] コンパイラもなくコード書いてどーするwwwwwwwwwwwwwwwww
779 名前:プリンがー mailto:aaa [2007/11/02(金) 23:52:08 ] >>775 例えばy=x^3-x^2を1.5から8.5まで0.1ずつ変化させたときのyの値を 出力せよ。の場合ループを使わざるを得ないよね!?
780 名前:デフォルトの名無しさん [2007/11/02(金) 23:53:06 ] >>779 そういう時は i += 0.1であって i++ではない。
781 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:53:16 ] >>779 ループは使うがループ変数は整数型でもできる
782 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:53:56 ] >>779 ループ変数にはintを使ってループの中で10.で割って使う
783 名前:プリンがー mailto:aaa [2007/11/02(金) 23:54:38 ] >>777 コンパイラ購入しないといけないでしょ? ある程度入門書終わらせたら買うけど
784 名前:デフォルトの名無しさん [2007/11/02(金) 23:54:45 ] 一定時間ごとに処理を行うようなプログラムは どのように作ればいいですか?
785 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:55:36 ] >>784 C標準だけではできない 割り込みとかポーリングとかOSやハードウェアをいじくる
786 名前:デフォルトの名無しさん [2007/11/02(金) 23:56:04 ] >>783 google先生に 無料のコンパイラは無いか聞いてみれ
787 名前:プリンがー mailto:aaa [2007/11/02(金) 23:57:39 ] >>782 なるほどー!そうなのか
788 名前:プリンがー mailto:aaa [2007/11/02(金) 23:59:47 ] >>786 いつか聞いてみる! いい道具だしてくれるかな〜ドラえもん
789 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:00:20 ] >>783 本に付属してるものならともかく今時の入門者はコンパイラ単体で買うのは珍しいと思う いろんなコンパイラがネットから無料でダウンロードできるしね
790 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:00:53 ] >>788 今すぐ聞け
791 名前:プリンがー mailto:aaa [2007/11/03(土) 00:05:00 ] >>789 そうんだ〜!とある人から聞いたら コンパイラは買わないといけないよって聞いた! あぶね〜
792 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:11:12 ] >>791 特殊な環境用のコンパイラは買わないと無いかも知れない (PIC用とか) MS-Windows とか MacOS とか Linux ならフリーのコンパイラがある 勉強ならパソコンでやればいい
793 名前:デフォルトの名無しさん [2007/11/03(土) 00:13:41 ] ああ
794 名前:プリンがー mailto:aaa [2007/11/03(土) 00:20:25 ] >>792 なるほど。 参考になった。
795 名前:プリンがー mailto:aaa [2007/11/03(土) 00:27:51 ] >>782 ループの前に整数を10で割るという変数を定義してて大丈夫でしょ!?
796 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 02:28:17 ] >>795 喪前みたいにこんなに物覚えが悪い馬鹿が実際にコンパイルしないで効率落としてたら迷惑だ。 とっととコンパイラをインストールしてこい。 コンパイラなしに勉強したいなら、もう少し他人の書き込みを注意深く読めるようになってからにしろ。
797 名前:デフォルトの名無しさん [2007/11/03(土) 02:40:36 ] 生まれた年を入力することによって今年何歳になるかを表示するようにしようとしたのですが、何が間違っているかわかりません。 #include<stdio.h> int tosi(int a,int b); return a - b; main() { int year; printf("あなたの生まれた年は?\n"); scanf("%d",&year); printf("あなたは今年%d歳\n",tosi(2007,year)); return 0; }
798 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 02:43:29 ] >>797 構文
799 名前:デフォルトの名無しさん [2007/11/03(土) 03:46:22 ] 配列の入力の時に,EOFだと-1入力で終了になりますよね? 改行で入力終了にしたいのですが,どうすればいいですか? 1 1 0 0 1 0 1 1 改行 で入力を終了したいです。 教えてください。よろしくお願いします。 //---- 配列入力 num = 0; do { scanf("%d", &arr[num]); } while ( arr[num++] != EOF ); // 改行は入力の終了 num--; // 有効な入力数
800 名前:デフォルトの名無しさん [2007/11/03(土) 04:28:06 ] 変数やポインタについて質問なんですが、 それらが自分自身のメモリサイズを知っているのは何故なんですか? 例えば、 int a[3]={1,2,3}; printf("%d",*(a+1)); とかって場合、*(a+1)の+1がint分オフセットするって記憶している場所ってどこなんでしょう??
801 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:30:23 ] 気にすんな
802 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:34:20 ] >>800 キニスルナ あえて言うならコンパイラさんの秘密の小部屋の中だ
803 名前:デフォルトの名無しさん mailto:age [2007/11/03(土) 04:45:16 ] デジタルフィギュア www.youtube.com/watch?v=9OHe2h3sZL0
804 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:49:05 ] >>800 そういう風に作られているからとしか言いようがない CPUが変わるとコンパイラ変えないとだめでしょ?
805 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:49:31 ] >>801-802 ぅぅ…気になる。。 けど我慢します。 ありがとうございました。 どっかのメモリ上にいるんだろうけど…。 それを参照出来ないのかな…。。 気になる…寝れない。
806 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:51:21 ] >>805 そんなに気になるならアセンブラ勉強しろ 大抵のコンパイラはソース吐かせられるようになっているから それを見れば一目瞭然なんだが
807 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:53:43 ] >>804 ,806 あ、なるほど。 レジスタにもメモリにもディスクにも記憶されてないんですね!? ただ単にオフセットしたりする順序が(機械語レベルで)書かれているんですかね。 なんとなく想像付きました。
808 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:57:45 ] >>800 intやcharのオフセットサイズが知りたいのならsizeof(int)でおk 但し、これらの結果は環境に依存するから注意が必要だ
809 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:01:20 ] >>807 CPUのアドレッシングモードを活用している場合もある 例えばx86のintならレジスタに+04hずつ足しながらレジスタ+レジスタで アドレスを算出している事が多い RISCの場合は完全にコード内に組み込まれてしまう場合が多いね
810 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:02:23 ] #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "ないよう", "たいとる", MB_OK); return 0; } XP2、VC++2005Express、cl.exeなんですが、たったこれだけのソースなのに以下のエラーが出てコンパイルできません。 なんでなんだぜ? test.obj : error LNK2019: 未解決の外部シンボル __imp__MessageBoxA@16 が関数 _WinMain@16 で参照されました。 test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
811 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:43:32 ] c言語で、田 (←は辺の数2x2の例) のような図形の辺上での経路探索プログラムを作っているのですが、 自分で作ったプログラムでは、再帰処理を用いたせいかやたら速度が遅く、 辺の数を増やすと数時間では終わらなくなってしまいます。 なるべく関数を再帰呼び出ししないように無駄な探索は再帰前にチェックさせたのですが、それでも遅いです。 再帰を非再帰にしたいのですが、自分の技量ではまったく記述が浮かびませんでした。 再帰の内容は、開始位置から上下左右の4つの方向にそれぞれ移動させ、さらに再帰でその処理を繰り返しながら 目的位置までの経路を探索する、というものです。 どうすれば、非再帰にできるか助言頂けないでしょうか?
812 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 06:08:11 ] そうすを出しなさい
813 名前:デフォルトの名無しさん [2007/11/03(土) 06:17:14 ] >>811 経路データをどう与えるんだ? あと一筆書きするって事?
814 名前:デフォルトの名無しさん [2007/11/03(土) 06:26:38 ] 1、2、・・・N 点に対して (1,2) (4,8)という風にデータを与えればいいか ただし(a,b)書いたときa<bとしaとbはつながっているとする 前回にすすんだ経路を記録しておいて、進んだときにその経路を消していけばいいのでは? 戻るときは前回のデータを復元していく たとえば、A=(a1,a2)などとして、ABCDEFGという繋がりが与えられれば、各段階でAからGの経路へ進めるということを繰り返す 初めに(進めるとして)Aへ進めたらBCDEFGが残る 次にAを進めようとするがここは残っていない BCD・・・とチェックしていく
815 名前:デフォルトの名無しさん [2007/11/03(土) 06:36:49 ] 繋がりの個数 N、 繋がり (a0,b0)・・・(a(N-1), b(N-1)) 探索の深さ d 現在の探索位置 k0,・・・k(N-1) 現在位置 x i = 0・・・N-1 xから繋がり(ai,bi)で移動できるか 出来るならkd = i、d++ とし繋がりを消す すべての繋がりがなくなれば成功でリターンする どの繋がりにも行けないならd--。kdのつながりを復元して上へ戻る もしd=0なら失敗でリターンする
816 名前:815 [2007/11/03(土) 06:44:37 ] 最大1000点の繋がりを処理できるプロクラム作ってやるぜ!
817 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 06:57:02 ] 最短距離となる経路を知りたいのか?経路の総数を知りたいのか?目的がわからん。 経路の総数なら数式で出したほうがラクだと思うが。
818 名前:815 [2007/11/03(土) 07:15:55 ] ねむくなりました とちゆうまで貼り付けておきます #include <iostream> #include <time.h> using namespace std; main(){ unsigned int A[32768]; int n,a,b,c; for(n=0;n<32768;n++)A[n]; for(n=0;n<20000;n++){ a=rand()%1024;b=rand()%1024; if(a!=b){c=a+1024*b; A[c/32] |= 1<<(c%32);}} int v[10000],d=0,x=0; for(n=0;n<10000;n++)v[n]=0; for(n=v[d];n<1024*1024;n++) if( (A[n/32]>>(n%32))&1 ){ a=n>>10 ; b=n%1024; if(x==a){x=b;v[d]=n+1;d++;A[n/32] &= ~(1<<(n%32));} else if(x==b){x=a;v[d]=n+1;d++;A[n/32] &= ~(1<<(n%32));} } }
819 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 08:07:29 ] >>810 user32.libをリンクしろ。 user32.libはPlatform SDKもしくはWindows SDKに入っている。 VC++ 2005への設定が容易な分、Windows SDKがおすすめ。
820 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 08:35:56 ] >>799 scanf()の戻り値を見て、0だったら終わればいい。
821 名前:デフォルトの名無しさん [2007/11/03(土) 10:52:55 ] >>798 具体的にどこをどう直せばいいですか?
822 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 10:58:41 ] >>821 #include<stdio.h> int tosi(int a,int b){ return a - b; } main() { int year; printf("あなたの生まれた年は?\n"); scanf("%d",&year); printf("あなたは今年%d歳\n",tosi(2007,year)); return 0; }
823 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 12:17:33 ] >>811 メモ化 再起をループに書き換えたところで改善されるパフォーマンスは微々たるもの
824 名前:815 出来たけどバグあるよ 直して使ってくれ [2007/11/03(土) 14:24:44 ] #include <iostream> #define TEN 3 using namespace std; main(){ int N=TEN*TEN,n,a,b,c;unsigned int A[TEN*TEN/32+1]; //経路生成 for(n=0;n<=N/32;n++)A[n]=0; for(n=0;n<100;n++){ a=rand()%TEN;b=rand()%TEN; if(a<b){c=a+TEN*b; A[c/32] |= 1<<(c%32);}} //経路総数 int keirosu=0;for(n=0;n<N;n++)if( (A[n/32]>>(n%32))&1 )keirosu++; int *y=new int [keirosu+2], z[TEN], d=0,x,s=keirosu;; for(n=0;n<keirosu+2;n++)y[n]=0; for(x=0;x<TEN;x++){ z[0]=x; while(1){ n=y[d]; if(n>=N){ if(d==0)return 0; d--;n=y[d];a=n%TEN; b=n/TEN; if(a==x)x=b;else x=a; A[c/32]|=1<<(c%32);s++; y[d]++;continue;} if( (A[n/32]>>(n%32))&1 ){ a=n%TEN; b=n/TEN; if(a==x){s--;if(s==0)goto end; x=b; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;} if(b==x){s--;if(s==0)goto end; x=a; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}} y[d]++;}} end:for(n=0;n<keirosu-s;n++)cout<<z[n]<<"→";}
825 名前:815 すこしなおした バグ取るか、参考として利用してくれ [2007/11/03(土) 15:04:39 ] #include <iostream> #define TEN 20 using namespace std; main(){ int N=TEN*TEN,n,a,b,c;unsigned int A[TEN*TEN/32+1]; //経路生成 for(n=0;n<=N/32;n++)A[n]=0; for(n=0;n<100;n++){ a=rand()%TEN;b=rand()%TEN; if(a<b){c=a+TEN*b; A[c/32] |= 1<<(c%32);}} //経路総数 int keirosu=0;for(n=0;n<N;n++)if( (A[n/32]>>(n%32))&1 )keirosu++; int *y=new int [keirosu+2], z[TEN], d=0,x,s=keirosu;; for(n=0;n<TEN;n++)z[n]=-1;for(n=0;n<keirosu+2;n++)y[n]=0; for(x=0;x<TEN;x++){ z[0]=x; while(1){ n=y[d]; if(n>=N){ if(d==0)break; z[d]=-1;d--;x=z[d]; A[n/32]|=1<<(n%32); s++;y[d]++;continue;} if( (A[n/32]>>(n%32))&1 ){ a=n%TEN; b=n/TEN; if(a==x){s--;if(s==0)goto end; x=b; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;} if(b==x){s--;if(s==0)goto end; x=a; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}} y[d]++;}} end:for(n=0;n<keirosu;n++)cout<<z[n]<<"→";}
826 名前:>>811 mailto:sage [2007/11/03(土) 15:17:37 ] もう少し悩んでみることにしました、ありがとうございました。 >>825 ソースまで公開して頂きありがとうございます。 じっくり読んで参考にします。
827 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:07:57 ] すみません。 struct
828 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:12:56 ] すみません。質問です。 struct AAA{ : : }; AAA* a = (AAA*)malloc(sizeof(AAA)*4); とコーディングしていたら客先の担当者からおこられました。 「一応サイズは保証されているけどそれはAAA a[4]ではない」、と。 C++では AAA* a = new AAA[4]で保証されていますの、といったら 「それはC++だからでしょ?」といわれました・・・・。 AAA* a = (AAA*)malloc(sizeof(AAA)*4);ってやっちゃいけないんですか?
829 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:19:04 ] a[4]と宣言できる状態なら、客先の反応が正しいかな。
830 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:24:50 ] >>828 べつに問題ないと思うけど。 固定長で、配列で済むところでmalloc()なんか使うなって意味かな? malloc()禁止だったら、可変長の配列はどうするんだろ。
831 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:31:19 ] >>828 それはそもそもCではエラーなわけだが。そのコードが通るなら、C++なのだからvectorかnewを使うべきだし。
832 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:32:26 ] 「AAA* a = new AAA[4]で保証されていますの」 口調に萌えた
833 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:33:57 ] C99
834 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:35:28 ] >>830 回答ありがとうございます。 言葉足らずでした。「構造体のmallocなんてありえない!」といわれたのを書くの忘れてました。 すみません。ついでに便乗質問なのですが (1) AAA aaa[30][30]; int x=...; int y=...; aaa[y][x]=...; (2) AAA aaa[30*30]; int x=...; int y=...; aaa[y*30+x]=...; で(2)の使い方をしていたらこれも理解しづらいということで怒られました。 2次元配列のほうが処理的にも良いのでしょうか。
835 名前:デフォルトの名無しさん [2007/11/03(土) 16:36:30 ] ここ見てると自分とのレベルの差が分かるんだが皆学生とかなのか? レベルの差ってのは自分よりすげーってことね
836 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:37:20 ] (1)でいい状況でわざわざ(2)を選ぶ神経がわからない。
837 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:38:02 ] そりゃ、特別な理由がないかぎりa[30][30]と書くべきだろう。
838 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:39:57 ] >>834 (2)が明確に処理的に優れてることを示せないのに(2)を選んだ理由は?
839 名前:デフォルトの名無しさん [2007/11/03(土) 16:40:15 ] 「構造体のmallocなんてありえない!」 callocを使えということかな?
840 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:40:49 ] >>834 いいえ、処理的にはどう考えても(2)の方が何かと都合がよいと思います。 私のところではパフォーマンスを要求する場合は(2)の形式でかつ、オフセット計算関数を用意することが多く、 そうでない場合には(1)の形式を配列の配列ではなく配列へのポインタ配列の形で使うことが多くなります。
841 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:46:45 ] >>834 > 言葉足らずでした。「構造体のmallocなんてありえない!」といわれたのを書くの忘れてました。 その担当者は、プログラム知らなさすぎなんじゃね?
842 名前:834 mailto:sage [2007/11/03(土) 16:46:55 ] >>838 処理的には a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思いそれなら最初から1次元で 計算したほうがよいのかなと思いまして。 >>839 担当者いわく、構造体の領域確保はできない、ない、ということらしいです。
843 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:49:51 ] >>842 >841に同意。後学の為に、その担当者の所属企業をお教え願えませんか?w
844 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:51:15 ] >>840 コードの可読性は(1)のほうがいいだろ。 パフォーマンスの問題なら、(2)のほうが何パーセント処理時間が短くなるとか、具体的な数字を見せて説得すれば いいんじゃね?
845 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:51:51 ] >>842 >処理的には >a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思いそれなら最初から1次元で >計算したほうがよいのかなと思いまして。 だからなんで「よい」と思うのか教えてくれ。
846 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:52:00 ] >>842 >a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思い コンパイラの最適化をなめてはいけない。 2次元配列のほうが、より最適化される可能性が高い。
847 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:55:06 ] >>840 >いいえ、処理的にはどう考えても(2)の方が何かと都合がよいと思います >>842 >計算したほうがよいのかなと思いまして 自分なら、思うだけじゃ、可読性を犠牲にする気にはならないな 実測して優位性を証明しる
848 名前:デフォルトの名無しさん [2007/11/03(土) 16:57:59 ] おまいらwwwここ見てみwwwwwww天才降臨wwwww 1 :以下、名無しにかわりましてVIPがお送りします。:2007/11/03(土) 14:02:12.45 ID:o3DHz8v00 id13.fm-p.jp/185/notkephir/ 裏絵バロスwwwwwwwwwwwww やあ、ここのBBSのパス解析できたら明日おにゃのことセックルできるお(^ω^ ) wwwww.2ch.net/test/read.cgi/news4vip/1194066132/698-698
849 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:06:48 ] int a[30][30]; int b[30*30]; int foo(int x, int y) { return a[y][x]; } int bar(int x, int y) { return b[y * 30 + x]; } gcc でコンパイルしたら、foo も bar も同じコードになった。 pushl %ebp movl %esp, %ebp movl 12(%ebp), %ecx movl 8(%ebp), %eax popl %ebp movl %ecx, %edx sall $4, %edx subl %ecx, %edx addl %edx, %edx addl %eax, %edx movl _a(,%edx,4), %eax ;または _b(,%edx,4), %eax ret
850 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:47:38 ] fseekについて教えてください。 fseekでファイルのヘッダ部分を飛ばしたいのですが fseek(fp,???,SEEK_SET); 4行飛ばしたい、というときは第2引数はどうすればいいのでしょうか? 4行をバイトにどう直すのかわからなくて
851 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:54:06 ] ワロタw
852 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:56:39 ] 1行を80バイトとしてCRとLFの2文字分を足して82バイト。 4行だから、82x4=328バイト分seekするというのはどうだろう?
853 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:01:55 ] >>852 ありがとうございます、やってみます >>851 やり方がおかしいのか、おかしいことを言っているのでしょうか? 普通はどうやるんですか?
854 名前:デフォルトの名無しさん [2007/11/03(土) 18:02:31 ] >>822 ありがとうございます。
855 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:10:11 ] >>853 1行が何バイトかは、その行を読み込んで改行まで数えないとわからないのが普通
856 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:10:58 ] >>853 オイオイw
857 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:20:44 ] でも、データをストリームとして扱うようになったのはUnix以降じゃなかったか? だからそれ以前の人ならそういう発想でも別に変でないかも。
858 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:51:46 ] 何とかできました。 >>855 普通はそうなのですか…結構アナログな感じなのですね ただ、すんません。疑問が増えました。 データをストリームとして扱う、の意味がわかりません
859 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:57:10 ] >> 850 現在位置を取得し、これをAとします。 getsを4回呼び出します。 現在位置を取得し、これをBとします。 fseekで現在位置をAの場所に戻します。 fseekB-Aバイト分現在位置を進めます。
860 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:58:30 ] >>858 「データをストリームとして扱う」というのは、普通にファイルを頭から順に読んでいくこと。 これに対して、「固定長のブロックとして扱う」やりかたがあって、 ひとつひとつのカタマリが同じ大きさの場合に、 fseekを使ってデータの開始位置にシークして、必要なデータのみを直接読み書きすることを言います。
861 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 19:24:43 ] >>859-860 ありがとうございました。 今まで何も理解せずにプログラムしてたのだと思い知りました。。。
862 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:41:45 ] KOUZOUTAI data[num]; と KOUZOUTAI *data data = (struct Point *)malloc( sizeof(struct Point) * num ); の違いって何なのでしょうか? どちらもnum分の構造体を確保していると思うのですが。 それとポインタの場合で二次元の構造体を確保する方法教えてください。
863 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:42:36 ] >>862 すません。 4行目はPointじゃなくて KOUZOUTAIです。
864 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:59:04 ] int data[10] と int *data = (int *)malloc(sizeof(int)*10) の違いと同じ。
865 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:00:33 ] 質問です。 ファイルの更新時刻を得るのってどうすればいいんでしょうか?
866 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:01:13 ] OS次第
867 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:07:28 ] 右クリック → プロパティ
868 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:17:23 ] >>866 標準ライブラリにそういう関数が入ってたりしないってことでしょうか
869 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:23:21 ] >>868 ファイルシステムに依存する情報なんで、標準には入ってない
870 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:23:32 ] >>864 んー その、構造体で宣言するのと、ポインタで宣言するのと利点があまりわからず あと2次元の構造体をポインタで確保する方法もお願いします
871 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:27:14 ] まず「二次元の構造体」を詳しく。 構造体の二次元配列をポインタで確保するのなら、普通の変数を二次元に確保するときと同様でいい。
872 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:28:40 ] スコープを跨ぐことができない・できるの違いぐらいじゃない? あと、後者の方が前者と比べると遅そうだけど、これは実装・環境に依存するのかな。
873 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:34:47 ] >>871 KOUZOUTAI data[10][10] のようなことです。 二次元配列をポインタで確保するやり方調べてきます。やったことなくて。 >>872 なるほど。 というと、グローバルでKOUZOUTAI data[10]とするのと同じような感じになるのでしょうか?
874 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:49:42 ] KOUZOUTAI (*data)[10]
875 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:25:23 ] struct e{ int value; }; int main(){ struct e **p,(*q)[5]; int i; //こんな方法とか p = (struct e**)malloc(10 * sizeof(struct e*)); for(i=0; i<9; ++i){ p[i] = (struct e*)malloc(5 * sizeof(struct e)); } //こんな方法がある q = (struct e(*)[5])malloc(5 * 10 * sizeof(struct e)); //こんな風に使う p[0][0] = 0; q[0][0] = 0; //忘れずに解放 for(i=0; i<9; ++i){ free(p[i]); } free(p); //qの方が解放は楽 free(q); return 0; }
876 名前:875 mailto:sage [2007/11/03(土) 23:26:22 ] 繰り返し部分間違えた for(i=0; i<9; ++i) ↓ for(i=0; i<10; ++i)
877 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:38:36 ] **ばっかりでわかりにくいなぁ。
878 名前:デフォルトの名無しさん [2007/11/03(土) 23:42:07 ] だいぶはしょりますが・・・ int i; char b; char a[] = "abcdefg"; scanf("%s",&b); while(b != a[i]) i++; ・・・略 みたいなbで打たせた文字をaの配列から探させるようなプログラムを書くとwhile文のところで、 「char型はchar*型に変換できない」 というエラーが出ます。どうすればbの文字ををaの配列から参照できますか? わかりにくくてごめんなさい
879 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:46:27 ] >>878 >534の下3行。
880 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:49:25 ] >>878 とりあえずそのようなエラーは出なかった
881 名前:デフォルトの名無しさん [2007/11/03(土) 23:50:30 ] >>879 ありがとうございます。%cにすればいいってことですか…?
882 名前:デフォルトの名無しさん [2007/11/03(土) 23:56:23 ] 878ですが、エラーはでなくなったのですがどうやらwhileで無限ループがおきている気がします。 上のプログラムだと、例えばscanfでdを打ったらiが3になった時点でwhile文から出るはずですよね?
883 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:57:23 ] iを0で初期化してる?
884 名前:デフォルトの名無しさん [2007/11/04(日) 00:01:00 ] >>883 しています。無限ループではなく他のどこかがおかしいのかもしれません。 もう一度しっかり見てみます。 ありがとうございました。
885 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:03:57 ] >>884 bにhを入れたらどこで止まると思う?
886 名前:デフォルトの名無しさん [2007/11/04(日) 00:06:17 ] >>885 そうなると無限ですか? でも実際はこの配列はa〜zで、cとかdとかを入れても次の動作にいきません。
887 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:04 ] whileに入る前にbに入ってる文字をprintfで確認したか?
888 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:12 ] 出来る限り、はしょらないで載せてくれ >>883 みたいな細々したことを指摘しないといけなくなるから
889 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:54 ] >>886 その実際のソースを書け
890 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:12:11 ] >>878 のソースで「char型はchar*型に変換できない」というエラーが出るというのが気になるんだが…… scanfの%指定ミスでこんなエラー出ないよな? せいぜい実行時エラーであって
891 名前:デフォルトの名無しさん [2007/11/04(日) 00:15:44 ] ごめんなさい #include<stdio.h> int main(void){ char a; char letter[] = "abcdefghijklmnopqrstuvwxyz"; int i = 0; printf("半角英小文字を1文字入力。:"); scanf("%s",&a); while(a != letter[i]) i++; printf("%s",letter[i]); return 0; } です。
892 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:18:27 ] scanf指摘されたところ直ってないじゃん
893 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:20:18 ] >>891 %sを%cに置換してこい。printf("%s",letter[i]);文字コードがポインタだと解釈されてしまう
894 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:20:29 ] returnの位置
895 名前:デフォルトの名無しさん [2007/11/04(日) 00:22:40 ] >>892 >>893 ありがとうございます。 >>894 何か場所おかしいですか?
896 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:23:01 ] >>892 直す前のを載せたんじゃないの? >>891 printf("%s",letter[i]); ↓ printf("%c",letter[i]);
897 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:23:21 ] バッファオーバーラン
898 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:26:45 ] >>897
899 名前:デフォルトの名無しさん [2007/11/04(日) 00:32:21 ] みなさんありがとうございます。 おかげでなんとかできました。 1つ気になるのですが"%c"と" %c"の違いはなんですか?
900 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 01:04:58 ] >>899 %cと%sの違いなら、 ・scanfの場合 %cなら、引数として渡されたアドレスの指し示す先に、標準入力からとってきた一文字を入れる %sなら、引数として渡されたアドレスの指し示す先を配列の頭と見て、文字列を入れていく。最後に\0を付加 ・printfの場合 %cなら、引数として渡された数値に対応した一文字を標準出力に出力 %sなら、引数として渡されたアドレスを配列の頭と見て、その指し示す先を\0にぶち当たるまで出力する
901 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 01:10:39 ] ' '
902 名前:デフォルトの名無しさん [2007/11/04(日) 01:22:51 ] >>900 ありがとうございます。 よくわかりました!
903 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 10:02:07 ] ところで、何が出来れば入門を卒業したことになるの?
904 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 10:25:43 ] 言語の文法マスターしたぜ!もう学ぶことねぇwwww ↓ え・・ポインタのポインタ?関数ポインタ?どうだったっけ? ↓ まだまだだな俺 ←この辺から入門卒業
905 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:07:39 ] >>904 それ面白いなw 初心者に教えてるつもりが逆に初心者から教わってることに気付いたあたりも入門卒業っぽいぜ。 もう一歩踏み込む気構えが出来た頃合がそうなのかもね。
906 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:37:37 ] >>904 俺的にはそこで、宣言の問題だと気がついたら卒業としたい。
907 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:44:38 ] 「このスレ卒業テスト」と称して課題を出せばいいんじゃね?
908 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:29:28 ] CでGUIアプリを作れたら入門者卒業
909 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:42:34 ] >>908 んなわけあるか
910 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:57:44 ] >>908 コピペで終わりじゃねーかw
911 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:17:19 ] ポインタが理解できたら入門者卒業
912 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:24:09 ] ポインタも *****pくらいついたらわけがわかりません。 const ***p ***const p とかなったらわかりません 関数ポインタなんて使ったことありません。なんで使うんですか。 GUIなんて作ったことなんてありません でも入門卒業したいです><
913 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:57:08 ] 関数ポインタの使い道が分からないなら卒業は無理だな
914 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 15:13:41 ] 関数ポインタは便利だけど、あまり使うことはないですよ。 私は、DLLを使うときくらいですかね。
915 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 15:17:29 ] 卒業せんでも中退すれば
916 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 15:37:45 ] typedef struct { char *str; int (*myfunc)(); } object; int main() { object obj; obj->str = malloc(sizeof(char) * 256); fgets(obj->str, 256, stdin); obj->myfunc(); puts(obj->str); free(obj->str); return 0; } int myfunc() { 〜 }
917 名前:915 mailto:sage [2007/11/04(日) 15:38:59 ] >>916 ×object obj; ○object *obj;
918 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:23:53 ] >>916 え、そんなやり方でmyfuncを呼び出せるの? いつ関数ポインタをセットした?
919 名前:916 mailto:sage [2007/11/04(日) 16:28:35 ] >>918 あー忘れてた。 obj->myfunc(); の前に、 obj->myfunc = myfunc; が必要だった。あかんね。
920 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:54:01 ] #include <stdio.h> int main(void) { int c; c = getchar(); printf("%d\n", c); c = getchar(); printf("%d\n", c); return 0; } このプログラムをBCC5.5.1でコンパイルして実行し、"a"と"Ctrl+Z"を1度に入力した場合、 D:\c\my\test2>test2.exe a^Z 97 -1 このような結果になりました。 ところが、VC++2005EEのcl.exeでコンパイルし、同じように実行すると、 D:\c\my\test2>test2.exe a^Z 97 26 このような結果になります。なぜVC++20005では正しい結果が得られないのでしょうか。
921 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:59:04 ] fflush(stdout); これを main の return の前に。
922 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:06:20 ] *p (*p) の違いがわかりません><
923 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:07:39 ] あっそ
924 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:08:00 ] 教えてください><
925 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:10:33 ] >>920 stdinの初期設定が違うんじゃね? ^C が受けられるかどうかの設定もできるし。 あるいは ^D とか。
926 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:10:56 ] >>922 1+2 と (1+2) の違いを考えてみるといいよ
927 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:17:19 ] >>926 ありあとやんしたー
928 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:44:16 ] >>920 コレってマジ? なんで今更こんなバグが残ってんの?
929 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:52:38 ] >>921 そのようにしても結果は変わりませんでした。 >>925 どうやって設定すればいいのでしょうか?
930 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 19:11:13 ] >>928 うちでも確認できた。これはひどいな。
931 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 19:22:15 ] そこは仕様では決められてない部分だから、 バグだとか、どっちが間違ってるとかでは無いんじゃね?
932 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 19:55:34 ] >>931 でも、stdio.hでは#define EOF (-1)となっているし、^Zだけならちゃんと-1と表示される。
933 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:55:14 ] そうじゃなくて EOF の前に一応 ^Z も発行するかどうか。
934 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 21:57:55 ] >>921 プログラム終了時に、標準入出力もふくめてファイルは全部フラッシュ&クローズされるから、 それは意味ない。
935 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:20:44 ] num[4][5]={ {0,1,2,3,4}, {5,6,7,8,9}, {10,11,12,13,14}, {15,16,17,18,19} }; 関数に配列の{5,6,7,8,9},とかを1行だけ送りたいのですが どういう風にやればいいのでしょう?
936 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:41:03 ] 送るだけならnum[1]とかを渡すだけ。
937 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:59:13 ] EOFについて。 MSのドキュメント調べたけど、記述が見つからなかったので仮説。 てゆーか、コマンドプロンプトの制御文字に関する仕様のドキュメントてどこさ? 行頭にある^Zはコマンドプロンプトが解釈してプログラムに「データ無し」を通知する。 行中にある^Zは文字「0x1A」をプログラムに通知する。 という理由で>>932 な動きをするっぽい。 ここはコマンドプロンプトの仕様だと思うんだけど、文献ミツカンネ。 stdinをバイナリモードで開くと同じ挙動をするので、 テキストモードでのデータ中の0x1A(制御コードのEOF)の扱いの差のようだ。 バグというよりは仕様の範疇っぽいね。 0x1Aを含むファイルをテキストモードでオープンして読んでみれば もうちょい分かりそうなんだけど、データ作るのめんどかったんで誰か頼む。 ○ バイナリで開き直したサンプル #include <stdio.h> int main() { int c; freopen("CON", "rb", stdin); do{ printf("%d\n",c = getc(stdin)); }while(c != EOF); return 0; }
938 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:10:31 ] >>936 受け取る方を1次元にしてやれば、まとめて受け取られるんですね。 できました!ありがとうございました!
939 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:18:03 ] >>937 VC++2005でもファイル中の0x1Aは、getcで読んだらEOFが返ってきた。 やっぱバグじゃねーの?
940 名前:デフォルトの名無しさん [2007/11/04(日) 23:24:30 ] Turbo Explorer 無償のアプリケーション開発環境 www.forest.impress.co.jp/lib/stdy/program/progdevenv/turboexplor.html
941 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:27:37 ] むぅ…すんません 今度は num[4][5]={ {0,1,2,3,4}, {5,6,7,8,9}, {10,11,12,13,14}, {15,16,17,18,19} }; の 0 5 10 15 の縦の列の総和を出したいだけなんですが これも丸々関数に送りたいのです。。。 1次元配列にいっそのこと退避させたほうがいいんでしょうか
942 名前:デフォルトの名無しさん [2007/11/04(日) 23:36:02 ] numごと渡して計算せよ
943 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:42:07 ] numがココでは小さいんですが 1000×1000と大きい場合を想定しています。 numごと渡したら、メモリがムダに消費されるとかポインタの解説ページとかで見た気がして
944 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:44:37 ] それならなお更numを渡せ
945 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:44:40 ] numごとって、本当に渡すわけじゃないぞ。アドレス渡すだけだから。
946 名前:デフォルトの名無しさん [2007/11/04(日) 23:47:36 ] >>941 一次元配列を使うと32*1000バイト消費するが そのままだと何も新規に生成しないから0バイトで済む
947 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:50:24 ] 何かもう一個同じモノが作られるっぽいことが書いてあって、怖気づいてました。 ところでnumそのものの値も更新したい場合は、参照渡しするのですよね?
948 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:51:17 ] 本当にnumそのものの値を変更したいのか?
949 名前:デフォルトの名無しさん [2007/11/04(日) 23:53:11 ] C言語はふつうにやると配列は参照渡しになる コピーを渡す方は難しい
950 名前:デフォルトの名無しさん [2007/11/04(日) 23:57:50 ] クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
951 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:10:49 ] >>948-949 すみません。。。混乱してきてしまって。 今は総和だけ求めてるのですが やりたいのは行で計算をして、その行の値を全部更新して その更新された状態で列を計算して、全部の列を更新するということをしようとしてます。 配列と関数の関係をやりなおしてきます。
952 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:31:26 ] >>951 それならなおさらアドレス渡しでいいじゃん
953 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:38:26 ] >引数の引き渡しには,値渡しと参照渡しがある. >C言語では,特別なことをしない限り,変数は値渡し,配列は参照渡しになる 今まで配列も値渡しだと思っていました…納得できました。 ありがとございましたー
954 名前:920 mailto:sage [2007/11/05(月) 11:44:12 ] 検証してくださった方、ありがとうございます。 #include <stdio.h> int main(void) { int c; do { printf("%d ", c = fgetc(stdin)); } while (c != EOF); return 0; } このプログラムを実行し、 コマンドラインから"abc^Zdef"を入力すると、(^ZはCtrl+Z) D:\c\my\test5>test5.exe abc^Zdef 97 98 99 26 と表示され、入力待ちになります。
955 名前:920 mailto:sage [2007/11/05(月) 11:44:52 ] それに対して、 61 62 63 1A 64 65 66 の内容のテキストファイル(↑は16進ダンプしたもの)をstdinにリダイレクトして 実行してみたところ、 D:\c\my\test5>test5.exe < test.txt 97 98 99 -1 このような結果になり、プログラムが終了しました。 プログラムは全てVC++2005でコンパイルしました。 どうやらコマンドラインの行中にEOF(0x1A)があった場合、 stdio.hで定義されたEOF(-1)ではなく、 テキストファイルでのEOF(0x1A)として読み込むようです…。 BCC5.5.1ではどちらの場合も、 97 98 99 -1 と表示され、プログラムが終了します。
956 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 12:56:46 ] 製品版では直ってるのかな。 一応、MSに報告したらどうだろ。
957 名前:デフォルトの名無しさん [2007/11/05(月) 13:09:38 ] 別にエラーじゃないのでは? EOFのASCIIコードを表示しているのだから
958 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 13:11:09 ] EOFのアスキーコードじゃないよ。
959 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 13:12:35 ] EOF じゃなくて SUB だな。 つーか単なる ^Z だが。
960 名前:920 mailto:sage [2007/11/05(月) 13:52:32 ] >>958 >>959 ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB >ASCIIでは例えば、改行文字は0x10、水平タブは0x09、EOF(End Of File、ファイル終端マーク)は0x1Aである。
961 名前:920 mailto:sage [2007/11/05(月) 14:01:52 ] >>957 コマンドラインの行頭にあるEOFや、リダイレクトされたファイルにあるEOFは stdio.hに定義されたEOF(-1)と読み取ることを考えると、一貫性が無いように思えます。
962 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 14:12:08 ] ASCII に EOF なんて無いだろ。 それ書いたの誰だよ? ttp://e-words.jp/p/r-ascii.html ttp://ja.wikipedia.org/wiki/ASCII ttp://www.mew.org/Newsletters/6.html
963 名前:デフォルトの名無しさん [2007/11/05(月) 18:42:18 ] そりゃ、文字コード体系表見てもEOFなんてあるわけないわな。
964 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:29:32 ] c言語の除算はどのようなアルゴリズムで行っているんでしょうか? わかる方がいればよろしくお願いします
965 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:03:20 ] >>964 コンパイラによるんじゃないでしょうか。 あと、たぶん、かなりアセンブラよりの質問だと思います。
966 名前:デフォルトの名無しさん [2007/11/05(月) 22:04:36 ] CPUよりの話でしょう 浮動小数点や整数演算はハードでします
967 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:09:11 ] テキストモードでfopenしたら0x1aで終了だろ
968 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:13:31 ] いつまで、CP/Mの呪いをひきづらなければならないのやら。
969 名前:迷い人 [2007/11/05(月) 22:36:25 ] こんばんは。つぎのようなプログラムがわかりません 1を入力すると x 2を入力すると x xx x 4を入力すると x xx x xxx x xx x xxxx x xx x xxx x xx x となるようなものです。途中まではかけたのですが肝心なところがよくわかりませんでした。 途中までは次のようになりました
970 名前:迷い人 [2007/11/05(月) 22:37:28 ] #include <stdio.h> void X_sequence (int n); void X_triangle (int n); main() { int n; printf("Enter a number : ") scanf("%d",&n); X_triangle(n); } void X_sequence(int n) { int i; for (i=1; i<=n; i++) printf("X"); printf("\n"); } void X_triangle(int n) {・・・・こっからわかりません! 教えてくださいおねがいします
971 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:39:06 ] if (n > 2) X_triangle(n - 1); X_sequence(n); if (n > 2) X_triangle(n - 1);
972 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:39:22 ] printf("1を入力すると\n x\n 2を入力すると\n x\n xx\n x\n 4を入力すると\n x\n xx\n x\n xxx\n x\n xx\n x\n xxxx\n x\n xx\n x\n xxx\n x\n xx\n x\n ");
973 名前:デフォルトの名無しさん [2007/11/05(月) 22:39:38 ] if (n >= 2) X_triangle(n - 1); X_sequence(n); if (n >= 2) X_triangle(n - 1);
974 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:01:21 ] ふとオープンソースの午後のこーだのソース見てみたら、C言語だったけど、 どれくらい経験つめばこれくらい書けるようになるんですかね・・・
975 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:15:15 ] >>974 5000時間くらい。
976 名前:デフォルトの名無しさん [2007/11/06(火) 00:19:12 ] すいません、質問させてください。 rand関数とか、abs関数とか、stdlib.hで宣言されてるってことを聞きました。 で、stdlib.hを探してみて実際に見たところ、確かに宣言されてたんですが、 これら関数の実体って、どのファイルに定義されているんでしょうか。 もしくは、ソースファイルはついてないんでしょうか?(当方Mac OSXです) 見てみたいな、と思いまして・・
977 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:27:18 ] >>976 そういう関数はライブラリに中身がある ヘッダーには呼び出しかたが書いてある。 実体を見たいなら、使ってるコンパイラメーカーに聞くしかない。
978 名前:976 mailto:sage [2007/11/06(火) 00:31:18 ] >>977 早速のお返事ありがとうございました!了解です。
979 名前:デフォルトの名無しさん [2007/11/06(火) 00:33:50 ] scanfを使って整数型の変数に1〜100の値を入力された時のみ 続く処理をして、それ以外は再度入力を促すプログラムを作りたいです。 入力された値のエラーのチェックにはどんな処理が必要か わからないので教えてください。 あと数値を入力してEnterを押して実行したあとに 前回入力した数値が残ったままになっているのを 消すにはどうすればいいですか?
980 名前:デフォルトの名無しさん [2007/11/06(火) 01:14:14 ] >>979 #include <stdio.h> int main() { int num; char buff[12] = {'\0'}; do{ puts("1〜100の数値入力"); fgets(buff,sizeof(buff),stdin); sscanf(buff,"%d",&num); }while(1 >= num || num >=100); /* 1以上100以下の数値が入力されたときの 処理をここに書けば〜 */ return 0; }
981 名前:980 mailto:sage [2007/11/06(火) 01:35:49 ] 訂正 while(1 >= num || num >=100); ↓ while(1 > num || num >100);
982 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 01:58:33 ] scanfっつてんだから、scanfを使うべきなんじゃなくて? 俺ならこう書くぞ } while (!(1 <= num && num <= 100));
983 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:02:57 ] 論理演算が苦手そうに見えてもいいならそれでいいんじゃね?
984 名前:デフォルトの名無しさん [2007/11/06(火) 02:30:32 ] すいません。 !についての質問なんですが、 if ( !(fp = fopen("a.c","r")) ) もしこれでfpがNULLでない場合(どこかのメモリアドレスつまり正の整数値)、 if文が偽(つまりNULLつまり0)となると思うのですが、 何故、!(正の整数値)がNULLつまり0になるのですか??ANSIのそういう仕様ですか? if ( !5 )は偽でNULLつまり0?? (ちなみに、現在ほとんどのstdio.hで #define NULL 0 となっている)
985 名前:デフォルトの名無しさん [2007/11/06(火) 02:33:54 ] !5といえば 1も2も3も・・・負数でさえ含まれますよね。0ももちろん含まれますが
986 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:47:08 ] #include <stdio.h> int main(void) { FILE *fp; if ( fp = (FILE*)(NULL == NULL)) ; printf("fp = %p\n", fp); printf("(int)fp = %d\n", (int)fp); printf("!5 = %p\n", !5); return 0; } 結果 fp = 0x1 (int)fp = 1 !5 = 0x0
987 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:58:34 ] NULL == NULLは真だから1が返るな
988 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 05:52:39 ] >>985 !5は「5以外」じゃないよ。 5を真偽値として評価して真、その否定で結果偽。そんだけ。
989 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 09:23:16 ] 5以外は !=5 だわな。
990 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:06:26 ] レビューってどうやってやってる・・・? なんか自分で書いたソースなのに、うまく説明できなくて凹みまくってる・・・。 頭の中じゃどんな風に動くのかわかってるんだけど、説明となると10あるうち2しか伝える事ができない・・・
991 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:41:32 ] 君が超天才ならしょうがないけど、 凡人なら説明できない程度の理解としか周囲には写らないだろうよ。 誰にでも納得できる説明をする必要があるの? 仕事でレビュア対象に説明するだけなら、レビュアに疑問点・不明点を上げてもらって それに回答することで納得して貰うのじゃダメ? レビューの経験を積めば、レビュアの傾向が見えて対策も打てるけど、 例え経験不足だとしてもレビューの前に事前にレビュアと調整しておくって手もある。 凹む前にもっと考えて行動すべきだと思うけどね。
992 名前:979 [2007/11/06(火) 22:43:34 ] >>980 >>981 >>982 色んなサンプルソース読んでみても scanfはあまり使われてないみたいなので gets,fgetsに変更してみようとおもいます。 なぜなのかは、ぐーぐるさんに聞いてきます ありがとうございました
993 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:55:21 ] >>991 あ、えーと、 現状まだまだ勉強の段階なんですが、 int main(void) じゃあそのvoidってナニ?なんでここにintとかおいてるの?っていう いわば基礎中の基礎の部分なので、プログラムに一切関係のない人でも理解できるように発言して欲しい=学べる ということなのでやってるんですが、経験をとにかく詰むしかないんですかね・・・うーん。
994 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:20:34 ] 自分で書いたソースを客観的に見ることができないなら、他人に見て貰うといい。 相談できる人が身近にいればその人に協力して貰うのがいい。 相談できる人がいない、探す気もないならここにソース晒してコメントを貰うのでもいいんじゃね?
995 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:50:36 ] 少しお尋ねしたいのですが、 struct _TEST a { int num; char ch; }test[100] = {0}; こうした場合、test配列の中身が全て0クリアされる動作は保証されていますか? testが配列でない場合は動作が保証されているとどこかで伺った気はしたのですが
996 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:10:58 ] 保証されている。ついでに言えばtest[100] = { 1 };として場合であっても 1が入るのはtest[0].numだけであって、残りは全て0になる。
997 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 01:06:24 ] >>996 ありがとうございます!
998 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 04:38:52 ] www.geocities.jp/horie_ryu/page01/trans.c こちらのプログラムをVS2005でそのまま実行しても'fopen'の宣言を確認してくださいと出ます。 同HP (ttp://www.geocities.jp/horie_ryu/page01.html) にあるc1.wavやらを読み込ませて実行したいのです。 fopenで配列を読んでいるのですが、ここにどうやってc1.wavなどを読み込ませればいいのでしょうか?
999 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 05:12:45 ] 調べてたらコマンドラインで実行すらしらなかったのでなんとかなるかもしれないので失礼します。すみません。
1000 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 05:29:05 ] 1000げっつ
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。