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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 06:24:18 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 20
pc11.2ch.net/test/read.cgi/tech/1192455273/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 99代目
pc11.2ch.net/test/read.cgi/tech/1194262698/

357 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 16:55:23 ]
ああ修正しながら使うのはむしろいいことかもな
この処理どうなってんだろーとかへーこうやるんだー
ってちらっとでも見て感心することも大事

358 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 16:57:06 ]
「どうしてこんなにつらいのボクだけ?」被害者意識に侵される
他人がひどくうらやましい そんな自分に
腹立つ毎日 手に負えない相乗効果

何をとまどうの ボクは今? なんでもありの人生の中で
ひとりよがりの悩みなど ほうり投げたら笑えよMOVE ON,MOVE ON, NOW

MOVE ON, MOVE ON

You're too young まだお若いのに疲れて 世界を全部見てきたよに
リタイヤするのもけっこう渋いと 呟いて
半端な同情買うのだけはやめよう

なにをびびってるの キミは今? でかいチャンスを目の前にして
なんてことはないよね何事も 楽しい者勝ち 動けりゃ MOVE ON,MOVE ON,NOW

寝て暮らすのも 街を捨てるのも 恋に溺れるも このボクの自由

何をとまどうの ボクは今? なんでもありの人生の中で
ひとりよがりの悩みなど ほうり投げたら 醜態を見せよう
がむしゃらな日々は報われる思いやり無きはバチ当たり
時の流れさえついてくる 自分で進みゃついてくる MOVE ON,MOVE ON,BABY

359 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 17:04:03 ]
あとはアレだ、しょーもない単一機能のテストプログラムでもちゃんとコメント付けること。
そしてそのソースは消さずにきちんとメンテすること。自作のソースが溜まっていくと、後で必ず役に立つ。

360 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 17:09:11 ]
そうやってゴミに埋もれて生きてゆくのね…

361 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 17:18:12 ]
STLが標準じゃなかった頃、
C++始めたら自作の文字列クラスを作るのが通過儀礼だったな。

不定長で来る文字列をどう受ければいいのか、
バッファを越えたら大きなバッファを確保してコピーするのか、
リストで繋げてみるか、可変長配列(これも自作)に収納するかとか、
自分の知っている知識でともかく実装してみて動くものを作った。

さらにアルゴリズムの本や他人のソースを見て、
思いもよらなかった方法を発見して試して、
自分の作ったものの完成度が高まるのは純粋に楽しいし、
そういう試行錯誤した経験は無駄にはならないよ。

362 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 17:21:32 ]
他の言語のあの関数使えたらな〜で似たものを作るとか

363 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 17:34:26 ]
>>362
最近は、Cの時はついついbits/stl_algo.hを見て書いてしまうw

364 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:18:27 ]
無駄にはならないと言うのは
若者に時間を無駄にさせて自分たちが追い越されまいとする年寄りの方便

で何かマシなことやろうとすると結局プラットフォームに依存してるんだよね

365 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:29:51 ]
>>364
無駄にならない方法をぜひ教えてくれ。



366 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:31:23 ]
>>365
2ch に充てる時間を半分にする

367 名前:364 mailto:sage [2007/11/15(木) 18:35:18 ]
>>365
>>364>>361に対する皮肉のつもりなんだが

368 名前:デフォルトの名無しさん [2007/11/15(木) 18:36:04 ]
一応C言語を勉強していますが
いまいち理解できません
最初はこんなもんですか・・?

369 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:38:07 ]
>>366
時間のハンドリングの話じゃねーだろ。
なにを勉強すべきなんだって?

そもそも空いた時間で「再開発」やるって話じゃないのかね。
そんでそれは有用だよ、という。


370 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:39:09 ]
>>364

>>361にとっていい経験だ、て話で誰も「お前らもやるべき」なんて言ってないと思うけど。

371 名前:364 mailto:sage [2007/11/15(木) 18:46:07 ]
>>370
その解釈は誤り。
>>361の最後の文章は個人の経験の記述のように見せかけて最後の行で一般論に帰結させてる。
事実と意見を混同させる初歩的な手だ。

372 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:51:11 ]
>>368
いきなりスイスイ進めねーよ
よほどの天才でもなけりゃあさ
つうかさ、一応ってなに?普段は他の言語やってんの?
独り言じゃないならこっちが答えやすいように質問してよ

