C言語のポインターに対する演算の結果について。
しばらく使わないと忘れてしまうので覚え書き。
long *lp=0;
short *wp=0;
char *cp=0;
としたとき、それぞれを++した時の実アドレスは、
lp++ == 4
wp++== 2
cw++== 1
である。
同様に、
&lp[1]のアドレスは4
&wp[1]のアドレスは2
&bp[1]のアドレスは1
である。
同じ演算子でも、ポインターの型によって得られる実アドレスが異なる。
アセンブラーでアドレスを演算する場合にも変化が伴うことがあるが、
Cとは結果が違う。
たとえば680x0MPUでは、
a0.l=0のとき、
move.l d0,(a0)+ → a0=4
move.w d0,(a0)+ → a0=2
move.b d0,(a0)+ → a0=1
であるが、
move.l d0,4(a0)
move.w d0,4(a0)
move.b d0,4(a0)
はいずれも4番地からにデータを書き込む。
自動インクリメント(またはデクリメント)は大きさを考慮するが、オフセット指定は
大きさは関係ないと言うことである。
通常加算は大きさを考慮しないので、
addq.l #1,a0
addq.w #1.a0
はいずれもa0=1となる。
アセンブラとC言語の両方に精通していると、C言語におけるポインターの演算結果を
迷うことがあったりするので、注意。
2012年4月30日月曜日
2012年4月11日水曜日
Windows7のデスクトップガジェットの強制的な削除仕方
Windows7でデスクトップガジェットを使っているとき、まれにその起動が出来なくなることがある。
ガジェット内部でエラーを発生してしまうと、そのエラーを起こしたガジェットだけでなく、登録している全てが落ちてしまうようだ。うちでは、IO-DATAのDrive Centerがこの状態になって往生した。
いったんこうなってしまうと、コントロールパネルのデスクトップガジェットも開けなくなり、通常ではどうしようもなくなる。
この場合、
c:\Users\ユーザー名\AppData\Local\Microsoft\Windows Sidebar
にあるSettings.iniをテキストエディタで開き、エラーを起こしていると思われるガジェットの設定を削除する。
削除対象は、[Root]タグ内にある
Section?="?"
というセクション名の登録、
[Hashes]タグ内にあるプログラムの登録と、
[Section?]タグの内容そのものである。
念のため、編集前にはバックアップをとっておいた方が良いであろう。
また、同\Gadgets\の下にガジェットのプログラム本体(のフォルダ)があるので、場合によってはそのフォルダも削除する。
いや、ガジェットが落ちるようになってしまったけど、解決に関する情報がどこにもなくて、
いろいろやっている内に発見した。同様なことで困ったいる人がいたら、どうぞ。
ガジェット内部でエラーを発生してしまうと、そのエラーを起こしたガジェットだけでなく、登録している全てが落ちてしまうようだ。うちでは、IO-DATAのDrive Centerがこの状態になって往生した。
いったんこうなってしまうと、コントロールパネルのデスクトップガジェットも開けなくなり、通常ではどうしようもなくなる。
この場合、
c:\Users\ユーザー名\AppData\Local\Microsoft\Windows Sidebar
にあるSettings.iniをテキストエディタで開き、エラーを起こしていると思われるガジェットの設定を削除する。
削除対象は、[Root]タグ内にある
Section?="?"
というセクション名の登録、
[Hashes]タグ内にあるプログラムの登録と、
[Section?]タグの内容そのものである。
念のため、編集前にはバックアップをとっておいた方が良いであろう。
また、同\Gadgets\の下にガジェットのプログラム本体(のフォルダ)があるので、場合によってはそのフォルダも削除する。
いや、ガジェットが落ちるようになってしまったけど、解決に関する情報がどこにもなくて、
いろいろやっている内に発見した。同様なことで困ったいる人がいたら、どうぞ。
登録:
投稿 (Atom)