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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

3515閲覧

値渡しと参照渡し(数値の入れ替え)

tsugfuxr-hdudhd

総合スコア17

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/11/18 02:49

編集2018/11/18 12:03

xとyの数値を入れ替えたいです。
このままで実行するとメッセージボックスに2と表示されます。

コードlass Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim x As Integer Dim y As Integer x = TextBox1.Text y = TextBox2.Text change(x, y) End Sub Private Function change(ByRef a As Integer, ByRef b As Integer) As Integer Dim c As Integer c = a a = b b = c Return MsgBox(a, b) End Function End Class

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

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

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

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

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

Zuishin

2018/11/20 04:29

コメントが長々とついていることから察してください。あの回答は無茶苦茶なので参考にしなくていいです。
guest

回答3

0

ベストアンサー

0 と表示されるということはコンパイルできているということで間違いありませんか?

それなら change の戻り値を表示しているからでしょう。
x と y を表示してみてください。

#追記

VB.NET

1Class Form1 2 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 3 Dim x As Integer 4 Dim y As Integer 5 6 x = TextBox1.Text 7 y = TextBox2.Text 8 9 change(x, y) 10 11 MsgBox(x) 12 MsgBox(y) 13 End Sub 14 15 Private Sub change(ByRef a As Integer, ByRef b As Integer) 16 Dim c As Integer 17 18 c = a 19 a = b 20 b = c 21 End Sub 22End Class

#追記
もし TextBox の内容を交換したいということなら

VB.NET

1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 2 Dim t As String 3 t = TextBox1.Text 4 TextBox1.Text = TextBox2.Text 5 TextBox2.Text = t 6 End Sub

投稿2018/11/18 02:54

編集2018/11/20 05:05
Zuishin

総合スコア28656

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

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

tsugfuxr-hdudhd

2018/11/20 11:52

色々と議論してくださりありがとうございます。 msgboxが2つになってしまいますが追記で書いてくださったコードで解決できました。 ありがとうございました。
Zuishin

2018/11/20 12:09

kenshirou さんが MsgBox が一つのものを最初から回答されています。 文字列の連結がわかりにくいのかと思い、二つにしました。 また、この追記は私の最初の回答を具体的なコードに起こしただけです。
guest

0

MsgBox(change(x, y))は、change(x, y)のReturn値をメッセージボックスに表示します。
ただし、changeメソッドを見ると、Return値がセットされていません。
changeメソッドのReturn値の型はIntegerなので、何も設定されていないと初期値として0を返します。
なので、メッセージボックスに0が表示されるのは正しい結果です。
例えば、例示コードを以下のように変更すると、例えば元のxの値が3, yが5だった場合、メッセージボックスに「x=5 y=3」のように表示され、xとyが入れ代わったことが分かります。

VB

1Public Class Form1 2 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 3 Dim x As Integer 4 Dim y As Integer 5 6 x = textbox1.text 7 y = textbox2.text 8 9 change(x, y) 10 MsgBox("x=" & x.Tostring & " y=" & y.ToString) 11 End Sub

2018/11/20 追記

誤った情報を元に提示コードを修正されたようですが、「MsgBox(a, b)」の使い方は誤りです。
おそらくMsgBoxに表示される値はaの値、つまりTextBox2.Textの値になると思いますが、MsgBoxの第2引数(「MsgBox(a, b)」のbに該当する所)は、メッセージボックスに表示するボタンや表示アイコン(警告マークや禁止マークなど)等を指定するためのものです。
おそらくbの値(つまりTextBox1.Textの値)により、ボタン表示や表示アイコンが変わるでしょう。
詳細は、以下サイトをご覧ください。
https://msdn.microsoft.com/ja-jp/library/cc410277.aspx

投稿2018/11/18 06:51

編集2018/11/20 04:18
kenshirou

総合スコア772

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

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

0

change(x, y))の関数では、何も返してないよ?だから0ってでるんじゃない?
また、関数内でreturnをつけても、求められる解は一つだけですけど。

