ab.com コミュニティ https://www.activebasic.com/forum/ |
|
構造体の長さがおかしい https://www.activebasic.com/forum/viewtopic.php?t=782 |
ページ 1 / 1 |
作成者: | Ko [ 2006年3月01日(水) 20:42 ] |
記事の件名: | 構造体の長さがおかしい |
1.構造体中にバイト数の違う変数があると、全体の長さがおかしくなります。 (ABは ver4.21 です) 例えば、 コード: Type A c as Char w as Word End Typeの場合、Len()は 3 であるはずが 4 となり、 コード: Type B c as Char d as DWord End Typeでは、Len()は 5 であるはずが 8 となります。 また、メモリダンプはそれぞれ cc 00 ww ww cc 00 00 00 dd dd dd dd となっていました。 2.FormatMessage()の Const LANG_USER_DEFAULT = (SUBLANG_DEFAULT<<10) or LANG_NEUTRAL が抜けています。 以上修正お願いします。 |
作成者: | イグトランス [ 2006年3月01日(水) 22:06 ] |
記事の件名: | |
構造体のほうは境界調整(アラインメント)のためです。 たとえば4バイトのデータを読み書きするときにはメモリアドレスが4の倍数のほうが高速に読み書きできます。 それどころか,x86以外のCPUでは境界調整がなっていないとエラーになってしまうものもあります。 そのためバイト数が違うデータ型同士を1つの構造体やクラスに置くと,正しく境界調整するようにわざと「隙間」を置きます。 そのため見た目よりバイト数が多くなると言うことになるのです。 ヘルプでTypeを引けばわかりますが,境界調整する単位はAlignを修飾させれば好きに変更できます。 Align(1)なら1バイト単位に揃える,即ち境界調整しないということになります。 コード: #strict #prompt Type Align(1) A c as Char w as Word End Type Print SizeOf (A)これならAのサイズは3バイトになります。 LANG_USER_DEFAULTのほうは確かにないですね。 私としてはConst LANG_USER_DEFAULT = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)のほうがよいと思いますが。 (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)はコンパイルが通ることから全て定義されているようです) |
作成者: | 山本 [ 2006年3月01日(水) 22:28 ] |
記事の件名: | |
LANG_USER_DEFAULTに関しましては、次回のバージョンアップで対応しようと思います。 構造体アラインメントに関しましては、イグトランス様の解説のとおり、仕様ですのでご了承ください。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |