掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB6でswab関数と同じ事をする場合 (ID:103366)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> VB6でVC6のswab関数と同じことをするにはどうすればよいでしょうか。 そのものズバリの物は作れません。型を明示した上で Sub swab1_1(ByRef a As Type1, ByRef b As Type1) Sub swab1_2(ByRef a As Type1, ByRef b As Type2) Sub swab2_1(ByRef a As Type2, ByRef b As Type1) Sub swab2_2(ByRef a As Type2, ByRef b As Type2) のようなものを作る事ならばできますけれどね。 一応「同じユーザー定義型同士」もしくは 「同じバイナリサイズのユーザー定義型同士」ならば、 LSet ステートメントを用いてデータをコピーできます。 (異なるサイズの場合、不足した部分のコピーは実施されません) データ構造によっては、これで凌げないかを検討してみてください。 Option Explicit Private Type A X As Byte Y As Byte Z As Integer End Type Private Type B L As Long End Type Private Type C V(0 To 3) As Byte End Type Private Sub Form_Load() Dim A1 As A Dim B1 As B Dim C1 As C A1.X = &H12 A1.Y = &H34 A1.Z = &H5678 LSet B1 = A1 LSet C1 = A1 Debug.Print "A="; Debug.Print Right("00" & Hex(A1.X), 2); Debug.Print Right("00" & Hex(A1.Y), 2); Debug.Print Right("0000" & Hex(A1.Z), 4) Debug.Print "B="; Debug.Print Right("00000000" & Hex(B1.L), 8) Debug.Print "C="; Dim V As Variant For Each V In C1.V Debug.Print Right("00" & Hex(V), 2); Next Debug.Print End Sub いずれにせよ、結論としては >> #include <string.h> >> void swab(const void *from, void *to, size_t n); のようなことはできません。 そもそもVB ではユーザー定義型を受け取るための汎用型がありません。そのため Sub swab(ByRef a As Variant, ByRef b As Variant) Sub swab(ByRef a As Any, ByRef b As Any) のようなプロシージャを用意することができないためです。 「ユーザー定義型」ではなく、レジストリ登録された構造体であれば、 Variant で受けることもできますけれどね。 > byte配列ではなく、構造体をどうswapさせればよいのかが分かりません。 上記以外では、RtlMoveMemory API 等を併用して、メモリコピーを行うぐらいでしょうか。 (あとは、バイナリファイルに Put# して Get# しなおすとか) アライメント調整のパディングが含まれている場合や、参照型を含んだユーザー定義型では 単純コピーというわけにも行かないでしょうけれどね。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.