- 1 名前:デフォルトの名無しさん [2009/12/15(火) 23:42:55 ]
- C言語の*入門者*向け解説スレッドです。
★前スレ C言語なら俺に聞け(入門編)Part 57 pc12.2ch.net/test/read.cgi/tech/1260020924/ ★過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000 ★初心者、初級者の方は他の質問スレのほうが良いかもしれません。 例えば 【初心者歓迎】C/C++室 Ver.70【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1258873470/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 133代目 pc12.2ch.net/test/read.cgi/tech/1260532772/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
- 558 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 22:59:09 ]
- whileとSleepを使わずに
変数の値が変更されたときに自動で関数に飛ぶことって出来ないんですか? atexit()みたいな感じに
- 559 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:00:00 ]
- >>558
環境依存なのでOS等の情報が必要です
- 560 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:02:39 ]
- atexitは自動じゃないよ
- 561 名前:デフォルトの名無しさん [2009/12/26(土) 23:09:56 ]
- if ((flag & BIT1) && (flag & BIT2)) {
これをもう少しスマートにやる方法ないですか?
- 562 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:16:03 ]
- コンパイラに最適化してもらいたい気分だ
- 563 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:22:17 ]
- すいません。
codepad.org/3p4Q55et 本に書いてある内容を要約するとこんな感じになるんですが、 ( !feof( stdin) ) というのは一体何を表しているのでしょうか。 stdinの中身がEOFにならなかったら〜という風に読めるのですが、 stdinとはcfPtrを指しているのでしょうか? stdinでググると標準入力だというようなことが出てくるのですが、 標準にそのままキーボードから打たれたものがEOFになったら〜という意味でいいのでしょうか?
- 564 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:28:05 ]
- >>563
戻り値 feof は,指定したストリーム上の最後の入力操作でファイル終了標識が 検出されると 0 以外の値を返し,ファイル終了標識に達しなければ 0 を返します。 とあるから、標準入力からWindowsならCTRL+Z、Unix系ならCtrl+Dが押される と !演算子によって条件が反転し真になる
- 565 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:28:18 ]
- >>561
ビットフィールドを使う
- 566 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:29:12 ]
- >>563
そうだよ。 ソースに書いてある通り、ctrl-zでEOFが入力される。
- 567 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:29:46 ]
- >>561
それぞれ1bitなら if ((flag & (BIT1|BIT2)) == (BIT1|BIT2))
- 568 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:34:42 ]
- >>564>>566
標準にキーボードから入力していてEOFが検出されなかった場合〜という意味ですね。 ありがとうございました。
- 569 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:37:40 ]
- キーボードとはかぎらないしCtrl-Zともかぎらないがな
- 570 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:42:21 ]
- >>569
すいませんどういう意味でしょうか?
- 571 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:46:41 ]
- >>570
ファイルからリダイレクトとか。
- 572 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:46:47 ]
- >>570
パイプやリダイレクトとか
- 573 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:47:47 ]
- >>570
C言語にはストリームという概念がある。 ここに結び付けられるものは何でも良い。ファイルでも入出力デバイスでもC言語から見れば一緒。 ただ、一般的なPCではディスプレイ、キーボードが付いてるので"デフォルト(標準)"をそこにしてあるだけ。 標準入力がシリアル通信ポートだったり、標準出力がファイルだったりする環境もあるってこと。
- 574 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:53:40 ]
- >>558
あきらめてアクセサメソッドを介して変数を参照するようにしてはいかがでしょうか。
- 575 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:54:09 ]
- DOSやWindowsならCtrl+ZだがUNIX系ならCtrl+Dだったかな
- 576 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:58:10 ]
- >>571->>573>>575
入力できればなんでもいいってことですか、ありがとうございました。
- 577 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 00:00:00 ]
- 何でもいいわけじゃない
何が割り当てられてるかだ
- 578 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 15:46:46 ]
- >>567
その前提条件って必要なの?
- 579 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 16:11:57 ]
- >>567
&&がなくなるから、速くはなりそうな気もするけど、 最適化でチャラになるかもしれないし、読みやすさなら 元のコードのほうがいいと思う。
- 580 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:48:47 ]
- main(){
char hello[] = {'h', 'e','l','l','o'}; puts(hello); } 結果がおかしくなります
- 581 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:50:48 ]
- char hello[] = {'h', 'e','l','l','o'};
じゃなくて char hello[] = {'h', 'e','l','l','o','\0'};
- 582 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:58:22 ]
- >>581
ありがとう、期待する動作になりました。
- 583 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:58:27 ]
- もしくは
char hello[] = "hello";
- 584 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 00:10:13 ]
- >>578
例えばBIT1が ((1<<0)|(1<<1)) だった場合 flagの下位2bitがそれぞれ 01,10,11 のどれであっても (flag & BIT1) は非0になるが (flag & BIT1) == BIT1 となるのは、11の場合のみ。 >>579 普通は"(BIT1|BIT2)"をそのまま使うなんてやり方しないよ。 const mask = BIT1 | BIT2; // constじゃなくてdefineだろうがenumだろうが構わんが。 if ((flag & mask) == mask) これを可読性が悪いとか言うならどうかしてる。 元の >if ((flag & BIT1) && (flag & BIT2)) { よりわかりやすいだろうに。
- 585 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 01:03:34 ]
- どっちも特に難解な記述だとは思わないけどさ
(1) if ((flag & mask) == mask) (2) if ((flag & BIT1) && (flag & BIT2)) どうみても(2)の方が分かりやすい
- 586 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 03:31:36 ]
- うーん、どうだろう
個人的には識別子が1個少ない分、(1)の方が読みやすい
- 587 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 03:40:46 ]
- ビット演算には三項演算子を使うべきだと思う
- 588 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 04:30:39 ]
- >>585
どうみても(2)の方が分かりやすいよね! (1) auto hoge_mask=BIT1|BIT2|BIT3|BIT4|BIT5|BIT6|BIT7|BIT8|BIT9; if((flag&hoge_mask)==hoge_mask) (2) if((flag&BIT1) && (flag&BIT2) && (flag&BIT3) && (flag&BIT4) && (flag&BIT5) && (flag&BIT6) && (flag&BIT7) && (flag&BIT8) && (flag&BIT9))
- 589 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 05:52:52 ]
- mask)==mask 部分が冗長に見えるから違和感感じるんDA
!^(flag|^mask) // こうだな
- 590 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 06:29:05 ]
- >>589
ドモルガン使ってこう書いた方が見た目は奇麗。 !(~flag&mask) まぁ~maskは定数になるだろうから>>589と計算量は殆ど同じだろうけど
- 591 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 10:39:41 ]
- ビットビットうるせーよ
- 592 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 10:54:10 ]
- >>591
禿同 可読性云々以前にコメントつければすむ問題
- 593 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:02:08 ]
- 今の時代、ビットフラグなんて使わないでフラグごとに変数使うんじゃねーの?
- 594 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:38:36 ]
- >>593
時代は関係ないし、それいうならC使う事自体がどうなんだって話に。 移植性考えないならビットフィールドでもいいかも知れん。
- 595 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:14:55 ]
- >>594
ただのフラグならビットフィールドでも移植性は関係無いだろ。
- 596 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:51:33 ]
- 移植性考えるなら、ビットフィールドのほうがいい。
- 597 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:58:56 ]
- やりたいことが
フラグAが立つ、かつ、フラグBが立つ なのか ビットAとビットBの両方がセットされてる なのかで使いわけろよ フラグの実装がビットだからビット演算使うのは短絡的
- 598 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 13:00:28 ]
- 移植性考えるならドトネトのほうがいい
- 599 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 13:56:28 ]
- 上位ビット/下位ビットのどっちから割り振られるかが処理系次第な
ビットフィールド使うくらいなら、_Bool 使えばいいのに。
- 600 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:07:42 ]
- ビットフィールド云々は置いといて、
ビット演算についてだけ言えば if (value & 0x0001) 奇数かどうか、を見るこれだけでも ビット演算はコメントを必ず入れるべきと思う。
- 601 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:11:17 ]
- >>599
> 上位ビット/下位ビットのどっちから割り振られるかが処理系次第な どんなもん、どっちでもいいだろ。
- 602 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:11:21 ]
- 思わない
- 603 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:11:28 ]
- ビットビットうるせーよ
- 604 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:12:30 ]
- 思う気がする
- 605 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:22:14 ]
- コメントよりマクロの方がいいだろ
if(IS_ODD(value))
- 606 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:23:20 ]
- ♪ひ〜とびと〜のビットビット〜
- 607 名前:デフォルトの名無しさん [2009/12/28(月) 14:40:05 ]
- ビット命
- 608 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 15:02:13 ]
- >>602
どっちでもいいだろ。 問題になるのはハードにマップされてるとかそういう時だけで、フラグで使ってるだけならメモリの配置は関係ない。
- 609 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 16:40:37 ]
- どっちでもいいね
- 610 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:06:00 ]
- いいんじゃないかな。どっちでも
- 611 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:20:29 ]
- 1bit毎のビットフィールドならエンディアンの影響は受けないでしょ。
- 612 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:30:26 ]
- ビットビットうるせーよ
- 613 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 19:37:07 ]
- Cのスレだから仕方ないだろjk
- 614 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 19:57:03 ]
- ある整数の最上位の1であるビットが何桁目かを計算したいんだけど一発で計算剃る方法ってある?
ビット数分だけ判定繰り返すしかないかな
- 615 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:15:24 ]
- あっぱれビット天国〜
- 616 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:05:18 ]
- >>614
どんな方法があるのか教えてくれたら教えるお(´・ω・`)クフゥ
- 617 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:10:45 ]
- 一発じゃないけど
最上位ビットの位置が記された256個のテーブルを使う
- 618 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:13:18 ]
- log をとるとかw
- 619 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:27:10 ]
- 人間の性能を表現するには何ビットあればいいですか?
- 620 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:33:57 ]
- 冬休みか
- 621 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:52:03 ]
- どうしたの?君たち
警戒心起たせちゃって
- 622 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 23:00:34 ]
- >>614
他人に作らせるのがもっとも賢い方法
- 623 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 23:13:11 ]
- >>614
32bit なら 5回 下の関数みたいなのをマクロで作ればおk int leftbit(unsigned long x) { int bit=0; if(x&0xffff0000) bit+=16,x>>=16; if(x&0xff00) bit+=8,x>>=8; if(x&0xf0) bit+=4,x>>=4; if(x&0xc) bit+=2,x>>=2; if(x&0x2) bit+=1,x>>=1; return bit; }
- 624 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 23:27:01 ]
- みんなレスd
>>623 それいただきます!
- 625 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:11:44 ]
- みんなが笑ってる
お日様も笑ってる るーるるるるっるー 今日もいいテンキー だからどうしたというのですか。 っていうか何故テンキーが重要なのですか。
- 626 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:15:03 ]
- ループしたらええやん
for(bit=0; result != 1; bit << 1){ result = (BITCHECK & bit); }
- 627 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:16:01 ]
- 最上位か
ほな逆にMSBから
- 628 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:32:48 ]
- >>626
え?
- 629 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:36:01 ]
- result = (int)ceil(log((double)x) / log(2.0));
実数演算だけど、logで計算したほうが、条件分岐が入るより速いんじゃないか?
- 630 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:15:06 ]
- こういうときに、キャリーフラグの便利さを思い出す。
- 631 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:17:50 ]
- 実数は誤差が入るからダメ
- 632 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:18:35 ]
- 誰か超高速なreplace関数作ってけろ
- 633 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:33:09 ]
- >>631
>>629は誤差とは関係ないだろ。
- 634 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:46:19 ]
- >>633
すまん。俺が間違ってたorz
- 635 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 02:28:38 ]
- >>633
なんで誤差とは関係ないの? 浮動小数点演算である以上、誤差はあるはず 誤差が1未満だから ceil()で消えるってこと? >>629 ceil じゃなくて floor じゃないの?
- 636 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 03:11:06 ]
- >>635
そう。 整数部にまで及ぶような誤差がでないと結果に誤差が反映しない。 はるか下のほうの桁にしか、誤差はでないと思われ。 よくみたら、切り上げだと桁が繰り上がるところで正しい結果がでないね。 +1してfloor()だ。
- 637 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 08:37:44 ]
- #define mx(a,x,m,b) ((x)&m>(x)~m?(x)&=m,(a)|b:(x)&=~m,(a))
mx(mx(mx(mx(mx(a,x,0xaaaaaaaa,1),x,0xcccccccc,2),x,0xf0f0f0f0,4),x,0xff00ff00,8),x,0xffff0000,16);
- 638 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 08:40:37 ]
- >>637
あ、だめだx変わんね!
- 639 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 08:49:40 ]
- >629
浮動小数点数使うんなら frexp(x, &result) でいいじゃん。
- 640 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 10:21:01 ]
- >>623 >>629 >>639 で簡単にベンチとってみた。
ビットが立っていない場合が 0 になるように一部変更してる。 codepad.org/VT7XBJAP Core2Duo T7600(2.33GHz) / RAM 3GB gcc version 4.3.4 20090804 (release) 1 (GCC) 最適化オプション指定なしで 50,000,000 要素に対して 10 回実行した平均値だと >>623 1.4564秒 >>629 6.2842秒 >>639 1.5501秒 -O2 指定で >>623 0.6673秒 >>629 6.0827秒 >>639 1.2921秒
- 641 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 10:57:31 ]
- logって中の人がフーリエ展開とかしてるからおそいのかね?
- 642 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:09:46 ]
- >>637 を推考し直してみました
#define mx(b,m,x,a) (x&m>x&~m)?(a)|b,(a)) =mx(1,0x55555555,x,mx(2,0xaaaaaaaa,x,mx(4,0xf0f0f0f0,x,mx(8,0xff00ff00,x,mx(16,0xffff0000,x,0)))));
- 643 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:15:41 ]
- expは兎も角logは余り使われないから金がかかっておらず相対的に
「計算」が早くは無い。CPUレベルのサポートで 並列化を促進すれば何倍も速くなる筈だが、コストパフォーマンス が低くやる価値が少ないと判断されてるだけ。
- 644 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:35:42 ]
- さすがに6秒も差が出来ると主任も「ウーム」と改善を要求してくるレベル
- 645 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:39:10 ]
- >>644
「試行回数を減らせば早くなりますよ!」
- 646 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:40:56 ]
- >>644
回数が少なければ「わかりやすい」コードがお勧め
- 647 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:45:41 ]
- え?一番早い方法を模索してるんじゃないの?
- 648 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:49:19 ]
- ウチの上司は元組み込み屋なので
「呼んだ関数が処理してる時間は極力短く」 「呼んだ関数だけじゃなく処理時間そのものも極力短く」 「デッドラインを設ける」 とまあ常に組み込み状態 すべての処理コードが割り込みの考え方で動いてる (他の誰も入って来れない時間を短く=CPU占有の時間を短く)
- 649 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:51:04 ]
- >>641
底の変換してからFYL2X使ってるみたい 二回計算しないといけないから遅いのかもね
- 650 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:52:53 ]
- つーかあれか
logは底がネイピア数だからそのままFYL2Xでいいのか その周囲の面倒臭いコードはDOMAIN ERRORとかチェックしてるだけか そうなるとlog10ならもっと遅いだろうね
- 651 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 12:00:37 ]
- >>648
昔組み込みやってた 小さいものはパズルみたいで楽しかったけど 大きなものだと死にそうになるんだよな・・・・
- 652 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 13:09:09 ]
- >>651
なるね
|

|