q_and_aの過去ログ(0002)

  • (by K, 2006.05.01)

ログ

  • P179のmemtest_subについて質問があります。pはi番地を指す。old=*p; でoldにi番地の内容を退避。i番地に書き込んだ値を反転させる。この後に出てくるif文で、反転結果にならない場合*p=old;を実行していますが、反転結果にならないと言うことはその番地は存在しないはずです。何故*p=old;が必要なのでしょう?またこの関数はi番地を調べてその番地が無ければ戻り値としてiを返しています。この時の変数iは最終的にHariMainの変数iに代入されて、それが画面に表示されるようです。という事は、画面に表示されるのは実際のメモリの容量ではなく、実際のメモリの容量+4kBの値でしょうか? -- 普段はROM 2006-04-24 (月) 22:35:26
  • 質問をありがとうございます。まず反転した結果が等しくなかった場合についてです。反転した値が等しくないということは、確かにその番地にRAMが接続されていないことを意味しますが、しかしだからといって、何もつながっていないかどうかは分かりません。たとえばそこがROMであるかもしれません。しかしROMだったら何を書き込んでも意味はないので、その場合でも普段はROMさんのおっしゃるとおり、 *p = old; を実行する必要は全くありません(註:RAM=普通のメモリ、ROM=BIOSなどが収められている読み出し専用メモリ)。 -- K 2006-04-25 (火) 16:18:15
  • しかしRAMでもROMでもないものがつながっている場合もありえます。よくあるのがメモリ接続型I/Oで、これはつまり、IN命令やOUT命令ではなくMOVで制御するタイプの装置です(そういう装置もたまにあるんです)。こういうものがつながっている場合は、それぞれのビットに意味があって、でも一部のビットだけが"1"に固定されているとか、そういうことがよくあります。そういうものであれば、memtest_subはメモリではないと気が付くことができます。このようなものの場合、勝手に反転した値を書いたままではなにか副作用を起こしてしまうかもしれないので、元の値に戻したほうがいいと思います。・・・とまあそんなわけで、たぶん多くの場合ではこのような復元処理は不要であろうとは思いますが、場合によっては役に立つので入れています。入れてもそれほど処理が遅くなるわけではありませんしね。 -- K 2006-04-25 (火) 16:21:08
  • 次の質問ですが、仮にメモリがちょうど1GBあったとしましょう。つまり、0〜0x3fffffffまではメモリです。この場合、当然ながら p = 0x3ffffffc の時点ではテストは成功します。そして p = 0x40000ffc になったときになって初めて失敗します。このときにiは0x40000000になっていますが、これがreturnで返されることになります。だからメモリが1GB搭載されているときに表示されるのは1024MBであり、4KBが加算された値ではありません。 -- K 2006-04-25 (火) 16:23:48
  • 回答有難うございます。2番目の質問ですが、メモリの番地が0から始まることを失念していました(苦笑)。勘違いでKさんの手をわずらわせてしまい申し訳ありません。 -- 普段はROM 2006-04-25 (火) 21:09:23
  • 普通のメモリ以外のものがつながっていることは知りませんでした。1番目2番目の質問共に丁寧に答えていただき有難うございました。 -- 普段はROM 2006-04-25 (火) 21:18:32
  • 3日目まではうまくいっていたのですが、4日目からQEMUのウインドウの横の長さだけ3分の1しか表示されなくなってしまいました。つまり縦長の表示になってしまうのです。対策を教えてください。よろしくお願いします。ちなみにOSはXP HOMEのSP2です。 -- ねんねこ 2006-04-26 (水) 18:26:26
  • faq/c00-03から移動)harib00iを実機で実行できない。すぐにrebootされてしまう。 -- 名無しさん 2006-04-25 (火) 19:49:30
  • 名無しさんへ:まずは確認です。harib00hまではうまくいったということでよろしいでしょうか?お使いの本は第4刷でしょうか? -- K 2006-04-26 (水) 21:25:06
  • ねんねこさんへ:3日目、4日目というあいまいな表現ではなくて、たとえばharib01eまではうまくいくけどharib01fからはうまくいかない、などもっと正確な表現でお願いいたします。お使いの本は第4刷でしょうか? -- K 2006-04-26 (水) 21:29:26
  • 失礼いたしました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で残り3分の1の部分に表示される状態です。本は第3刷です。 -- ねんねこ 2006-04-26 (水) 21:47:30
  • 失礼しました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で左3分の1に縦長に表示されるされる状態です。本は第3刷を使用しています。 -- ねんねこ 2006-04-26 (水) 22:15:03
  • 失礼しました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で左3分の1に縦長に表示されるされる状態です。本は第3刷を使用しています。 -- ねんねこ 2006-04-26 (水) 22:17:46
  • 失礼しました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で左3分の1に縦長に表示されるされる状態です。本は第3刷を使用しています。 -- ねんねこ 2006-04-26 (水) 22:18:16
  • 更新の衝突の表示が出てパニクって汚してしまいましたすいません。 -- ねんねこ 2006-04-27 (木) 09:25:05
  • ねんねこさんへ。今までそういう症状に出会ったことがないので、まだ的確な対応策を示せないのですが(すみません)、ためしにharib02aとかでやってみてもやはりおかしくなってしまうでしょうか。もしおかしくなるようなら、faq/qemuのbochsを試してみることをおすすめします。 -- K 2006-04-28 (金) 00:04:54
  • bochsにしてみたらうまく動きました。ありがとうございました。 -- ねんねこ 2006-04-28 (金) 12:19:44
  • p82,p83 COLUMN-4 の内容なんですが、p[i]とi[p]が同じであると書かれていますが本当にそうでしょうか? 手元にCコンパイラが無いので確認できないんですが、p[i]は厳密には*(p+i)ではなく*(p+(sizeof(p)*i))です。i[p]はどうでしょうか, -- 名無しさん 2006-04-28 (金) 16:23:39
  • すいません途中でエンター押してしまいました。続きです。i[p]と書けたとして、それは*(i+(sizeof(i)*p)ですがiがintなので+の右の数は4*p…ややこしくて書いてて混乱してきましたが。Cでは配列として書いた場合、変数(それか構造体)のサイズがちゃんと考慮されてます。i[p]、2[a]はコンパイルできないんじゃないかと思うんです。i[p]はiがポインタとして宣言されてないので、2[a]は2にサイズが無いので。 -- トラリス 2006-04-28 (金) 16:34:54
  • トラリスさんへ。もちろんi[p]もコンパイルできますよ。p[i]は*(p+(sizeof(p)*i))ではないからです。質問そのものは悪くないんですが、質問する前に自分で実験することのほうが格段に重要なので、想像で質問せずに、是非一度自分でいろいろやってみてください。話はそれからです。今でもいろいろ詳しいお返事をすることはできますが、そうしてしまうとトラリスさんにとっては理解が深まらないと思うので、説明しません。 -- K 2006-04-28 (金) 17:18:14
  • すいません。手元にPalmOS用Cコンパイラがあるのを思い出して、ためしてみました。そしたらなんと本に書いてある通りでしたよ。やりますねあなた。詳しくはわかりませんがintはどうも暗黙的に単なるバッファへのポインタとして扱われているような気がしました。でも2[a]が通ってしまうなんて、どうなってるんだC言語! -- トラリス 2006-04-28 (金) 17:22:55
  • また試してみました。たしかにp[i]は*(p+(sizeof(p)*i))ではないんですね。sizeof(p)はポインタ自体のサイズで、常に4だったりしますか?また自分が知らないという事を知ってしまいました。charをshortに変えてみて出力したアセンブラリストを見たんですが、これはひょっとして*(p+i)と書いた時点でpが指している変数のサイズも計算してくれているという事でしょうか。Kさん暖かいコメントありがとうございました。 -- トラリス 2006-04-28 (金) 17:53:35
  • 「*(p+i)と書いた時点でpが指している変数のサイズも計算してくれているという事でしょうか。」まさにそのとおりです。正解おめでとうございます。 -- K 2006-04-28 (金) 20:50:48
  • 122 -- 名無しさん 2006-04-29 (土) 11:13:04

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2006-05-01 (月) 05:56:23 (4649d)