change関数内の最後の行に
MsgBox(a,b)
かな?
Private Sub Button1_Click内のmsgboxは削除?

投稿2018/11/18 06:35

編集2018/11/18 06:37
akirafudo6

総合スコア341

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

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

YAmaGNZ

2018/11/18 13:21 編集

MsgBox関数は Public Function MsgBox (Prompt As Object, Optional Buttons As MsgBoxStyle = Microsoft.VisualBasic.MsgBoxStyle.ApplicationModal, Optional Title As Object = null) As MsgBoxResult となっていますので、MsgBox(a,b)で値の両方が表示されることはありません。 また、今回の趣旨から行くと、change関数内で値の確認を行ってもあまり意味はないかと思います。
akirafudo6

2018/11/18 14:14

x,yをprivateにするってのも、ありかな function(関数)でなくて、その部分はあくまでも、サブルーチンにするとか?
akirafudo6

2018/11/18 14:22

関数とか、メソッドというのは、戻り値が一つなんだよね。ロジック的に戻り値が2個以上と頭で考えてしまうのは、構造化プログラミングの名残だね。慣れるまで、物(オブジェクト)としてとらえて、それを表現するために、プロパティとか、戻り値とかをどのようにとらえて、試行錯誤するしかないですね。その方法のひとつとして、他の人のロジックを追っかけてみて、この人はどうしてこのうようなロジック にしたんだろうということを、考えていくしかいですね。
Zuishin

2018/11/18 23:05

それに ByRef をつけているので元々の変数を書き換えることができています。 あと構造化プログラミングは過去のものではありませんし、何が名残なのかよくわかりません。
akirafudo6

2018/11/19 02:57

構造化プログラミングとは、コードレベルの話でなくて、機能レベルのことを言いました。たとえば、if~endifのような構造化ではなく、モジュールレベルで考えると、モジュールをオブジェクトレベルで考えるのではなく、機能レベルで考えることです。そうすると、ひとつのモジュール(ここでは、内部サブルーチン、メソッドを意味します..モジュールのとらえ方も利用している言語によりとらえ方が異なってくる)が複数の解となってしまうということです。COBOL、RPGなど構造化でプログラミングしている人は、オブジェクト指向言語を使うと、同じようにプログラミングすることによりソースがグチャグチャになり苦労するということを言いたかったのです。 ByRefをつけて、変数を書きかえるというのは結果的にそれは元関数からの戻り値として扱っているということではないと思います。複数できるというのは、戻り値をオブジェクト型で返すということを言って おられるのかな?これも私は一つととらえていますがけど? タプルの利用は、vb2017からですね(私の環境では利用できない)。ただ利用するにしても環境設定および、宣言が必要ですね。また、呼び出し先の値を操作外から操作できるということは危険なロジックと推測されます あまり、お勧めできないものですね。 話を戻して、関数の戻り値がintegerと宣言しているし戻り値は一つの数字型に対して2と出ていることが疑問なのだと思います。入力した値(textbox1、textbox2)に何を入力したのかは不明ですけど。おそらく、御質問者さんは、結果としてtextbox2、textbox1の形式で表示されることを期待していたのではないでしょうか?
Zuishin

2018/11/19 03:05

これは私では意志の疎通が難しい人のようです。
YAmaGNZ

2018/11/19 03:18

質問者さんの最初のコードでは、change関数をコールした結果をメッセージボックスにて出力し確認しようという趣旨のコードだったかと思います。 それを、関数内での値の確認とし、MsgBox関数の使用方法が間違っているため、値の確認もできない回答はどうなのかと思いコメントさせていただきました。 構造化うんぬんとは全く関係ない話だと思いますが・・・
akirafudo6

2018/11/19 03:31

御質問者様の補足回答を待ちましょう
akirafudo6

2018/11/19 03:36

Zuishin さん。日本語って、難しいね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問