373 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:55:21 ]
「いちよう」とか言わないだけマシだと思え。

374 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 19:00:01 ]
だから無駄にならない学習方法を教えてくれよ。
有用なライブラリは何も考えずに利用すべきであって、中身を知ろうとはするなってことか?
きっとその人は一生理解出来ないだけだと思うが。

375 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 19:13:23 ]
ごめん俺エスパーじゃないから答えらんない



376 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 19:14:04 ]
自分のしたい事してれば良いじゃない
学習するって事に拘るなよ

377 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 20:22:46 ]
一応というかなんというか、
一日8時間みっちり学べば遅かれ早かれCの基礎はマスターできるんじゃないかね。

378 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 20:35:36 ]
>>374
何が無駄で何が無駄でないかは
その無駄かも知れない何かを学び
発展途上の途中で無駄だったな
と無駄に無駄と言ってしまっても
その先で無駄ではないと思った
時点で無駄も無駄では無かった
と学ぶことでしょう。

379 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 20:52:51 ]
文字列を仮想キーコードに変換するにはどうすればいいでしょうかv?

例:
string str="unk"

key( VK_U );
key( VK_N );
key( VK_K );


いっこいっこ調べるのが普通?しかしかなり面倒だ
if( str[0]=="a" ) key( VK_A );
if( str[0]=="b" ) key( VK_B );


if( str[0]=="z" ) key( VK_Z );

380 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 20:59:19 ]
配列に入れておけばいいんじゃないか?
for(i=0;c=str[i];i++)key( keycode[c-'a'] );

381 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:18:31 ]
ソートがわかるようでわからん・・・
配列に適当に数字おいて、一時的に保管しておく変数用意して、
ループの入れ子ループでカウントアップしつつ、
比較Aと比較Bで片方補完変数にいれてループ抜けて、
親ループでカウントアップさせて・・・ってやるんだけど、結果一番でかいのだけ連続して出力される('A`

382 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:19:34 ]
ソースうp

383 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:03:35 ]
ダメだ。アスタリスクを見るとポインタに見えてfor無限ループ(;;)を見ると顔文字に見えてしまったり
俺の頭はどうにかしてしまったのだろうか

384 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:05:00 ]
->も然り

385 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:08:42 ]
頼むから俺に聞くとき、変数 i を使わないでくれ
印刷したソース逆から見る俺の身にもなってくれ
なんでここで否定してんだって何度も思うじゃねえか



386 名前:デフォルトの名無しさん [2007/11/16(金) 00:12:28 ]
プログラムの仕事につくには英語を最低限身につけないといけないんですか?

387 名前:デフォルトの名無しさん [2007/11/16(金) 00:15:37 ]
>>386
最低限、英語で書かれた技術文書は、読める必要が必ずでてくる。
ただ、技術文書は平易な英語で書かれているから、すぐなれると
思うよ。

出世して、英語の契約書読む羽目になるとまた別だが。

388 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:19:20 ]
完全に読めなくても、だいたいの意味はわからないか?
見たこと無い単語が出てきたら辞書引く程度で間に合うよ。

389 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:31:24 ]
ときどき
printf("")のprintf文をいれなかったらセグメンテーションエラーでて
printf文をいれたらセグメンテーションエラー消えることがあるんですけど
これはどういうことなんでしょうか?

390 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:34:50 ]
バグです(多分バッファオーバフローの)

391 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:47:38 ]
>>381
ソートもアルゴリズムの分野だけど
理解できないんなら
有名どころのソート(6個くらい)
丸覚えしとけば良いじゃん。

まぁ、バブルソートぐらいは理解しといた
ほうが良いとは思うけど。

392 名前:392 [2007/11/16(金) 00:49:25 ]
ある処理の実行時間の測定を次のようにしました。

start = clock();
なんらかの処理
end = clock();

time = (float) (end - start) / CLOCKS_PAR_SEC;
pirntf("実行時間%d\n", time);

これでtimeを出力すると、
536870912, 2147483648, 1073741824, 1610612736, 0
のうちのどれかの値に-ついたりつかなかったりして、出力されます。
「なんらかの処理」を変えても 上記の値しかでません。
どうしてこうなるのか分かりません。教えてください。

