VB6.0で、LSetの動作がわからない

このQ&Aのポイント
  • VB6.0のLSetの動作についてわかりません。コードを実行するとデバッグウィンドウに「1234.567」と表示されるのですが、なぜこのような結果になるのか知りたいです。
  • VB6.0のLSetを使用して、X.B配列の値をY.S変数に代入しています。コードを実行すると、デバッグウィンドウに「1234.567」という結果が表示されますが、なぜこのような値になるのか理解できません。詳しい解説をお願いします。
  • VB6.0のLSetを使用したコードで、X.B配列の値をY.S変数に代入しています。コードを実行してデバッグウィンドウには「1234.567」と表示されますが、この結果がどのようにして得られるのか理解できません。詳しい説明をお願いします。
回答を見る
  • ベストアンサー

VB6.0で、LSetの動作がわからない

よろしくお願いします。 LSetのサンプルを検索していて以下のコードを見つけました。 Option Explicit Private Type B4 B(3) As Byte End Type Private Type S1 S As Single End Type Private Sub Form_Load() Dim X As B4 Dim Y As S1 X.B(0) = 37 X.B(1) = 82 X.B(2) = 154 X.B(3) = 68 LSet Y = X Debug.Print Y.S End Sub このコードを実行するとデバッグウィンドウに 1234.567 と表示されます。 このコードではいったい何が起こっているのでしょうか? X.Bとして4つの配列変数が用意され、それがY.Sという配列ではない通常の変数に代入されているのはわかるのですが、 どうして結果が1234.567になるのかわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

LSetでユーザ定義型をコピーすると単にメモリ領域がコピーされます。 つまり4つのバイトを浮動小数(Single)として解釈するという意味になります。 32ビットの浮動小数は 符号1ビット、指数部8ビット(127のゲタ履き)、仮数部23ビット(最左のビット省略) の様に表されます。 つまり、 1234.567 は、 2進数で表現すると 01000100 10011010 01010010 00100101 で、コレをバイト区切りで 10進数にすると 68 154 82 37 になります。 01000100 10011010 01010010 00100101 を先程の、浮動小数の定義にそって区切るとすると 0 10001001 (1:省略されているビット)00110100101001000100101 になります。 先頭の0は、符号が正 次の 10001001は、137で、137-127で、ビットが10ビット左シフトされることを示しています 仮数部 00110100101001000100101 は、 1.00110100101001000100101 で、この小数点位置を10桁ずらすと 10011010010.1001000100101 小数でない部分 10011010010 は 10進で1234 小数部は、 1001000100101 1/2+1/16+1/256+1/2048+1/8192 =0.5670166015625 ということになります

tochanx
質問者

お礼

ありがとうございます・・・ここまで丁寧に教えていただきありがとうございます。

関連するQ&A

  • VB初心者です。コードの書き方が分かりません。

    VB初心者です。 VBで(zのn乗)-(xのn乗+yのn乗)の計算が出来るようにしたいのですが、答えが必ず-1になってしまいます。 Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) End Sub End Class 正しいコードの書き方を教えて下さい。 また特定の答えのときにメッセージを表示したいのですが、どうすればいいですか?

  • Callで呼び出したプロシージャから変数を持ち帰るには

    Private Sub test1() Dim x, y x = 1 y = 2 Call test2(x, y) '* End Sub Private Sub test2(x, y) Dim z z = x + y End Sub 上記のようなコードで、*の部分でtest2のx+yの結果が格納された状態の変数zを使うにはどうすればいいですか?

  • VBでの簡易電卓の作成(減算方法)で困っています。

    技術評論社のVisual Basic5.0入門編という、 参考書を見ながら、作成したのですが。 どうも、参考書のコードが間違っているみたいでした 良かったら、お知恵をお貸しください。 とりあえず、足し算と引き算処理の作成です。 ※使用コントロール 0から9までのコマンドボタンをコントロール配列と、 足し算、引き算、クリアーのコマンドボタンが3つ、 後、数字入力用のテキストボックスが1つです。 コード **************************************************** Option Explicit Dim EnterFlag As Boolean 'プラス、マイナスキーが押された直後ならTrueを示すフラグ。 Dim S As Long Private Sub Command3_Click() 'クリアーボタン Text1.Text = "" S = 0 End Sub Private Sub Plas_Click() '加算処理 S = S + Val(Text1.Text) Text1.Text = S EnterFlag = True End Sub Private Sub Mainas_Click() '減算処理 S = S - Val(Text1.Text) Text1.Text = S EnterFlag = True End Sub Private Sub Form_Load() Text1.Text = "" S = 0 End Sub Private Sub key_Click(Index As Integer) If EnterFlag Then Text1.Text = "" EnterFlag = False End If If Len(Text1.Text) < 10 Then '10桁以内のとき Text1.Text = Text1.Text & Index End If End Sub ********************************************************* とこんな感じです。 加算処理は、上手くできますが。 減算処理は、明らかにコードが間違っていると思いました。 初めて(1回目)マイナスボタンを押した時に、変数Sには、必ずマイナス が入ってしまう状態です。 上手く減算処理出来る方法のアドバイスよろしくお願いします。

  • このような使い方は間違っているのでしょうか?(VB.NET2002)

    このような使い方は間違っているのでしょうか?(VB.NET2002) Dim count As Int16 Private Sub JOB(ByVal x) x = x + 1 TextBox1.Text = x End Sub Private Sub Button1_Click(・・・・ JOB(count) End Sub

  • Excel2016 VBA

    Windows10 ,Excel2016 バージョン1809 , VBA7.1を使用しています。 下記のコード(ホームページに掲載されているコードを写して実行しようとした。)で、 Attributeの箇所に、 コンパイルエラーと構文エラーが出ます。 Module1をaaaにしたり、Attributesと書き換えたりしてもエラーが消えません。 どなたか正常にコンパイルする書き方を教えてください。 お願いします。 Attribute VB_Name = "Module1" '************************************ 'ラベル発行のサンプル '************************************ Option Explicit ' 各項目の配置定義用ユーザー定義 Private Type typLocation X As Long Y As Long COL As Long End Type Private Const cnsSH1 = "DATA" Private Const cnsSH2 = "LABEL" Private Const cnsSH1 = "設定" Private Const cnsOMIT = "除外" '******************************************************************************* ' ラベル発行 '******************************************************************************* Sub PrintLabels() Dim xlApp As Application Dim WBK As Workbook '本ブック Dim SH1 As Worksheet 'DATA Dim SH2 As Worksheet 'LABEL Dim SH3 As Worksheet '設定 Dim tblLoc(1 To 10) As typLocation '項目配置定義(ユーザー定義を配列化) End Sub

  • VB6 ドラッグ&ドロップ

    Image1をPicture1(正方形)にドラッグ&ドロップするプログラム を作りたいと思っています。 このプログラムだとImage1全体がドラッグされるのではなく、 Image1の絵はその位置に残ってImage1の外枠だけがドラッグされてしまいます。 外枠だけでなくImage1の絵も一緒にドラッグできるようにするにはどうすればいいのでしょうか? また、このプログラムだとドロップする場所(Picture1_)以外で ドロップしてしまった場合でも画面上からImage1の絵と外枠が消えてしまいます。 ドロップする場所(Picture1_)以外でドロップしてしまった場合は、 Image1全体を画面上に残しておきたいのですがどうすればいいのでしょうか? Option Explicit Dim dx As Single, dy As Single Private Sub Form_Load() Image1.Picture = LoadPicture(App.Path & "picture.jpg") Image1.Stretch = True End Sub Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) Source.Move X - dx, Y - dy End Sub Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Image1.Drag 1 dx = X: dy = Y 'マウスダウン位置 End Sub Private Sub Picture1_DragDrop(Source As Control, X As Single, Y As Single) Source.Visible = False 'ドロップオブジェクトを非表示にする Picture1.BackColor = RGB(255, 255, 255) End Sub Private Sub Picture1_DragOver(Source As Control, X As Single, Y As Single, _ State As Integer) If State = 0 Then Picture1.BackColor = RGB(0, 0, 255) If State = 1 Then Picture1.BackColor = RGB(255, 255, 255) End Sub

  • VB.NET 2つの配列を連動して並び替える

    VB.NETで2つの配列の一方を文字列の長い順番に並び替えて 他方の配列もその順番に並び替えたいのですが どのようにすればよろしいでしょうか。 例えば、 A(0)="Japan" A(1)="America" A(2)="People's Republic of China" A(3)="Republic of Korea" A(4)="Democratic People's Republic of Korea" B(0)="Tokyo" B(1)="Washington, D.C." B(2)="Beijing" B(3)="Seoul" B(4)="Pyongyang" という2つの配列があって 配列A()を文字列の長い順番に並び替えると A(0)="Democratic People's Republic of Korea" A(1)="People's Republic of China" A(2)="Republic of Korea" A(3)="America" A(4)="Japan" となりますが、この時配列B()も以下のように 配列A()の順番と同じ順番になってほしいのです。 B(0)="Pyongyang" B(1)="Beijing" B(2)="Seoul" B(3)="Washington, D.C." B(4)="Tokyo" なお、配列A()の並べ替えは以下のようにしていますので できましたら、このコードに追記する感じで 教えていただけるとありがたいです。 よろしくお願いします。 ------------------------------------------------------ Module Module1 Sub Main() Dim A(4) As String Dim B(4) As String A(0) = "Democratic People's Republic of Korea" A(1) = "People's Republic of China" A(2) = "Republic of Korea" A(3) = "America" A(4) = "Japan" B(0) = "Pyongyang" B(1) = "Beijing" B(2) = "Seoul" B(3) = "Washington, D.C." B(4) = "Tokyo" Dim comp As New LengthComparer() Array.Sort(A, comp) For Each s As String In A Console.WriteLine(s) Next End Sub Public Class LengthComparer Implements System.Collections.IComparer Implements System.Collections.Generic.IComparer(Of String) Public Function Compare(ByVal x As String, ByVal y As String) As Integer _ Implements System.Collections.Generic.IComparer(Of String).Compare If y Is Nothing AndAlso x Is Nothing Then Return 0 End If If y Is Nothing Then Return -1 End If If x Is Nothing Then Return 1 End If Return y.Length.CompareTo(x.Length) End Function Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _ Implements System.Collections.IComparer.Compare If y Is Nothing AndAlso x Is Nothing Then Return 0 End If If y Is Nothing Then Return -1 End If If x Is Nothing Then Return 1 End If If Not (TypeOf y Is String) Then Throw New ArgumentException("String型でない", "y") ElseIf Not (TypeOf x Is String) Then Throw New ArgumentException("String型でない", "x") End If Return Me.Compare(DirectCast(y, String), DirectCast(x, String).Length) End Function End Class End Module ------------------------------------------------------

  • 「VB4.0の「LSet」と同等の機能をVB2008で実行するには?」のリストを修正します

    「VB4.0の「LSet」と同等の機能をVB2008で実行するには?」の質問で リストに間違いがあったので訂正します。 Public Type TpstndefをPublic Type Tpkyokudef VB2008の練習のために、VB4.0のコードをVB2008にコンバージョンしています。 VB4.0の「LSet」がどうしてもコンバージョンできません。 LSet 以外はVB2008で機能がありました。 なにか方法はないでしょうか。 リストをコピーします。 Public Type Tpkyokudef equip As Integer stn_no As Integer stn_class As Integer line_no As Integer stn_kind As Integer End Type Dim kdata As Tpkyokudef Dim rbuf As buf1K    ・   省略    ・ Get #fno, seeksize, rbuf LSet kdata = rbuf

  • VB.NETで値や参照について ByRefなど

    VB.NETで値や参照について、まだ初学ですがよろしくお願いします。 VBは2008です。 以下のようなs文字列を参照引数にしたSetDataメソッドがあります。 ByRef s As Stringという引数は、SetData内でsを書き換えると、 呼び出したSetDataメソッド外でも中身が変わるので 私のByRefの認識ではポインタと解釈しています。間違っているでしょうか? SetData(1,1, buf)とすれば、DataGridViewの中は、「初期値」という文字が表示されます。 別のメソッド(KaKikae)でbufを"あ"という文字に変えた場合、SetDataメソッドを使わなくても 書き換わっていると思っていたのですが、実際実行してみると書き換わりません。 値や参照について理解が足りないからだと思いますがわかりません。 どのようにすれば、それが実現できるのでしょうか? Public Class HogeClass Private buf As String = "初期値" Private Sub SetData(ByVal x As Integer, ByVal y As Integer, ByRef s As String) As Boolean Dim dg As DataGridView dg = DataGridView1 dg.Item(x, y).value = s End Sub Private Sub KaKikae() buf = "あ" End Sub End Class

  • プロパティを通さなければアクセスできない変数を設定したい(VB2005)

    下記はメンバ変数とプロパティのコードです。 -------------------------------------- 'メンバ変数 Private _hoge As Integer = 1 'プロパティ Private ReadOnly Property phoge()   Get     Return _hoge   End Get End Property -------------------------------------- 上記の構造だと、同じクラス内であれば、下記のようにメンバ変数へプロパティを通さずアクセスが可能です。 Private Sub aaa()   MessageBox.Show(_hoge)   ' 1 と表示される(ここでエラーを出したい) End Sub 質問内容は、変数_hogeに対してアクセスするには、(同じクラス内からのアクセスであっても)プロパティを通さなければならない形にしたい、というものです。 つまり、下記のような形でないとエラーが発生するようにしたいと考えています。 Private Sub aaa()   Dim foo As Integer = phoge()   MessageBox.Show(foo) End Sub どうぞよろしくお願い致します。

専門家に質問してみよう