30x30の画像をつくる

解決


ますお  2003-11-27 21:03:57  No: 80582

いつも参考にさせていただいております。
質問なのですが、
30マスx30マスの画像をつくりたいと思い、
以下のようなプログラムを作りました。
開発環境は、windows2000とVB6.0です。
************************************************
Private Sub Command1_Click()
            
GR = 56.7    '1グリッドの幅
            
For x = 744 To 744 + (31 * GR) Step GR
Picture1.Line (x, 744)-(x, (744 + 30 * GR))
Next x
For y = 744 To 744 + (31 * GR) Step GR
Picture1.Line (744, y)-((744 + 30 * GR), y)
Next y

End Sub
************************************************

このプログラムだと、32番目にも線が引かれてしまいます。
ただ「744」の値を「743」に変更すると、
きれいに30x30のマス目ができます。
「743」と「744」で、なぜ出力結果が違ってきてしまうのかが
わかりません。

よろしくお願いいたします。


k.k  2003-11-28 01:06:43  No: 80583

744はいっぱいあるよね。どこを743にかえるの
ぜんぶかえたところでけっかはいっしょ


k.k  2003-11-28 01:10:31  No: 80584

たぶん、Toの後ろのことを言っているのだと思うけど、
ステップ実行してみりゃわかる。


ますお  2003-11-28 01:44:11  No: 80585

すべての「744」と「743」を変更します。

ちなみに、vb2.0で実行したところ、「744」と「743」で
同じ出力結果(32番目の線がひかれる)がでました。
30x30のマス目をつくるということよりも、
「744」と「743」で違う結果がでるということがわかりません。


nanashi  2003-11-28 03:00:44  No: 80586

# For文に小数点を使うのは良くないと思います。
# (違う結果がでるというのもコレが原因だと思います)
# それと使う変数は必ずDim宣言した方が良いです。
# しないと全てVariant型として扱われます。
# モジュールの頭にOption Explicitをつけてください。

で、ますおさんがやろうとしていることは

Private Sub Command1_Click()
    Dim GR#, dStart#, dEnd#, x#, y As Double
    Dim lCnt As Long
    
    GR = 56.7                   '1グリッドの幅
    dStart = 743                '開始位置
    dEnd = dStart + (30 * GR)   '終了位置
    
    For lCnt = 0 To 30
        x = dStart + lCnt * GR
        Picture1.Line (x, dStart)-(x, dEnd)
        
        y = dStart + lCnt * GR
        Picture1.Line (dStart, y)-(dEnd, y)
    Next
End Sub


uchi  2003-11-28 03:09:07  No: 80587

浮動小数点の変数(xとy)をFor〜Nextの条件に使用している為、
誤差が発生しています。この為、ループ回数が自分の思ったと
おりの回数で回っていません。
試しに、以下のコードを実行して見てください。

Private Sub Command3_Click()
       
 Dim I As Double
 Dim GR As Double
 Dim X As Double

    GR = 56.7      '1グリッドの幅

    Debug.Print "--- 743の場合 ---"
    I = 0#
    For X = 743# To 743# + (30# * GR) Step GR
        Debug.Print "X(" & Format(I, "00") + ") " _
          & CStr(X = 743# + (I * GR))
        I = I + 1
    Next X

    Debug.Print "--- 744の場合 ---" + vbCrLf
    I = 0#
    For X = 744# To 744# + (30# * GR) Step GR
        Debug.Print "X(" & Format(I, "00") + ") " _
          & CStr(X = 744# + (I * GR))
        I = I + 1
    Next X

End Sub

実行結果で、"False"と出ているところは条件が不一致のため
一回分ループが回らないということになります。

対策としては、ループの変数は整数型の変数にして、ループの
中で表示する座標を計算するようにすると良いです。


ますお  2003-11-28 03:31:30  No: 80588

nanashi様
uchi様
ご返答、ありがとうございます。

「743」と「744」での出力結果の違いの原因がわかり助かりました。
変数の宣言に気をつけなくてはいけないのですね。気がつきませんでした。
教えていただいたサンプルプログラムを元に勉強していきたいと
思います。
本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加