• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

cơ chế truyền tham số

Đây là nơi để các bạn trao đổi về cấu trúc dữ liệu và giải thuật

Điều hành viên: Điều hành

lieutraichidi
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Bảy 21/07/2012 9:31 am
Has thanked: 1 time

cơ chế truyền tham số

Gửi bàigửi bởi lieutraichidi » T.Sáu 17/08/2012 2:45 pm

mình găp một đoạn chương trình sau:

Mã: Chọn hết

dim a as integer,b as integer,c as integer
private sub vidu(m as integer,byval n as integer, byref p as integer)
m= n+p
n=p+m
p=m+n
end sub
private sub command_click1()
a=1
b=2
c=3
call vidu(a,b,c) 'gọi 1
call vidu(a,a,a) 'gọi 2
end sub

hỏi sau khi lệnh gọi 1 chạy xog ta có a,b,c bằng ?
mình đã tự tính và thấy kết quả theo thứ tự là 5,2,3 nhưng khi chạy thử máy báo là 5,2,13 vậy lí do tại sao? xin được mọi người giúp đỡ xin cảm ơn
Sửa lần cuối bởi lieutraichidi vào ngày T.Bảy 18/08/2012 9:23 am với 2 lần sửa.



Hình đại diện của người dùng
xuanha
Guru
Guru
Bài viết: 1222
Ngày tham gia: T.Năm 19/08/2010 4:25 pm
Đến từ: Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên
Has thanked: 13 time
Been thanked: 380 time
Liên hệ:

Re: CƠ CHẾ TRUYỀN THAM SỐ

Gửi bàigửi bởi xuanha » T.Sáu 17/08/2012 8:20 pm

private sub vidu(m as integer,byval n as integer, byref p as integer)
m= n+p
n=p+m
p=m+n
end sub

private sub command_click1()
a=1
b=2
c=3
call vidu(a,b,c) 'gọi 1
call vidu(a,a,a) 'gọi 2
end sub

call vidu(a,b,c) tức là bạn gọi chương trình con với các tham số như sau:
call vidu(1,2,3)
m=1, n=2, p=3
m= n+p = 2+3=5
n=p+m = 3+5 = 8
p=m+n = 5+8=13
Vậy, khi gọi call vidu(a,b,c) thì có các giá trị lần lượt là 5, 8, 13.

call vidu(a,a,a) tức là bạn gọi chương trình con với các tham số như sau:
call vidu(1,1,1)
m=1, n=1, p=1
m= n+p = 1+1 = 2
n=p+m = 1+2 = 3
p=m+n = 2+3 = 5
Vậy, khi gọi call vidu(a,a,a) thì có các giá trị lần lượt là 2, 3, 5.
Nhưng trong chương trình bạn viết thì làm gì có chỗ nào để hiển thị giá trị của m, n, p thì làm sao biết được kết quả sau khi thực hiện các phép toán.
Có thể bổ sung thêm đoạn này vào Sub Vidu như sau:
  1. private sub vidu(m as integer,byval n as integer, byref p as integer)
  2. m= n+p
  3. n=p+m
  4. p=m+n
  5. msgbox "kết quả các giá trị như sau: m = " & m & ", n = " & n & ", p = " & p
  6. end sub
  7.  
Kiểm phiếu Đại hội Đoàn, Đại hội Đảng
http://caulacbovb.com/forum/viewtopic.php?t=23599

lieutraichidi
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Bảy 21/07/2012 9:31 am
Has thanked: 1 time

Re: CƠ CHẾ TRUYỀN THAM SỐ

Gửi bàigửi bởi lieutraichidi » T.Sáu 17/08/2012 11:18 pm

mình chưa bị thuyết phục với cách lí giải này cho lắm,vả lại kết quả nó cũng bị sai nữa bây giờ đầu tiên mình sẽ tính "gọi 1" trước đã hen đoạn code mình gõ trên máy như sau:
Dim a As Integer, b As Integer, c As Integer
Private Sub vidu(m As Integer, ByVal n As Integer, ByRef p As Integer)
m = n + p
n = p + m
p = m + n
End Sub
Private Sub Command1_Click()
a = 1
b = 2
c = 3
Call vidu(a, b, c)
Print a, b, c
End Sub
và đúng kết quả xuất ra màn hình là 5,2,13.Vả lại khi ta định nghĩa thủ tục như trên thì giá trị n (byval) là truyền theo giá trị nên nó không đổi nên cách tính của mình như thế này xem thử đúng ko nha:
m=n+p=2+3=5
n=p+m=2 bất chấp p và m bằng bao nhiêu bởi vì ta khai báo là byval nên giá trị truyền vào nó vẫn giữ nguyên
p=m+n=1+2=3
vậy ta kết luận là 5,2,3 nhưng khi chạy thì ra kết quả là 5,2,13
sau khi gọi 1 chạy xog thì a=5
tiếp tục truyền tham số thì m=5,n=2,p=5
m=n+p=2+5=7
n=p+m=2(byval)
p=m+n=5+2=7
vậy khi gọi 2 chạy xog ta có a=7 bạn kiểm tra giúp mình xem như vậy có đúng ko ak?

