C言語なら俺に聞け(入門篇) Part 16

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2007/07/24(火) 10:29:47
両方のforのループカウンタでiを使ってるけどこれは意図してこう書いてるの?
953デフォルトの名無しさん:2007/07/24(火) 10:48:43
Visual C++を入手するには
Visual Studioを購入しなければならないのですか?
954デフォルトの名無しさん:2007/07/24(火) 10:51:30
コマンドライン版だけ欲しいってことならPlatformSDKでも落としとけ
955デフォルトの名無しさん:2007/07/24(火) 10:52:58
>>953
VisualC++2005ExpressEditionは無料でダウンロードできるよ
956デフォルトの名無しさん:2007/07/24(火) 10:53:22
>950
>for (i = int_bits() -n -1;i>=0;i--)
>temp *= 2;
>n++;
iじゃなくて別の変数にすべきだし>=じゃなくて>だろってのはおいといても、temp << i で十分だろ
957デフォルトの名無しさん:2007/07/24(火) 10:53:32
そのメール欄からして>>891

答え書いてあるのに読めないのか?
別人だとしてこのスレぐらい全部読めよ
っていうか入門書だとかに大抵無料のコンパイラついてくるんだからそれ使えよ
958デフォルトの名無しさん:2007/07/24(火) 11:19:11
>892 大変失礼しました。わたしの質問891が1時間ほど待っても表示され
なかったのでgive upしてしまったのです。よく分かりました。
ありがとうございました。
959デフォルトの名無しさん:2007/07/24(火) 16:38:46
>>956
unsigned print_bits(unsigned x,unsigned y)
{
int i;
int temp;
unsigned sum = 0;

for (i = int_bits() - 1;i>=0;i--) {
if ((y>>i) & 1U)
temp = 1;
else
temp = 0;

temp << i

sum += x * temp;
}
return (sum);
}

変更したのですが、コンパイルすると、コードは効果を持たない(関数 print_bits )とでてしまいました。
どうしてでしょうか?
960デフォルトの名無しさん:2007/07/24(火) 16:46:03
int_bits()がどこから出てきたのか我々には分かりません。
961デフォルトの名無しさん:2007/07/24(火) 16:50:05
>>960
>>949にあるんだけどね。
流れを追えないだけじゃなく、見当違いだから黙ってていいよ。

>>959
sum += x * (temp << i)でいいということだろ。
962デフォルトの名無しさん:2007/07/24(火) 17:00:22
>>961
temp << i
sum += x * temp;

でも問題ないだろ
セミコロンが無いのはともかく
963デフォルトの名無しさん:2007/07/24(火) 17:06:01
いやそれは問題あるだろ
temp <<= i; としたいのか?
964デフォルトの名無しさん:2007/07/24(火) 17:09:48
なんだってこのスレはこんなに頭の弱い子ばかりなんだろう……
965デフォルトの名無しさん:2007/07/24(火) 17:11:45
入門篇だからだよ
966デフォルトの名無しさん:2007/07/24(火) 17:12:54
すいません、わかりました。

temp = temp<<i;

でいけました。ご迷惑おかけしました
967デフォルトの名無しさん:2007/07/24(火) 17:27:22
何だこのバカさ加減は。
968デフォルトの名無しさん:2007/07/24(火) 17:33:01
その他人を見下す性格、あらためた方がいいと思うよ
969デフォルトの名無しさん:2007/07/24(火) 17:54:09
何百回も繰り返しcallされる関数が有るのですが、最初にcallされ
た場合に限り、特別な処理がしたいと思っています。staticなフラ
グを宣言すれば出来るには出来るのですが、何百回もcallされるの
に、最初の一回の為にフラグをチェックするのはちょっとバカバカ
しい。何か良い方法は無いでしょうか?
970デフォルトの名無しさん:2007/07/24(火) 17:56:01
>>969
間接コール?
971デフォルトの名無しさん:2007/07/24(火) 17:59:00
>>969
「最初にcallされた場合」フラグを関数内に持たず、関数外から引き数で与えては?
高々数百回程度じゃ歯糞にもならないけどね。
972デフォルトの名無しさん:2007/07/24(火) 18:04:34
関数ポインタで

func = first_func;
...
func = second_func;
とかやればいいんだけど普通の関数コールに比べてオーバーヘッドが発生するんで
フラグのチェックよりマシとは言いがたい。
973デフォルトの名無しさん:2007/07/24(火) 18:11:30
>最初の一回の為にフラグをチェックする
のではなく、
2回目以降全ての為に(1回目も)フラグをチェックする
と考えてはどうだろう。