393 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:55:20 ]
>>392
time という変数名がマズイ
time が実数型であるにもかかわらず %d で出力している
typo がある
の全てが原因でしょう

394 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:58:52 ]
clock()が返すのはclock_tだが、startとendの型は?

395 名前:392 mailto:sage [2007/11/16(金) 01:04:08 ]
>>393
timeという変数について調べてみます。
%fでしたね@@;
ありがとうございました!!

>>394
clock_tで宣言しています。
回答ありがとうございます!



396 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 01:18:02 ]
しかし深夜にならないとプログラム作る気おきないのはなぜなんだろう

397 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 07:14:36 ]
あるある

398 名前:デフォルトの名無しさん [2007/11/16(金) 16:49:36 ]
文字列を倍精度に変換する関数strtodにバグがあるようでうまく変換してくれません。

const char* pszInput = "9999999999999999999999999999999999999999999999999999999999999999999999999999999999";
char* pszStop;
double dOutput;
dOutput = ::strtod(pszInput, &pszStop);
::printf("input:%s\noutput:%f\nstop:%s\n", pszInput, dOutput, pszStop);

output:9999999999999999600000000000000000000000000000000000000000000000000000000
000000000.000000
となってしまいます。ERANGEも検出されません。
これはよく知られたバグなのでしょうか?また対策はあるのでしょうか?

よろしくお願いします。

399 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 16:51:47 ]
>>398
「有効桁数」でググってきな

400 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 17:12:46 ]
9999999999999999999999999999999999999999999999999999999999999999999999999999999999
約 10^83

有効桁数 83 桁の数値を扱うために最低限必要なビット数を x とすると
2^(x-1) < 10^83 < 2^x
x = ceil( 83 / log2 )
x = ceil( 83 / 0.301 )
x = 276
1 バイトを 8 ビットとして最低 35 バイトは必要

>>398 が自分で実装するのは無理だろうからライブラリを探した方がいいでしょう

401 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 17:14:01 ]
>>400 は83桁じゃなくて82桁だった

402 名前:デフォルトの名無しさん [2007/11/16(金) 19:18:42 ]
質問:C言語の「volatile」の名前の由来について

質問です。
C言語には「volatile」という記号が あります。
これを記入すると、該当部分でのコンパイル時の最適化を抑制できます。
しかし、なぜ volatile(移り気な、気まぐれな)なのでしょうか。
最適化を抑制しているのですから、むしろ「変化しない」という意味に なるはずです。
つまり、volatile では なく、「un-volatile(不揮発の、変化しない)」になるべきでは ないでしょうか。
教えてください。よろしくお願い致します。

403 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 19:29:20 ]
volatile 変数は移り気で勝手に変化するから、最適化せずに毎回ちゃんとメモリを読みにいかないと正しい結果を得られない、と考えてはいかが

404 名前:デフォルトの名無しさん [2007/11/16(金) 19:31:36 ]
快活に計算動作するから
最適化などで省略して定数になったり計算無効になったりしたらこちらは変化無い

405 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 20:57:33 ]
最初に名前を入力させ、5件分の入力が行われるか、endと入力されたら、その分だけ出力させる
ただし名前入力の最初にendが入力された場合は、その旨のメッセージを出力して再入力させてください
名前は最大15文字入力とする

これのやり方を教えてください



406 名前:デフォルトの名無しさん [2007/11/16(金) 21:10:12 ]
初歩的な質問スミマセン

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
char *cp=NULL;
void *ptr=NULL;

if((ptr=(char*)calloc(10,sizeof(char)))==NULL){
printf("error\n");
exit(EXIT_FAILURE);}

if((cp=strchr(fgets(ptr,100,stdin),'\n'))!=NULL){
*cp='\0';}

printf("%s",ptr);

return EXIT_SUCCESS;
}

半角文字10文字分のメモリをcalloc関数で確保して
fgets関数で10文字以上入力しましたが
普通10バイト分の配列を用意しfgets関数でそれ以上の文字を入力すると
オーバーフローが起き、強制終了しますよね?
ですがこれでは起きないんです、何故でしょうか

407 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:13:04 ]
>>402
どっかで勝手に値が変えられる可能性があるから volatile だな。

408 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:56:34 ]
>>406
ひーぷに余裕があるからじゃね?