Hình đại diện của người dùng
xuanha
Guru
Guru
Bài viết: 1222
Ngày tham gia: T.Năm 19/08/2010 4:25 pm
Đến từ: Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên
Has thanked: 13 time
Been thanked: 380 time
Liên hệ:

Re: CƠ CHẾ TRUYỀN THAM SỐ

Gửi bàigửi bởi xuanha » T.Bảy 18/08/2012 12:19 am

Làm như bạn thì hình ảnh dưới đây là minh chứng (code và kết quả)
Tập tin đính kèm
Kequa.PNG
Kiểm phiếu Đại hội Đoàn, Đại hội Đảng
http://caulacbovb.com/forum/viewtopic.php?t=23599

lieutraichidi
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Bảy 21/07/2012 9:31 am
Has thanked: 1 time

Re: CƠ CHẾ TRUYỀN THAM SỐ

Gửi bàigửi bởi lieutraichidi » T.Bảy 18/08/2012 1:02 am

đây là code của mình
Tập tin đính kèm
Untitled.png
Untitled.png (9.05 KiB) Đã xem 2572 lần

Hình đại diện của người dùng
vietteiv
Quản trị
Quản trị
Bài viết: 1318
Ngày tham gia: T.Bảy 10/02/2007 12:17 am
Đến từ: Cung cấp giải pháp quản lý doanh nghiệp, dự án, tư vấn xây dựng
Has thanked: 6 time
Been thanked: 69 time
Liên hệ:

Re: CƠ CHẾ TRUYỀN THAM SỐ

Gửi bàigửi bởi vietteiv » T.Bảy 18/08/2012 8:39 am

[mod=]tác giả sửa lại tiêu đề bài viết và cho code vào thẻ đúng quy định. thời hạn hết ngày 18/08/2012[/mod]

lieutraichidi
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Bảy 21/07/2012 9:31 am
Has thanked: 1 time

Re: CƠ CHẾ TRUYỀN THAM SỐ

Gửi bàigửi bởi lieutraichidi » T.Bảy 18/08/2012 9:12 am

xin lỗi mới vào diễn đàn một thời gian ngắn nên chưa có hiểu lắm về cách cho code vào thẻ đúng quy định là ntn xin được hướng dẫn thêm,còn tiêu đề thì vậy là được rồi có gì không phù hợp đâu mà chỉnh sửa

lieutraichidi
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Bảy 21/07/2012 9:31 am
Has thanked: 1 time

Re: CƠ CHẾ TRUYỀN THAM SỐ

Gửi bàigửi bởi lieutraichidi » T.Bảy 18/08/2012 9:21 am

à thì ra vậy chỉ là viết toàn chữ in hoa trong tiêu đề thôi.

Hình đại diện của người dùng
nhochoclaptrinh
Thành viên danh dự
Thành viên danh dự
Bài viết: 514
Ngày tham gia: T.Bảy 28/05/2011 12:10 pm
Has thanked: 15 time
Been thanked: 83 time

Re: cơ chế truyền tham số

Gửi bàigửi bởi nhochoclaptrinh » T.Bảy 18/08/2012 9:14 pm