いや、どうでもいいけどね。
974デフォルトの名無しさん:2007/07/24(火) 18:12:42
>>972
オーバーヘッドについて詳しく。
私の知る限り、イミディエイト関数呼び出しとレジスタ間接関数呼び出しで
大きく処理時間が異なるCPUはないのだけれど。
#寧ろ、某CPUはレジスタ間接の方が速いし。
975デフォルトの名無しさん:2007/07/24(火) 18:19:44
>>974
昔のパソコンは結構効いてたけど、最近のはあんまり関係ない気がする。
976デフォルトの名無しさん:2007/07/24(火) 18:23:11
レジスタに関数のアドレスをセットするのがオーバーヘッドになるって事でしょ
977デフォルトの名無しさん:2007/07/24(火) 18:32:38
>>976
それもまた、今のCPUなら殆ど無視できる。
978デフォルトの名無しさん:2007/07/24(火) 18:38:05
計測は力なり
979デフォルトの名無しさん:2007/07/24(火) 18:40:33
Efficeon搭載機を使う、とか…
980デフォルトの名無しさん:2007/07/24(火) 18:42:15
多少汚くても高速なCPUが力押しで処理してくれるのはいいんだが
初心者の小規模なプログラムだと「こっちのほうが高速だぜ」って言われても実感できない…
981デフォルトの名無しさん:2007/07/24(火) 18:53:48
知らぬ間にメモリ参照のコスト0の新技術が開発されたのかと思ったぜ
982デフォルトの名無しさん:2007/07/24(火) 18:56:23
関数呼び出しそのもののオーバーヘッドに対して、充分無視できるって話なだ。
983デフォルトの名無しさん:2007/07/24(火) 19:08:34
いや、static なフラグのチェック処理と比べるべきじゃないか。

このフラグのチェックも、
キャッシュと分岐予測が効けば大したことなさそうではある。
まあ、コスト 0 ではないだろうが。
984デフォルトの名無しさん:2007/07/24(火) 19:23:13
だからそもそも、高々数百回ごときで時間云々する意味がないっしょ。
staticにする場合はマルチスレッドの場合に問題がないか確認する必要はあるね。
985デフォルトの名無しさん:2007/07/24(火) 19:30:58
This is a pen.
を取得するプログラムを書きたいのです。



char str[1024];

while(1){
scanf("%s", str)
func(str);//funcと言う関数に"This is a pen."を一度に入れたい。
}

こういったプログラムを書いてThis is a pen.と入力すると、何故か
1周目のループで、Thisが入り、2週目でis・・・5週目で.が入ってしまいます。
こういう問題はどのようにすれば解決するのでしょうか?
986デフォルトの名無しさん:2007/07/24(火) 19:34:36
987デフォルトの名無しさん:2007/07/24(火) 19:50:55
>>985
scanf("%1023[^\n]", str)
素直にfgets(str, sizeof(str), stdin)を使うべきだとは思うが。
988デフォルトの名無しさん:2007/07/24(火) 19:52:15
>>985
scanfは空白で入力が区切られるようになっている。
989デフォルトの名無しさん:2007/07/24(火) 22:39:57
1Gは1000.000バイトらしいのですが、どうやって求めるのでしょうか?
どうやれば、ギガをバイトにするのでしょか?
990デフォルトの名無しさん:2007/07/24(火) 22:42:56
これはひどい
991デフォルトの名無しさん:2007/07/24(火) 22:43:46
>>989
単位なんだから、もとめるもなにもないだろう。
K -> M -> G で、1000倍していけばいいよ。
992デフォルトの名無しさん:2007/07/24(火) 22:45:12
>>989
どこからの情報ですか?
993デフォルトの名無しさん:2007/07/24(火) 22:48:24
1024
994デフォルトの名無しさん:2007/07/24(火) 22:49:35
>>992
HDDメーカじゃないかな
あの業界だけ1000単位
995デフォルトの名無しさん:2007/07/24(火) 22:50:40
テラワロスとかって書き込みみても、どのくらいワロスのかピンとこないかわいそうな子。
996デフォルトの名無しさん:2007/07/24(火) 22:51:14
Kなら1024だけどkなら1000
容量なら1024だけどスループットなら1000
997デフォルトの名無しさん:2007/07/24(火) 22:57:41
サンクスです

>>992
解説の例題問題にありました。
998989:2007/07/24(火) 23:04:10
>>991
となると、1000.000.000 ではないのでしょうか?
999デフォルトの名無しさん:2007/07/24(火) 23:06:47
>>998
だね。
1000000だと1M。
1000デフォルトの名無しさん:2007/07/24(火) 23:09:42
1000なら1K
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。