[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 05/09 23:32 / Filesize : 137 KB / Number-of Response : 653
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門編)Part 58



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++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

511 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 01:48:43 ]
ソートのプログラムを組んだのですが、コンパイルしようとすると
report5.c : 7 : error : syntax error before numeric constant
というエラーが出ます
どう修正したらいいのでしょう?

ソースは以下です
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10302.c


512 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 01:57:49 ]
>>511

> #define N 50
>
> void sort(int x[], int N)

#defineでシンボルNを定義しているので、2行後が

void sort(int x[], int 50)

と置換される。

513 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 02:27:34 ]
>>512
深夜にありがとうございます!
仮引数になっていないのが原因だったってことでしょうか?

Nを小文字のnに変えてもみたのですが、今度は
report5.c : In function `sort':
report5.c : 9 : error : 'x' redeclared as different kind of symbol
report5.c : 7 : error : previous definition of 'x' was here
と出てしまいました…

ググってみるとxが衝突してるとのことですが、関数部とデータ入出力部の両方でxを使用しても問題ないはずですよね?

514 名前:511 mailto:sage [2009/12/24(木) 02:39:11 ]
連投すみません!
自己解決しました

どうやら7行目と9行目の両方で変数xを定義していたのが問題だったようで…
>>512様ありがとうございました

515 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 12:57:05 ]
食ったー
満足じゃー

516 名前:デフォルトの名無しさん [2009/12/25(金) 10:34:07 ]
問題文: kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10305.txt
linuxで、g++でemacsで書いて、k-termでコンパイル。


すみません。今日締切の問題で、スレ違いかもしれないんですが、どうかスレ主さま、作ってください。

お願いします。

517 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 10:38:26 ]
宿題スレがあるのにスレ違いと分かっててなんで質問するんだ?あほ?
このスレの方が勢いがあるから?当然のようにageてるし

518 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 10:46:10 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/442

酷いマルチ>>516のほうが後ってのが特に

519 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 10:54:38 ]
大抵宿題スレも見てるから、ここにマルチすると逆効果なんだけどね



520 名前:デフォルトの名無しさん [2009/12/25(金) 13:46:35 ]
>>517,518,519
すみません。すれ違いでした。でも本当に急いでいて・・

みなさん、無駄にスレ使ってしまってすみませんでした。

521 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 13:50:14 ]
>>520
逆効果なんだけど特別に許してあげるよ
感謝すればね

522 名前:デフォルトの名無しさん [2009/12/25(金) 14:11:41 ]
>>521
はい。

523 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 14:16:28 ]
書き込めば書き込むほど、答えが返ってくる確率が下がるんだがw

524 名前:デフォルトの名無しさん [2009/12/25(金) 17:01:15 ]
sprintfのところでエラーもでず勝手にPGが終了されるんだがなんだこれ?

525 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:03:53 ]
ソース見せてみ

526 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:07:18 ]
すみませんうつし先のバッファサイズが足りてなかったみたいデス
しかし何も出ず終了とは

527 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:07:36 ]
バッファ足りてないとか

528 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:08:36 ]
バッファ足りてないとか

529 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:08:37 ]
おぉリロード…



530 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:33:21 ]
>>528-529

この間1秒

531 名前:デフォルトの名無しさん [2009/12/25(金) 18:31:07 ]
PGが終了って、マ板ネタか?

532 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 18:32:10 ]
マは常に終了してるからな^^

533 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 18:42:41 ]
SEは終了してないとか

534 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:26:12 ]
defineってどういうときにつかうん?

535 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:29:04 ]
気持ちよくなりたいときに使う

536 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:58:05 ]
>>534
そりゃあプログラムを変更したい時に一か所一か所変更するのは面倒でしょ

537 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 22:06:15 ]
defineに限らず構造体の定義などもまとめてヘッダファイルに記述する。
あとで変更したくなったときに、ロジック側を弄らなくて済むようにしておく。
あとはデバッグスイッチとかの条件コンパイル用かな。

538 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 22:32:54 ]
多用するとタコ殴り

539 名前:466 mailto:sage [2009/12/25(金) 22:38:24 ]
MFCは、すごいマクロ使ってるね。あれはあれでありだとは思うが。



540 名前:デフォルトの名無しさん [2009/12/25(金) 23:19:37 ]
>>539
頼むから冗談はよしてくれ

541 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:08:47 ]
クリスマスにKFCでも食って気が上機嫌なんだろ

542 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:16:14 ]
気が上機嫌って何かおかしい気がしたけどよく考えたらそうでもない気がしないでもなかった

543 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:23:06 ]
いや、おかしい。気が狂ってると書こうとして
それはあんまりだと思って、上機嫌に変えた、つもりだったのです。

544 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:45:24 ]
>>537
defineも構造体定義も、ヘッダファイルに書く場合は複数のソースファイルに公開する必要がある場合。
ひとつのソースファイルだけで使用するなら、そのソースファイルで定義するのが基本。

545 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 01:37:05 ]
>>530
あたまわるいなぁ、とか言われなかったんだな

546 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 01:57:05 ]
>>539
MFCのマクロは、Cプリプロセッサの究極をいってるな。
いっちゃってるけど。

547 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 08:11:39 ]
誰かMFCのマクロを見せてくれ

548 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 17:30:50 ]
>>546
いやいや、究極と言えば、Boost.Preprocessorとかメタプログラミングの類。
こんな調子で、演算とかさせるんだぜ。頭がおかしいとしか思えない。
ttp://d.hatena.ne.jp/qnighy/20091107/1257587259

MFCなんてかわいいもんだ。

549 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 18:14:49 ]
Boost.Preprocessor はもう天才的。
プリプロセッサメタプログラミングだぜ?
本当にやりやがった・・・的な衝撃が走る。




550 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 18:32:21 ]
×天才的
○病的

551 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 18:34:03 ]
メタプロ見てるとなんかもう新しい使いやすい言語でもつくりゃいいのにって思う

552 名前:デフォルトの名無しさん [2009/12/26(土) 19:00:45 ]
思うね

553 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:11:58 ]
すいません。
feofというのは一体何の略なんでしょうか?

554 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:21:16 ]
File EOF だと思うよ
EOF は End Of File
細かいことはキニシナイ

555 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:21:43 ]
>>553
eof = End Of File
FILE *fp を取り扱う関数は、一般に fopen(), fclose(), fseek() のように頭に f がつくので、
f + End Of File = feof()
本当のところは知らないのですけど。

556 名前:553 mailto:sage [2009/12/26(土) 19:26:58 ]
feof end of file 略 でググってみましたらそれっぽいものが見つかりました。
ファイルポインタがEOFに達しているかどうかを調べるんだそうです
ttp://www.phpbook.jp/func/file/index3.html
ありがとうございました

557 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:36:57 ]
略称の語源じゃなくて用途を調べてたのかよw

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
なるね






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<137KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef