qa_log/0002
の編集
http://hrb.osask.jp/wiki/?qa_log/0002
[
リロード
|
差分
|
単語検索
|
一覧
] [
編集
|
バックアップ
|
添付
]
-- 雛形とするページ --
A
Akkie
Athlon64X2
Clover
DAsoran
Falcon
FormatRule
FrontPage
Genesis
Help
I
InterWikiName
InterWikiSandBox
InterWikiテクニカル
Jormungand
K
Kebo
Kor_Lee_Hee_Rak
Leaf
Linux
Linux/wako_memo
MOIZ99
MW
MenuBar
OSC
PG_MANA
ReadersOS
RecentDeleted
SKYDASH
SandBox
Sero
Sigle
Source
Triangle_Ld.
Zxcvbnm
advance
advance/CPU
advance/FDC
advance/FPU
advance/NotHariMain
advance/QEMUVGA
advance/RTC
advance/blike
advance/cpu_reset
advance/driver
advance/driver/01
advance/driver/02
advance/families
advance/filesystem
advance/fwrite
advance/hddboot
advance/he86
advance/hints
advance/ipl
advance/kernel
advance/keycode
advance/osselect
advance/smaller1
advance/startup
advnace/smaller2
anzy
aotatsu
banbi-
bluedwarf
bo
bugs
challengers
cybozulabsyouth11
deskmanta
esb02b
faq
faq/advance
faq/asm
faq/c00-03
faq/c04-07
faq/c08-15
faq/c16-23
faq/c24-31
faq/make
faq/others
faq/qemu
guide
guide03
guide05
guide07
hikarupsp
imp_log/0000
imp_log/0001
imp_log/0002
imp_log/0003
impressions
index
k
killer_elf
kota
lea
lea/10_memory
lea/4_color
lea/idea
lea/terms
links
logs
logs/osa_hrb/comments0000
logs/osa_hrb/rumors0000
masa
members
message
mistakes
moge32
moppoi5168
notice
osdevjp
populars
prog_index
projects
q_and_a
q_and_a_2
qa_log/0000
qa_log/0001
qa_log/0002
qa_log/0003
qa_log/0004
qa_log/0005
qa_log/0006
qa_log/0007
qa_log/0008
qa_log/0009
quark
rankings
rule
sakamoto
sasaki
spc09
spcc_30min_os
tatsu
tools
tools/bim2hrb
tools/bin2obj
tools/cc1
tools/edimg
tools/gas2nask
tools/makefont
tools/nask
tools/obj2bim
tools/sjisconv
uchan
uho
updates
violations
wako
white
win64-bit
x
ytakano
ヘルプ
リックス
質問します
整形ルール
本は買ったぞ!持ってるぞ!
練習用ページ
* q_and_aの過去ログ(0002) -(by [[K]], 2006.05.01) -リンク: --[[q_and_a]]へ *** ログ -P179のmemtest_subについて質問があります。pはi番地を指す。old=*p; でoldにi番地の内容を退避。i番地に書き込んだ値を反転させる。この後に出てくるif文で、反転結果にならない場合*p=old;を実行していますが、反転結果にならないと言うことはその番地は存在しないはずです。何故*p=old;が必要なのでしょう?またこの関数はi番地を調べてその番地が無ければ戻り値としてiを返しています。この時の変数iは最終的にHariMainの変数iに代入されて、それが画面に表示されるようです。という事は、画面に表示されるのは実際のメモリの容量ではなく、実際のメモリの容量+4kBの値でしょうか? -- ''普段はROM'' SIZE(10){2006-04-24 (月) 22:35:26} -質問をありがとうございます。まず反転した結果が等しくなかった場合についてです。反転した値が等しくないということは、確かにその番地にRAMが接続されていないことを意味しますが、しかしだからといって、何もつながっていないかどうかは分かりません。たとえばそこがROMであるかもしれません。しかしROMだったら何を書き込んでも意味はないので、その場合でも普段はROMさんのおっしゃるとおり、 *p = old; を実行する必要は全くありません(註:RAM=普通のメモリ、ROM=BIOSなどが収められている読み出し専用メモリ)。 -- [[K]] SIZE(10){2006-04-25 (火) 16:18:15} -しかしRAMでもROMでもないものがつながっている場合もありえます。よくあるのがメモリ接続型I/Oで、これはつまり、IN命令やOUT命令ではなくMOVで制御するタイプの装置です(そういう装置もたまにあるんです)。こういうものがつながっている場合は、それぞれのビットに意味があって、でも一部のビットだけが"1"に固定されているとか、そういうことがよくあります。そういうものであれば、memtest_subはメモリではないと気が付くことができます。このようなものの場合、勝手に反転した値を書いたままではなにか副作用を起こしてしまうかもしれないので、元の値に戻したほうがいいと思います。・・・とまあそんなわけで、たぶん多くの場合ではこのような復元処理は不要であろうとは思いますが、場合によっては役に立つので入れています。入れてもそれほど処理が遅くなるわけではありませんしね。 -- ''K'' SIZE(10){2006-04-25 (火) 16:21:08} -次の質問ですが、仮にメモリがちょうど1GBあったとしましょう。つまり、0〜0x3fffffffまではメモリです。この場合、当然ながら p = 0x3ffffffc の時点ではテストは成功します。そして p = 0x40000ffc になったときになって初めて失敗します。このときにiは0x40000000になっていますが、これがreturnで返されることになります。だからメモリが1GB搭載されているときに表示されるのは1024MBであり、4KBが加算された値ではありません。 -- ''K'' SIZE(10){2006-04-25 (火) 16:23:48} -回答有難うございます。2番目の質問ですが、メモリの番地が0から始まることを失念していました(苦笑)。勘違いでKさんの手をわずらわせてしまい申し訳ありません。 -- ''普段はROM'' SIZE(10){2006-04-25 (火) 21:09:23} -普通のメモリ以外のものがつながっていることは知りませんでした。1番目2番目の質問共に丁寧に答えていただき有難うございました。 -- ''普段はROM'' SIZE(10){2006-04-25 (火) 21:18:32} -3日目まではうまくいっていたのですが、4日目からQEMUのウインドウの横の長さだけ3分の1しか表示されなくなってしまいました。つまり縦長の表示になってしまうのです。対策を教えてください。よろしくお願いします。ちなみにOSはXP HOMEのSP2です。 -- ''ねんねこ'' SIZE(10){2006-04-26 (水) 18:26:26} -([[faq/c00-03]]から移動)harib00iを実機で実行できない。すぐにrebootされてしまう。 -- 名無しさん SIZE(10){2006-04-25 (火) 19:49:30} -名無しさんへ:まずは確認です。harib00hまではうまくいったということでよろしいでしょうか?お使いの本は第4刷でしょうか? -- [[K]] SIZE(10){2006-04-26 (水) 21:25:06} -ねんねこさんへ:3日目、4日目というあいまいな表現ではなくて、たとえばharib01eまではうまくいくけどharib01fからはうまくいかない、などもっと正確な表現でお願いいたします。お使いの本は第4刷でしょうか? -- [[K]] SIZE(10){2006-04-26 (水) 21:29:26} -失礼いたしました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で残り3分の1の部分に表示される状態です。本は第3刷です。 -- ''ねんねこ'' SIZE(10){2006-04-26 (水) 21:47:30} -失礼しました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で左3分の1に縦長に表示されるされる状態です。本は第3刷を使用しています。 -- ''ねんねこ'' SIZE(10){2006-04-26 (水) 22:15:03} -失礼しました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で左3分の1に縦長に表示されるされる状態です。本は第3刷を使用しています。 -- ''ねんねこ'' SIZE(10){2006-04-26 (水) 22:17:46} -失礼しました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で左3分の1に縦長に表示されるされる状態です。本は第3刷を使用しています。 -- ''ねんねこ'' SIZE(10){2006-04-26 (水) 22:18:16} -更新の衝突の表示が出てパニクって汚してしまいましたすいません。 -- ''ねんねこ'' SIZE(10){2006-04-27 (木) 09:25:05} -ねんねこさんへ。今までそういう症状に出会ったことがないので、まだ的確な対応策を示せないのですが(すみません)、ためしにharib02aとかでやってみてもやはりおかしくなってしまうでしょうか。もしおかしくなるようなら、[[faq/qemu]]のbochsを試してみることをおすすめします。 -- ''K'' SIZE(10){2006-04-28 (金) 00:04:54} -bochsにしてみたらうまく動きました。ありがとうございました。 -- ''ねんねこ'' SIZE(10){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]はどうでしょうか, -- 名無しさん SIZE(10){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にサイズが無いので。 -- ''トラリス'' SIZE(10){2006-04-28 (金) 16:34:54} -トラリスさんへ。もちろんi[p]もコンパイルできますよ。p[i]は*(p+(sizeof(p)*i))ではないからです。質問そのものは悪くないんですが、質問する前に自分で実験することのほうが格段に重要なので、想像で質問せずに、是非一度自分でいろいろやってみてください。話はそれからです。今でもいろいろ詳しいお返事をすることはできますが、そうしてしまうとトラリスさんにとっては理解が深まらないと思うので、説明しません。 -- [[K]] SIZE(10){2006-04-28 (金) 17:18:14} -すいません。手元にPalmOS用Cコンパイラがあるのを思い出して、ためしてみました。そしたらなんと本に書いてある通りでしたよ。やりますねあなた。詳しくはわかりませんがintはどうも暗黙的に単なるバッファへのポインタとして扱われているような気がしました。でも2[a]が通ってしまうなんて、どうなってるんだC言語! -- ''トラリス'' SIZE(10){2006-04-28 (金) 17:22:55} -また試してみました。たしかにp[i]は*(p+(sizeof(p)*i))ではないんですね。sizeof(p)はポインタ自体のサイズで、常に4だったりしますか?また自分が知らないという事を知ってしまいました。charをshortに変えてみて出力したアセンブラリストを見たんですが、これはひょっとして*(p+i)と書いた時点でpが指している変数のサイズも計算してくれているという事でしょうか。Kさん暖かいコメントありがとうございました。 -- ''トラリス'' SIZE(10){2006-04-28 (金) 17:53:35} -「*(p+i)と書いた時点でpが指している変数のサイズも計算してくれているという事でしょうか。」まさにそのとおりです。正解おめでとうございます。 -- [[K]] SIZE(10){2006-04-28 (金) 20:50:48} -122 -- 名無しさん SIZE(10){2006-04-29 (土) 11:13:04}
タイムスタンプを変更しない
* q_and_aの過去ログ(0002) -(by [[K]], 2006.05.01) -リンク: --[[q_and_a]]へ *** ログ -P179のmemtest_subについて質問があります。pはi番地を指す。old=*p; でoldにi番地の内容を退避。i番地に書き込んだ値を反転させる。この後に出てくるif文で、反転結果にならない場合*p=old;を実行していますが、反転結果にならないと言うことはその番地は存在しないはずです。何故*p=old;が必要なのでしょう?またこの関数はi番地を調べてその番地が無ければ戻り値としてiを返しています。この時の変数iは最終的にHariMainの変数iに代入されて、それが画面に表示されるようです。という事は、画面に表示されるのは実際のメモリの容量ではなく、実際のメモリの容量+4kBの値でしょうか? -- ''普段はROM'' SIZE(10){2006-04-24 (月) 22:35:26} -質問をありがとうございます。まず反転した結果が等しくなかった場合についてです。反転した値が等しくないということは、確かにその番地にRAMが接続されていないことを意味しますが、しかしだからといって、何もつながっていないかどうかは分かりません。たとえばそこがROMであるかもしれません。しかしROMだったら何を書き込んでも意味はないので、その場合でも普段はROMさんのおっしゃるとおり、 *p = old; を実行する必要は全くありません(註:RAM=普通のメモリ、ROM=BIOSなどが収められている読み出し専用メモリ)。 -- [[K]] SIZE(10){2006-04-25 (火) 16:18:15} -しかしRAMでもROMでもないものがつながっている場合もありえます。よくあるのがメモリ接続型I/Oで、これはつまり、IN命令やOUT命令ではなくMOVで制御するタイプの装置です(そういう装置もたまにあるんです)。こういうものがつながっている場合は、それぞれのビットに意味があって、でも一部のビットだけが"1"に固定されているとか、そういうことがよくあります。そういうものであれば、memtest_subはメモリではないと気が付くことができます。このようなものの場合、勝手に反転した値を書いたままではなにか副作用を起こしてしまうかもしれないので、元の値に戻したほうがいいと思います。・・・とまあそんなわけで、たぶん多くの場合ではこのような復元処理は不要であろうとは思いますが、場合によっては役に立つので入れています。入れてもそれほど処理が遅くなるわけではありませんしね。 -- ''K'' SIZE(10){2006-04-25 (火) 16:21:08} -次の質問ですが、仮にメモリがちょうど1GBあったとしましょう。つまり、0〜0x3fffffffまではメモリです。この場合、当然ながら p = 0x3ffffffc の時点ではテストは成功します。そして p = 0x40000ffc になったときになって初めて失敗します。このときにiは0x40000000になっていますが、これがreturnで返されることになります。だからメモリが1GB搭載されているときに表示されるのは1024MBであり、4KBが加算された値ではありません。 -- ''K'' SIZE(10){2006-04-25 (火) 16:23:48} -回答有難うございます。2番目の質問ですが、メモリの番地が0から始まることを失念していました(苦笑)。勘違いでKさんの手をわずらわせてしまい申し訳ありません。 -- ''普段はROM'' SIZE(10){2006-04-25 (火) 21:09:23} -普通のメモリ以外のものがつながっていることは知りませんでした。1番目2番目の質問共に丁寧に答えていただき有難うございました。 -- ''普段はROM'' SIZE(10){2006-04-25 (火) 21:18:32} -3日目まではうまくいっていたのですが、4日目からQEMUのウインドウの横の長さだけ3分の1しか表示されなくなってしまいました。つまり縦長の表示になってしまうのです。対策を教えてください。よろしくお願いします。ちなみにOSはXP HOMEのSP2です。 -- ''ねんねこ'' SIZE(10){2006-04-26 (水) 18:26:26} -([[faq/c00-03]]から移動)harib00iを実機で実行できない。すぐにrebootされてしまう。 -- 名無しさん SIZE(10){2006-04-25 (火) 19:49:30} -名無しさんへ:まずは確認です。harib00hまではうまくいったということでよろしいでしょうか?お使いの本は第4刷でしょうか? -- [[K]] SIZE(10){2006-04-26 (水) 21:25:06} -ねんねこさんへ:3日目、4日目というあいまいな表現ではなくて、たとえばharib01eまではうまくいくけどharib01fからはうまくいかない、などもっと正確な表現でお願いいたします。お使いの本は第4刷でしょうか? -- [[K]] SIZE(10){2006-04-26 (水) 21:29:26} -失礼いたしました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で残り3分の1の部分に表示される状態です。本は第3刷です。 -- ''ねんねこ'' SIZE(10){2006-04-26 (水) 21:47:30} -失礼しました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で左3分の1に縦長に表示されるされる状態です。本は第3刷を使用しています。 -- ''ねんねこ'' SIZE(10){2006-04-26 (水) 22:15:03} -失礼しました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で左3分の1に縦長に表示されるされる状態です。本は第3刷を使用しています。 -- ''ねんねこ'' SIZE(10){2006-04-26 (水) 22:17:46} -失礼しました。harib00jまではうまくいっていました。harib01aから画面の右3分の2が黒画面で左3分の1に縦長に表示されるされる状態です。本は第3刷を使用しています。 -- ''ねんねこ'' SIZE(10){2006-04-26 (水) 22:18:16} -更新の衝突の表示が出てパニクって汚してしまいましたすいません。 -- ''ねんねこ'' SIZE(10){2006-04-27 (木) 09:25:05} -ねんねこさんへ。今までそういう症状に出会ったことがないので、まだ的確な対応策を示せないのですが(すみません)、ためしにharib02aとかでやってみてもやはりおかしくなってしまうでしょうか。もしおかしくなるようなら、[[faq/qemu]]のbochsを試してみることをおすすめします。 -- ''K'' SIZE(10){2006-04-28 (金) 00:04:54} -bochsにしてみたらうまく動きました。ありがとうございました。 -- ''ねんねこ'' SIZE(10){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]はどうでしょうか, -- 名無しさん SIZE(10){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にサイズが無いので。 -- ''トラリス'' SIZE(10){2006-04-28 (金) 16:34:54} -トラリスさんへ。もちろんi[p]もコンパイルできますよ。p[i]は*(p+(sizeof(p)*i))ではないからです。質問そのものは悪くないんですが、質問する前に自分で実験することのほうが格段に重要なので、想像で質問せずに、是非一度自分でいろいろやってみてください。話はそれからです。今でもいろいろ詳しいお返事をすることはできますが、そうしてしまうとトラリスさんにとっては理解が深まらないと思うので、説明しません。 -- [[K]] SIZE(10){2006-04-28 (金) 17:18:14} -すいません。手元にPalmOS用Cコンパイラがあるのを思い出して、ためしてみました。そしたらなんと本に書いてある通りでしたよ。やりますねあなた。詳しくはわかりませんがintはどうも暗黙的に単なるバッファへのポインタとして扱われているような気がしました。でも2[a]が通ってしまうなんて、どうなってるんだC言語! -- ''トラリス'' SIZE(10){2006-04-28 (金) 17:22:55} -また試してみました。たしかにp[i]は*(p+(sizeof(p)*i))ではないんですね。sizeof(p)はポインタ自体のサイズで、常に4だったりしますか?また自分が知らないという事を知ってしまいました。charをshortに変えてみて出力したアセンブラリストを見たんですが、これはひょっとして*(p+i)と書いた時点でpが指している変数のサイズも計算してくれているという事でしょうか。Kさん暖かいコメントありがとうございました。 -- ''トラリス'' SIZE(10){2006-04-28 (金) 17:53:35} -「*(p+i)と書いた時点でpが指している変数のサイズも計算してくれているという事でしょうか。」まさにそのとおりです。正解おめでとうございます。 -- [[K]] SIZE(10){2006-04-28 (金) 20:50:48} -122 -- 名無しさん SIZE(10){2006-04-29 (土) 11:13:04}
テキスト整形のルールを表示する