Thế này là sao không hiểu nhỉ ?
ByVal thì làm cho tham số được truyền vào không được truyền ra , còn ByRef (hoặc không có ByRef và Byval) thì ngược lại.
  1. Private a As Integer, b As Integer, c As Integer
  2.  
  3. Private Sub NotTransmission(ByVal var_a As Integer, ByVal var_b As Integer, ByVal var_c As Integer)
  4.     var_a = var_b + var_c
  5.     var_b = var_c + var_a
  6.     var_c = var_a + var_b
  7. End Sub
  8.  
  9.  
  10. Private Sub CanTransmission(ByRef var_a As Integer, ByRef var_b As Integer, ByRef var_c As Integer)
  11.     var_a = var_b + var_c
  12.     var_b = var_c + var_a
  13.     var_c = var_a + var_b
  14. End Sub
  15.  
  16.  
  17.  
  18. Private Sub Form_Load()
  19.     a = 1
  20.     b = 2
  21.     c = 3
  22.     'Now, see value of a, b and c
  23.    Call NotTransmission(a, b, c)
  24.     MsgBox "Return from 'NotTransmission': a = " & a & " ; b = " & b & " ; c = " & c
  25.    
  26.     'Now, see value of a, b and c after ByRef
  27.    Call CanTransmission(a, b, c)
  28.     MsgBox "And Return 'CanTransmission' : a = " & a & " ; b = " & b & " ; c = " & c
  29. End Sub
  30.  

Và dùng ByRef hoặc ByVal thì các tham số truyền vào có thể thay đổi giá trị trong hàm đó chứ ko giữ nguyên đâu, chỉ có điều nó có được trả về cho biến vừa gán vào hay không, nếu muốn giữ nguyên tham-số-vào thì chỉ cần dùng thêm biến tạm nữa là xong :)
Sad eyes never lie :((

lieutraichidi
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Bảy 21/07/2012 9:31 am
Has thanked: 1 time

Re: cơ chế truyền tham số

Gửi bàigửi bởi lieutraichidi » T.Bảy 18/08/2012 9:46 pm

sao bạn lại khai báo đến 3 biến là byref luôn.
byref là truyền theo tham khảo giá trị của biến sẽ thay đổi
byval là truyền theo giá trị giá trị của biến vẫn giữ y khi truyền vào.Nhưng khó hiểu là khi cho vb6 chạy nó in ra kết quả 5 2 13 vả lại đáp án cũng cho vậy nên mình vẫn chưa thỏa mãn lắm với cách lí giải này.nhưng dù sao vẫn cảm ơn hể:)

Hình đại diện của người dùng
nhochoclaptrinh
Thành viên danh dự
Thành viên danh dự
Bài viết: 514
Ngày tham gia: T.Bảy 28/05/2011 12:10 pm
Has thanked: 15 time
Been thanked: 83 time

Re: cơ chế truyền tham số

Gửi bàigửi bởi nhochoclaptrinh » CN 19/08/2012 8:26 am

ặc... :P
Nếu

mà m không thay đổi thì cộng vào làm gì chớ !
Sad eyes never lie :((

mttabo
Bài viết: 3
Ngày tham gia: T.Bảy 26/02/2011 10:10 pm

Re: cơ chế truyền tham số

Gửi bàigửi bởi mttabo » CN 18/01/2015 4:50 pm

Mình thấy bạn lieutraichidi hỏi một đằng, bạn xuanha trả lời một nẻo, hỏi sau khi lệnh gọi 1 chạy xog ta có a,b,c bằng mấy?. Tức là hỏi giá trị a, b ,c khi thực hiện hàm xong. Chứ có hỏi giá trị m, n, p trong hàm đâu. Nếu là hỏi giá trị trong hàm vidu thì ok, bạn xuanha trả lời đúng. Còn hỏi giá trị a, b, c sau khi gọi hàm, thì xin thưa bạn lieutraichidi là chương trình vb6 làm đúng rùi đấy.
Giải thích như sau:
Byval là truyền tham số bằng giá trị
Byref là truyền tham số bằng địa chỉ
Nếu không khai báo thì vb6 mặc định là truyền địa chỉ. Vậy chương trình sẽ chạy là:
trước khi gọi hàm vidu
a = 1
b = 2
c = 3
sau khi gọi hàm vidu.

call vidu(a,b,c) truyền vào tham số (m As Integer, ByVal n As Integer, ByRef p As Integer)
m=1, n=2, p=3
m= n+p = 2+3=5
n=p+m = 3+5 = 8
p=m+n = 5+8=13
Print a, b, c -->a=m=5, b không đổi giá trị vẫn là 2, c=p=13. 2 Biến a, c bị thay đổi giá trị khi thoát khỏi hàm
Sửa lần cuối bởi mttabo vào ngày CN 18/01/2015 4:53 pm với 1 lần sửa.

mttabo
Bài viết: 3
Ngày tham gia: T.Bảy 26/02/2011 10:10 pm

Re: cơ chế truyền tham số

Gửi bàigửi bởi mttabo » CN 18/01/2015 4:52 pm



Quay về “Cấu trúc dữ liệu và giải thuật”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách