質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Q&A

解決済

2回答

2148閲覧

プログラムのエラー(ファイルの出力がうまくいかない)

k.min

総合スコア12

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

0グッド

1クリップ

投稿2016/09/24 08:56

###前提・実現したいこと
2次元拡散方程式のプログラムを作成しています。

計算結果をコンター図で表すため,それぞれの時刻と位置における値を出力したいです。

###発生している問題・エラーメッセージ
csvファイルは作成されているが、データが全く入っていない。

###該当のソースコード
Public Class Form1
Dim b, h, wcr, ic, bc, dx, dy, dt, t, tmax, rx, ry As Double
Dim i, j, l, m, n, p, q, r, s, x, y As Integer
Dim c0(b, tmax), c1(x, y), c2(x, y) As Double
Dim FileNum As Short
Dim FileOut As String

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Call Cl_ion_Calculate() End Sub Sub Cl_ion_Calculate() Dim i, j, l, m, n, p, q, r, s, x, y As Integer b = Val(TextBox1.Text) h = Val(TextBox2.Text) wcr = Val(TextBox3.Text) dx = Val(TextBox4.Text) dy = Val(TextBox5.Text) dt = Val(TextBox6.Text) ic = Val(TextBox7.Text) bc = Val(TextBox8.Text) tmax = Val(TextBox9.Text) t = tmax / dt x = b / dx y = h / dy rx = dt / dx ^ 2 ry = dt / dy ^ 2 ReDim c0(b, tmax), c1(x, y), c2(x, y) For i = 0 To x For j = 0 To y c1(i, j) = ic Next j Next i For l = 1 To t For m = 1 To x c2(m, 0) = bc Next m For n = 1 To y c2(0, n) = bc c2(x, n) = bc Next n For p = 1 To x - 1 For q = 1 To y - 1 c2(p, q) = (1 - 2 * rx) * c2(p, q) + rx * c2(p - 1, q) + rx * c2(p + 1, q) + (1 - 2 * ry) * c2(p, q) + ry * c2(p, q - 1) + ry * c2(p, q + 1) Next Next For r = 0 To x For s = 0 To y c1(r, s) = c2(r, s) Next Next Next Call FOpen() Call FSave() MsgBox("Finish") End Sub Sub FOpen() FileOut = "D:result.csv" FileNum = FreeFile() FileOpen(FileNum, FileOut, OpenMode.Output) End Sub Sub FSave() Dim c2 As Object For r = 1 To x For s = 1 To y WriteLine(FileNum, l, r, s, c2(r, s)) Next Next End Sub

End Class

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

あまり内容を理解せずに回答しますので、間違ってたらすみません。
FSave関数の中でc2配列の中身を出力しようとしていますね。
ループの回数はxとyですが、これはCl_ion_Calculate関数の中で算出されています。
が、変数xとyはグローバル変数で宣言されているにも関わらず、Cl_ion_Calculate関数内でもローカル変数として宣言されてしまっています。
Cl_ion_Calculate関数内ではローカル変数の方が優先度は高いですから、グローバル変数のxとyに値が設定されていない可能性ああります。
Cl_ion_Calculate関数内の変数宣言を削除して実行してみてください。
この行。

VB

1Sub Cl_ion_Calculate() 2'Dim i, j, l, m, n, p, q, r, s, x, y As Integer コメントアウト

投稿2016/09/26 02:05

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

以下のようなイメージではないかと思うのですが、いかがでしょうか?
一旦ans(,)に入れているのは私の好みですので、直接l,r,s,c2(r,s)をWritelineで書き込んでも問題ありません。

VB

1Sub Cl_ion_Calculate() 2 3 Dim i, j, l, m, n, p, q, r, s, x, y As Integer 4 Dim ans(,) As Double 5 FileOut = "D:result.csv" 6 FileNum = FreeFile() 7 FileOpen(FileNum, FileOut, OpenMode.Output) 8 9 10 b = Val(TextBox1.Text) 11 h = Val(TextBox2.Text) 12 wcr = Val(TextBox3.Text) 13 dx = Val(TextBox4.Text) 14 dy = Val(TextBox5.Text) 15 dt = Val(TextBox6.Text) 16 ic = Val(TextBox7.Text) 17 bc = Val(TextBox8.Text) 18 tmax = Val(TextBox9.Text) 19 20 t = tmax / dt 21 x = b / dx 22 y = h / dy 23 rx = dt / dx ^ 2 24 ry = dt / dy ^ 2 25 26 ReDim ans(3, t) 27 28 ReDim c0(b, tmax), c1(x, y), c2(x, y) 29 30 't=0 31 For i = 0 To x 32 For j = 0 To y 33 c1(i, j) = ic '初期値 34 Next j 35 Next i 36 37 For l = 1 To t 38 ans(0, l) = l 39 '境界条件 40 For m = 1 To x 41 c2(m, 0) = bc 42 Next m 43 For n = 1 To y 44 c2(0, n) = bc 45 c2(x, n) = bc 46 Next n 47 48 For p = 1 To x - 1 49 For q = 1 To y - 1 50 c2(p, q) = (1 - 2 * rx) * c2(p, q) + rx * c2(p - 1, q) + rx * c2(p + 1, q) + (1 - 2 * ry) * c2(p, q) + ry * c2(p, q - 1) + ry * c2(p, q + 1) 51 Next 52 Next 53 54 For r = 0 To x 55 ans(1, l) = r 56 For s = 0 To y 57 ans(2, l) = s 58 c1(r, s) = c2(r, s) 59 ans(3, l) = c2(r, s) 60 WriteLine(FileNum, ans(0, l), ans(1, l), ans(2, l), ans(3, l)) 61 Next s 62 Next r 63 Next l 64 'Call FOpen() 65 'Call FSave() 66 67 MsgBox("Finish") 68 69 End Sub

なお、初期値として恐らく適当ではないと思いますが、以下のような初期値、境界条件で実行すると、計算開始1time step、2time step後に、以下のようなプロットが得られます。
イメージ説明

投稿2016/09/24 21:34

編集2016/09/26 09:35
cesolution

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問