409 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:10:54 ]
>>405
丸投げは宿題スレへ
pc11.2ch.net/test/read.cgi/tech/1194262698/l50

410 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:12:14 ]
>>406
>オーバーフローが起き、強制終了しますよね? 

そうとは限らない
他のところで使ってるメモリ領域を黙って書き換えるだけの場合もある

411 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:16:27 ]
>>409
あっすいませんでした

412 名前:デフォルトの名無しさん [2007/11/16(金) 22:17:24 ]
>>408
あ、そういうことか!!
どうもありがとうございました

413 名前:デフォルトの名無しさん [2007/11/16(金) 22:37:56 ]
>>402
「最適化しないだって?」
「ああ、今日はそんな気分なんだ」
「まったく気まぐれな奴だよ」

414 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:52:46 ]
>>402
#define donotoptimize volatile

415 名前:デフォルトの名無しさん [2007/11/16(金) 22:56:56 ]
違うとおもいますよ。
綿密な計画と設計思想に基づいてボラタイルに したんです。
気まぐれで ボラッたわけでは ありません。



416 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:23:58 ]
なぜmainはmainという名前にしたんだろう、startの方がよくない?と思ったことはあります

417 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:25:04 ]
だったらstopも要ると思わないか

418 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:36:50 ]
多分main,subで分けて書いたからじゃないかな。

419 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:46:05 ]
>>417
関数の名前にしちゃうとその辺の理屈あわせが難しくなるよね
>>418
ああなるほど

関係ないけどmain"メソッド"には今でも違和感がある…

420 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 01:36:08 ]
mainメソッド……てJAVA?

421 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 02:07:26 ]
Cから始めた自分には違和感なかったけど、よくよく考えたら不思議な名前のメソッドだな。

422 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 02:17:27 ]
mainと言いつつ、主要な処理は他のところでやってるしね。

423 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 02:22:01 ]
主要な流れ、ということじゃないか?
主要な処理を他でやっていても、
全体通してのメインの流れを定めるのがmain関数

int main(){
first_step();
second_step();
third_step();
return 0;
}

424 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 03:51:36 ]
構造体のメンバの数って制限あるのですか?

425 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 09:08:36 ]
そりゃあるだろうが、限界まで使ったこと無いな。




426 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 09:18:17 ]
ハード側の限界にぶつかったことならあるが、規格の限界は知らないな

427 名前:デフォルトの名無しさん [2007/11/17(土) 19:17:14 ]
MFCって何?

428 名前:デフォルトの名無しさん [2007/11/17(土) 20:24:04 ]
>>427
ググれ

429 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 20:33:33 ]
HTMLのform解析をしたいのですが、
<form action="./int.php" method="post">
<input type="text" name="id" value="C">
<input type="submit" name="button" value="押す">actionは./int.php
methodはPOST
typeはtext、nameはbutton valueはC
というように<>内をそれぞれ抽出したいのですが、どのようにしたら出来ますでしょうか?

430 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 22:36:57 ]
オイラだったら perl でやる。rubyも好いらしい。


431 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 22:42:25 ]
字句解析はCよりPerlを勉強した方がはるかに楽だよ

432 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:01:25 ]
>402

volatileは「最適化抑制」という意味じゃない。
「値が外的要因(ハードウェアなど)によって変化しうる」という意味。


433 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:05:27 ]
>429

Win系だったらMFCや.NET Framework、UNIX系ならPerlを使ったほうがいいな。

Cでやるしかない、という場合だったら、methodなどのキーワードの後の"...;"の中を一々抽出するしかないな。


434 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:08:04 ]
>>429
どっかから正規表現のライブラリ持ってくるのが楽じゃない?

435 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:11:01 ]
HTMLのライブラリだって、探せばありそう。



436 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:19:45 ]
>>435
たとえばWindowsならMSHTMLとかだな。

437 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:34:44 ]
レスありがとうございます。
まずはCだけで頑張ってみます。

438 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:04:55 ]
>>と>=で処理する式が違うんですけど、
プログラムを作るとき、どう区別すべきですか?

439 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:08:11 ]
違うってわかってるんなら、区別できてるってことじゃないか

440 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:20:31 ]
for(;i<10;)

for(;i<=9;)
の違いがわからんってこと?

441 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:23:01 ]
>>は非常に左が大きいだけど
>=は以上ってことだし。

442 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:29:57 ]
if(A>>B)    C=A
elseif(B>>A)   C=B
elseif(A>=B) C=A+1;
elseif(B>=A) C=B+1;

の条件分岐を作りたいんだけど
区別どうすればいいのかってね。




443 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:33:32 ]
>if(A>>B) C=A
 
AがBより非常に大きいってことを言いたいのなら、
コンピュータは 「非常に」 なんて曖昧な条件は理解できないので、
どのくらいかを具体的に指示してやらないとだめ。

if (A >= B + 1000) C = A;
とか
if (A >= B * 10000) C = A;
とか。

444 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:34:25 ]
>>>は非常に左が大きいだけど
C言語でそんな比較演算子は無い
単なる大小比較( > )にし問題を書き換えなさい

445 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:59:48 ]
きっとビットシフトだ



446 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 07:12:45 ]
良くも悪くもコンピュータは正直だから、命令されたことしかやらない。
「〜よりは大きいが常識の範囲内で」とか言われても判断できるわけがない。

447 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 07:37:40 ]
おれもビットシフトだと思って、何のことだか全然わからんかった。
「非常に左が大きい」て何だよw


448 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 07:38:50 ]
以前にも同じような質問してきた奴が居たから俺はわかった

449 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:23:39 ]
unsigned A; の下位 B ビット以外が0であることを
判別する関数をつくりなさい。(10点)


450 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:30:08 ]
int f(unsigned A, int B) { return !(A >> B); }

451 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:38:36 ]
bool func(unsigned A, unsigned B) {return A >= (1 << B);}

452 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:44:45 ]
後出しなのに・・・

453 名前:デフォルトの名無しさん [2007/11/18(日) 09:15:50 ]
すみません、まだC初めて一週間足らずの初心者ですが質問させてください。

課題で
void printIPAddress( unsigned int address )
{
printf("%d.%d.%d.%d",
(address & 『 @ 』 ) >> 24,
(address & 『 A 』 ) >> 16,
(address & 『 B 』 ) >> 8,
(address & 『 C 』 ));
}
ア.0x000000ff イ.0x0000ff00 ウ.0x00ff0000 エ.0xff000000

とありまして、@〜Cにア〜エから適切なものを選択して関数を完成させるというものです。
ネットなどで色々検索して、答はたぶん@:エ A:ウ B:イ C:アじゃないかと思ってるのですが
どうしてそれが正解?なのかがわかりません。(そもそも正解かどうかすらわかりません)

考え方としては例えば@:エなら0xff000000は11111111 00000000 00000000 00000000で
>>24というのが右に24bit(3byte)移動するという意味なんだろうか?と思ってるんですが
3byte移動したら11111111が一番→にきて後ろについてたたくさんの0は前に行くんでしょうか?
それがどうして正解?なんでしょうか?他のもの(例えば0x000000ffとか)が入ってはいけないんでしょうか?
&を使ってるという事は論理積を理解できてないとこの問題は理解できないんだと思うのですが
本や解説を見てる時はふんふんなるほどと思っても実際こうやって問題にされると全くわからなくてお手上げです…

長文すみませんがどなたかご教授お願いします。
もしスレチならどこか該当スレに誘導お願いします。
(最初ふらっとCスレに書き込もうとしたら1000スレ達成しちゃってました…)

454 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 09:27:51 ]
>>453
論理演算とビットシフトでググればわかりそうなもんだが…

&はand演算だから、左右どちらも1なら真=1になる。そうでなければ0になる。
例えば、11001100 & 11000000の結果は11000000になる。
これを右に6ビットシフトすれば00000011が得られる。

455 名前:デフォルトの名無しさん [2007/11/18(日) 09:38:37 ]
アドレスは、
11100010  上位ビット
01100011  
00100100  
11011100  下位ビット

のように格納されている

0ビットシフトさせてff = 11111111とand取れば下位ビットが出てくる
8ビットシフトさせてff = 11111111とand取れば下から二つ目が出てくる



456 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 09:42:04 ]
>>452
インライン展開するときに、Bが定数なら>451の方が効率がよくなる。

457 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 09:49:08 ]
効率とか言うレベルじゃなくて、単純に間違ってるだけだろw






[ 続きを読む ] / [ 携帯版 ]

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

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