- 1 名前:デフォルトの名無しさん [2012/01/13(金) 22:05:06.14 ]
- C言語の*入門者*向け解説スレッドです。
★前スレ C言語なら俺に聞け(入門編)Part 94 toro.2ch.net/test/read.cgi/tech/1324648274/ ★過去スレ 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++の宿題片付けます 155代目 toro.2ch.net/test/read.cgi/tech/1325685876/ ★C++言語については避けてください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 長くなりそうなコードはcodepadに貼り付けてもいいでしょう codepad.org/
- 321 名前: ◆QZaw55cn4c mailto:sage [2012/01/17(火) 23:13:44.36 ]
- >>313
わかんない。シアンマゼンダイエロー、K‥‥‥K‥‥‥K‥‥‥キンタマか?
- 322 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 23:15:45.85 ]
- >>321
ブラック
- 323 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 23:26:58.27 ]
- >>320
バンク切り替えすればいいだけだろ。 ほんと、程度が低いな、お前。
- 324 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 23:27:49.89 ]
- >>320
遙か彼方の記憶なのだが、どこかのポート出力でバンク切り替えしていたような?
- 325 名前: ◆QZaw55cn4c mailto:sage [2012/01/18(水) 00:17:49.40 ]
- >>323
バンク切り替えはどうやればいいのですか? >>324 www.webtech.co.jp/company/doc/undocumented_mem/ を探してはみたのですが‥‥‥。0A4hか?
- 326 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 01:40:51.10 ]
- 何言ってんだお前。
そんなのPC98使ってた人間なら常識だろ。 知らないのに出てくるとは、よっぽどなんだな。
- 327 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 02:18:15.95 ]
- 使ってれば常識なの?PC98で開発してればの間違いではないのだろうか。
PC98つかったことないけど。
- 328 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 02:46:44.23 ]
- そうしてたかのように装ったのはお前だろ、QZ
- 329 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 02:59:37.35 ]
- 恋は盲目だな。>>327はQZじゃないよ。
- 330 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 03:35:14.00 ]
- プラットフォームを選ばない会話。
x86以外ではmipsしか知らない俺には無理。
- 331 名前:254 mailto:sage [2012/01/18(水) 08:29:12.36 ]
- >>298 比較演算よりビットシフトを使った条件のが速いというのは聞いたことがあります。
>>306 なるほど、条件×加算数 というふうにすればいいのか。 これを使って、いくつか書き直してみたいと思います。 ありがとうございます。 条件とAとBは例で示したものが多いです。 Cは3〜10行くらいです。 Dはいろいろあって、かなり長いです。
- 332 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 08:40:06.15 ]
- とりあえず、いまどきのプロセッサで速度を気にする場合
まず、メモリアクセスと条件分岐を減らすのが基本。 その上で、ビット演算がどうとかいうのは実際に測定してから。
- 333 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 09:47:49.57 ]
- >>331
自分で書いていてなんなんだが、 × ( (~a) >>8 ) ○ ( (~a) >>8 ) && 1 //シフトした後1桁目だけを抽出 演算量が増えると、比較した方が早くなる可能性は十分にある。 また、デバッグがしにくい。16進法を脊髄反射で2進法にできるなら問題ないけど。 値の持たせ方も変わってくる(ビット演算しやすいデータ形式で持たせる必要がある) ポインタを妙に使い出す フラグを妙に使い出す( int 変数に複数の情報を持たせたくなる ) デバッグ関数( printf で2進法を表示するコードが欲しくなる ) 結果としてコードの見通しが悪くなる なんて特徴もあるからねぇ。注意は必要だけど。
- 334 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 10:05:23.18 ]
- パフォーマンスが気になるなら、
ちょっとばかしアセンブラを勉強して、この資料を見るとよい。 download.intel.com/jp/developer/jpdoc/ia32.pdf パフォーマンスが厳しい場合、割り算をしたがらない気持ちがよく分かると思うよ。 MOV( メモリからの読み込みなどで使用) が0.5クロック CALL(関数の呼び出しでよく使われる)で5クロック RET( Return ) 8クロック DIV(割り算)が 56〜70クロック CMP自身は0.5クロックだけど、If文だとJMPを伴うのでもう少し大きいかな? ビットシフトは、MOVとシフト命令の1.5かな? 関数を使えば、CALLとRETが必要だから最低13クロック以上掛かることになる。 この辺は詳しくないので、説明はできないけど。
- 335 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 10:52:06.29 ]
- なんかスゲー間違えてる・・・気がする・・・
だれか助けて 関数に引数1つをつけて呼んでリターンした場合 movl $0xa,(%esp) ; 0.5クロック call 0x4013e1 <func1(int)> ; 5クロック mov $0x0,%eax ; 0.5クロック leave ; leaveは実質mov pop movなので、2.5クロック ret ; 8クロック なので、最低 16.5クロック+関数内での演算クロック数が必要 ビットシフトは、 sarl $0x2,0x1c(%esp) ; 4クロック 4クロック+演算クロック数 if文 cmpl $0x0,0x18(%esp) ; 0.5クロック jne 0x4013ee <main()+46> ; 不明:0.5クロック程度? 1クロック+演算クロック数が必要 あれ? If 文って結構早くね? てか、ビットシフト遅くね? If文って分岐予測が当たればさらに高速化するし。
- 336 名前:デフォルトの名無しさん [2012/01/18(水) 11:53:53.16 ]
- ホッケーゲームみたいなのを作ってるんだが
バーとボールの当たり判定はどうすればいいんだ?
- 337 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 11:57:33.93 ]
- >>336
物理演算ライブラリに丸投げ
- 338 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 13:39:39.33 ]
- >>336
バーとボールの座標値を比較。 つーか、どう作っているのか判らんのにどう判定すればいいか分かるわけないだろw >>335 すげぇ無駄な努力をしていることに気付け。 その高々数十クロックは一体何分の一秒なのか判っているのか?
- 339 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 13:43:27.54 ]
- >>338
映像処理って、1秒に30個とか60個の画像が含まれていて、それぞれの画像は1920*1080ドットあったりして その各ドットにはRGBの3つの8bit値が存在するんだけど、 1秒の映像を処理するのに何回画素値に対する処理が動くか判っているのか?
- 340 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 13:57:18.96 ]
- 画像処理は小さな最適化が大きな効果を及ぼす分野の一つだよねー。
アムダールの法則で言うところのpの値が限りなく1に近い。
- 341 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 13:58:12.83 ]
- まずビデオチップで演算できないかを考える。
- 342 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 14:02:05.12 ]
- 速度上げるなら重複増やしてでもループ(分岐)回数減らすのがデフォ。
DOS時代は同じ処理を16回分連続で書いたこともあった。
- 343 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 14:03:04.33 ]
- 1920*1080*3*60=約0.4GB。
そりゃぁ、一画素を三回ずつ愚直に計算してたら回数は多いわねぇ。 CPUでそんなことすることを考えているとしたらそのほうが間抜けだ。
- 344 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 14:04:12.65 ]
- >>342
今時のコンパイラなら、ループアンローリングもやってくれるよ。 ついでにベクタ化もしてくれるかもしれない。
- 345 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 14:56:20.00 ]
- >>343
愚直に計算しないためにも、たとえばSSEつかって4画素(4つの32bit整数として)同時にフィルタをかけたりするよね。 >>335はそういうことにつながる話でもあるんだけど、それも>>338みたいに無駄な努力で間抜けな考えだと思うの? ただいえるのは、スレ違いだということ。
- 346 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 15:02:35.06 ]
- 「CPUで」だから、GPUにやらせろっていいたいんだろう
だからどうしたのって話だけどねー
- 347 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 15:06:42.41 ]
- 少なくとも、今時のCPUはクロック通りに動くわけじゃない。
パイプラインもあればキャッシュミスすればペナルティもある。 クロック数だけ足し算しても屁の突っ張りにもならないな。 前からこのスレでも言われているだろう。所要時間を知りたかったら実測しろと。
- 348 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 15:16:49.69 ]
- 少しでも軽くなるように期待してあらかじめ書いているだけだろう?
- 349 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 15:21:30.93 ]
- >>347
所要時間を知りたいわけじゃないでしょ 今問われている箇所がボトルネックになっていることを突き止めたあとかもしれないよ
- 350 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 15:27:36.73 ]
- 意外とレベルの高い質問の中くだらない事で恐縮なんだが…
int main() { func1(); } void func1() { func2(); } void func2() { func3(); }… ひとつの関数を見やすくするという理由だけで、こんな風に 入れ子になっていく事は、なるべく避けた方がいいのかな?
- 351 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 15:30:56.90 ]
- >>350
ちゃんと名前付けてれば大丈夫だと思うよ。 「見やすくする」という基準がずれてなければ。
- 352 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 15:40:12.61 ]
- >>347
言ってることはあってるが、今言うことじゃないな
- 353 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 15:52:40.36 ]
- >>351
すばやい回答ありがとう! 見やすくしようと思って整理してたら、どんどん関数が増えていって ちと不安になってきたので質問しました。
- 354 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 17:17:24.00 ]
- >>352
その実測が既に難しくなっているんだけどな。 そのコードがどのくらい掛かるかを調べるために、そのコードを繰り返したら キャッシュあたりまくりでパフォーマンスが良すぎる値が出てくる。
- 355 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 17:26:20.65 ]
- それはテストが下手だといわざるを得ない
- 356 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 17:37:23.71 ]
- つーか、普段キャッシュにあたらないような状況ならそこを改善する意味がないだろ。
- 357 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 17:47:20.87 ]
- 【C++】高速化手法【SSE】
toro.2ch.net/test/read.cgi/tech/1130349336/
- 358 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 17:55:11.41 ]
- 実測は実データまたは実データに近い仮想データで行うんだから
それでキャッシュヒットしまくって全体に対する占有時間が小さくなってるなら >>356の言うとおり改善する意味なし。
- 359 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 19:59:00.54 ]
- >350
ヘッダファイル作ってコメント入れときゃ多少マシだろ。
- 360 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 20:04:22.56 ]
- >見やすくするという理由
実際に見やすくなり、再利用が出来るなら、そうして良いんじゃないの?
- 361 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 20:34:18.83 ]
- 関数の行数は1画面に収まる程度にするとよいとCodeCompleteに書いてあったぞ
2〜3行しかない処理を関数化するのは逆によろしくないようで。
- 362 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 20:39:13.90 ]
- >>361
意味のある名前をつけられるかどうかを指標にする 同じコードを2回書くならそれを関数かできないか検討する
- 363 名前: ◆QZaw55cn4c mailto:sage [2012/01/18(水) 20:40:12.35 ]
- >>350
解決するべき条件をひとつずつ皮をむくようにクリアしながら下位の関数に投げてしまう、というのは私はよくします。 直近では toro.2ch.net/test/read.cgi/tech/1325685876/339 main() は fopen() と fclose() しかしていない。
- 364 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 20:41:53.23 ]
- 1画面って何行くらいなんだろ
画面解像度やフォントサイズでかなり違いがでそうだけど
- 365 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 20:44:51.45 ]
- 一つ関数を作る度に、膨大な設計書を書かされていた時は、
一つの関数が300行を楽々超えていた。
- 366 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 20:50:00.46 ]
- 個人的には、短い関数が多い方が見やすい。
>>365 開発だとそうなりがちだわな。 2000超えてるの見たときは、驚いたけど。
- 367 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 21:10:25.39 ]
- 一行の関数とか大量に作るなあ
まあ(C++ではなく)C言語なら、多少は自重するが それでも20行以内の関数なんて全然珍しくはない
- 368 名前:デフォルトの名無しさん [2012/01/18(水) 21:16:46.85 ]
- >>361
基準が行数って時点で目的意識はどこへやら いまどき行いくらって稼ぎ方はそうないだろうが 頭脳労働者らしからぬ発言には気をつけろな
- 369 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 21:32:50.30 ]
- 亜流だか我流だか、かも試練が、
アルゴリズムが埋もれないように関数化する
- 370 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 21:54:25.28 ]
- >>350
> ひとつの関数を見やすくするという理由だけで、こんな風に > 入れ子になっていく事は、なるべく避けた方がいいのかな? 必要ないなら、「入れ子 (ネスト)」は少ないほうがいい。 俺なら、こう書くかな。 int main() { func1(); func2(); func3(); } void func1() { ... } void func2() { ... } void func3() { ... }
- 371 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 21:58:58.37 ]
- >>370
あまりにこの形式になりすぎて 上位のほうの関数が実際に何やってるのか よくわからんくなってるプロジェクトを最近見た
- 372 名前:デフォルトの名無しさん [2012/01/18(水) 22:21:44.34 ]
- >>370
ナンセンス 関数内に隠せないものを関数スコープで宣言とか おまえは B の時代のヨボヨボジジイか?
- 373 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 22:22:28.10 ]
- >>364
こういう場面で言われる1画面は80*25をさす場合が多い。80文字、25行ね。 最近はメソッドや変数名が長い場合も多く、横方向への基準を緩和していることも多い。 たとえば120文字までにおさめるなど。 縦方向は今も昔もさほど変わっていないと思う。 でもメソッドチェーンなんかで、1かたまりの処理が複数行にわたる場合なんかを考えると、 今となっては25行は厳しいかもしれないね。
- 374 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 22:24:25.63 ]
-
ステマ相関図画像更新(1/17) gazo.restspace.jp/img-box/img20120117010742.jpg テレビや新聞、大規模なネットサイトで「今流行の」「今話題の〜」「女性に人気の〜」等と言われるものはほぼ全て この画像上部、○○堂がコントロールしている。 ・世間にどの程度流行らせるか ・流行に乗り遅れる(流行に乗り遅れさせる)人間をどのくらい作るか ・話題に乗り遅れた人間に対してどの程度の疎外感を与えるか ・いつその流行を終わらせるか 2chもステマ会場 www.dotup.org/uploda/www.dotup.org2526030.jpg ちなみに ハリーポッターと賢者の石の 「石」とはテレビのこと(著者が執筆当時) ダイオード→半導体→シリコン→石 賢者とはテレビを見る人間でも番組を作る人間でもなく、テレビを操る人間。
- 375 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 22:42:55.85 ]
- なんのことだかさっぱりだが、そこはダイオードじゃなくてトランジスタだろ。
- 376 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 22:47:08.66 ]
- >>370
俺もそれっぽい書き方するわ。 もちろん、そこまで極端ではないけど。
- 377 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 22:50:22.44 ]
- アジャイルなら、ある処理を関数化するかどうか、つまり処理の粒度は「意図によるプログラミング」に従う。
- 378 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 22:52:07.61 ]
- 趣味のソースなら再利用する気が無い限り関数化しないな。
- 379 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 23:07:22.27 ]
- >>372
意味わからん、あくまでも >>350 の改善案だぞ。
- 380 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 23:51:17.96 ]
- >>378
関数化の大きな目的の1つである同一コードを纏めて修正を1回で済ませる、という目的を忘れてる気がする。 どんなコードの書き方でも基本的に構わないけど、 バグの温床になる書き方はどんな書き方でもNGだと思うが
- 381 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 23:54:29.63 ]
- >>372
>>379 ナンセンス以前に、おまえら超能力者かと mainからみて隠蔽したい内容であるなら、>>350だし、 それがアルゴリズムとして重要でmainからみとおせる必要があるなら>>370だし。 それが、>>350で読み解けてるみたいだから、超能力でもあるんだろう。
- 382 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 00:12:29.16 ]
- ameblo.jp/c-plus-style/
検証お願いします
- 383 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 07:30:01.47 ]
- 「俺のコーディングが最も正しい!!」
- 384 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 08:21:13.40 ]
- コンパイラ通ったの?
- 385 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 08:21:41.81 ]
- コーディングスタイルはそれぞれでも、
1関数は百行以内で頼みたい。
- 386 名前:384 mailto:sage [2012/01/19(木) 08:25:52.23 ]
- ソース読み間違えたorz
- 387 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 10:52:47.12 ]
- >>382
ぱっと見、抽象型プログラミングっぽいけど、よく見たらファイル一個につき selfが一個だな。 あんまり利点を感じない。
- 388 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 14:07:44.90 ]
- いったい検証てなんなんだ?
意味がわからんのだが。
- 389 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 15:18:28.05 ]
- 査読してほしいってことぐらいわかろう
- 390 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 15:50:28.51 ]
- 何がしたいコードなのかもわからずに査読も何もないだろう。
ぱっと見、OOPを噂で聞いたくらいで何かそういうことを やろうとしたような残念なコードにしか見えないんだが。
- 391 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 17:34:27.20 ]
- ネバーネバーネバーネバーギブアップって、
! ! ! ! give_up という事で、 give_upがtrueなら ! ! ! ! give_up もtrueという事で ギブアップなんですよね?
- 392 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 17:51:02.21 ]
- give_up || !give_up
だよ
- 393 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 18:37:49.17 ]
- 番号を選択し、選択した番号によって処理を変えたいのですが、
[範囲外の数値が入力されました。]としか表示されません 番号通りの処理をさせるにはどうしたらいいのでしょうか codepad.org/IOuFqtMb
- 394 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 18:44:58.18 ]
- >>393
- scanf("%d", menu); + scanf("%d", &menu);
- 395 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 18:51:32.77 ]
- >>394
有難うございます 早速修正します
- 396 名前:デフォルトの名無しさん [2012/01/19(木) 20:51:59.13 ]
- コンパイラが宣言された配列に対して実際に確保するメモリ領域の大きさを決める基準ってなに?
- 397 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 21:00:03.22 ]
- >>396
配列のサイズ以外に何かあるの?
- 398 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 21:25:55.65 ]
- char は1バイト
int は4バイト(処理系によりけり) long は8バイト(処理系によりけり) とかを聞きたいんじゃね?
- 399 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 21:44:19.30 ]
- コンパイラの仕様による
としか
- 400 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 21:48:02.12 ]
- char a[6];
が8バイト分確保するとか。 コンパイラ依存だろうが。
- 401 名前:396 [2012/01/19(木) 22:24:08.73 ]
- すまん、要素数が1の時に1byte、2〜16で16byte、17〜32で32byte、33〜64で64byteっていう実験結果が得られたのを前提に頼む。
- 402 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 22:32:17.25 ]
- >>401
char配列?
- 403 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 22:32:39.53 ]
- >>401
>すまん、要素数が1の時に1byte、2〜16で16byte、17〜32で32byte、33〜64で64byteっていう実験結果が得られたのを前提に頼む。 そんなのじゃなく、実際の宣言部分を見せろ。
- 404 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 22:37:07.14 ]
- >>401
OSやコンパリラとか書かないと
- 405 名前:396 [2012/01/19(木) 22:56:02.82 ]
- char a[i];
コンパイラはgcc
- 406 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 22:57:55.71 ]
- >>381
俺の超能力をもってしても、お前のレスは意味不明。
- 407 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:02:24.89 ]
- >>401
別に普通のことだろ。 何が疑問なんだ?
- 408 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:03:38.25 ]
- プラグマとかコンパイルオプションで変えられるっしょ
- 409 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:05:06.72 ]
- >>405
とりあえず↓だと #include<stdio.h> int main(int argc, char **argv) { char a1[1]; char a2[2]; char a17[17]; char a33[33]; printf("sizeof(a1) = %d\n", sizeof(a1)); printf("sizeof(a2) = %d\n", sizeof(a2)); printf("sizeof(a17) = %d\n", sizeof(a17)); printf("sizeof(a33) = %d\n", sizeof(a33)); return 0; } 実行結果 こうなる。 sizeof(a1) = 1 sizeof(a2) = 2 sizeof(a17) = 17 sizeof(a33) = 33 gccは $ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-cygwin/4.5.3/lto-wrapper.exe Target: i686-pc-cygwin --中略-- Thread model: posix gcc version 4.5.3 (GCC)
- 410 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:07:02.20 ]
- >>405
>char a[i]; 要素数が変数になっているのが気になるな。 情報小出しにしないで、>401でどうしてそう判断したのか、 コードを出しな。
- 411 名前:デフォルトの名無しさん [2012/01/19(木) 23:25:53.81 ]
- >>410
#include <stdio.h> #define i 1 int main(void) { char a[i],b[i],c[i]; printf("a:%p\n",a); printf("b:%p\n",b); printf("c:%p\n",c); }
- 412 名前:デフォルトの名無しさん [2012/01/19(木) 23:27:23.14 ]
- >要素数が変数
>>405がやってるのは、なに言語?
- 413 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:27:53.71 ]
- >>411
そういう書き方、気持ち悪いと思う
- 414 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:28:00.33 ]
- どうせワード境界だのなんだのの話だろ?
- 415 名前:デフォルトの名無しさん [2012/01/19(木) 23:28:08.95 ]
- アドレス表示してなにがやりたいの?
- 416 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:42:07.25 ]
- >>411
環境によって、4の倍数のアドレスがアクセスが速いとか、奇数アドレスにアクセスできないとか あるから変数とかきっちり敷き詰めて置かれないことのほうが多い。
- 417 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:43:01.09 ]
- #include <stdio.h>
char a[XXX]; char b[1]; int main(){printf("%d ",b-a);return 0;} for XXX in 1 2 3 4 5 6 7 8 9 10; do gcc -DXXX=$XXX hoge.c; ./a.out; done 結果 1 2 3 4 5 6 7 8 9 10
- 418 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:44:02.24 ]
- >>405
配列の添字が変数のトキはとくべつなしょりになるよ
- 419 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:44:43.21 ]
- 構造体だと
#pragma pack(1) みたいな、隙間無く埋めろとか指定できるのもあるな。 こんなの使わないから忘れたけど。
- 420 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:45:13.81 ]
- >>417
a,bの順番にかくほされるとはかぎらないよ
- 421 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:53:00.39 ]
- 構造体は何にもしなくてもアドレス続いてるんじゃなかたけ?
例えば、 struct a{ long n; char c[4]; }; a.nの次のアドレスにa.c[0]が続いてるんじゃないの??
|

|