ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 02:05

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 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 が抜けています。

以上修正お願いします。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年3月01日(水) 22:06 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
構造体のほうは境界調整(アラインメント)のためです。

たとえば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)はコンパイルが通ることから全て定義されているようです)


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年3月01日(水) 22:28 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
LANG_USER_DEFAULTに関しましては、次回のバージョンアップで対応しようと思います。

構造体アラインメントに関しましては、イグトランス様の解説のとおり、仕様ですのでご了承ください。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot] & ゲスト[10人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean