<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS: Byref и ByVAl (переопределение)]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11697&amp;type=atom" />
	<updated>2016-06-09T16:45:41Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=11697</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Byref и ByVAl (переопределение)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105040#p105040" />
			<content type="html"><![CDATA[<p>Разница этих механизмов в следующем. Передача по значению — это копирование числа 123 из переменной MyArg1 в переменную MyParam1. Передача по ссылке — это копирование адреса переменной MyArg2 в переменную MyParam2. Имея адрес внешней переменной, вы можете как считывать оттуда её значение, так и менять это значение в ней. В VBScript в эти подробности вникать не надо, просто можно считать, что MyParam2 — это то же самое (та же переменная), что и MyArg2, только под другим именем. А вот MyArg1 и MyParam1 — это две разных переменных, просто значение одной копируется в другую при вызове функции. Поэтому, меняя MyParam1 внутри функции, вы никак не влияете на MyArg1.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2016-06-09T16:45:41Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105040#p105040</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Byref и ByVAl (переопределение)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105039#p105039" />
			<content type="html"><![CDATA[<p>Получается тогда так:</p><div class="codebox"><pre><code>Result = TestFunction[b] ((MyArg1), MyArg2)[/b]</code></pre></div><p>Вызываемая функция получает значения переменных</p><p><strong>MyArg1 </strong>= 123<br /><strong>MyArg2 </strong>= 124</p><p>в свой список аргументов <strong>(MyParam1, MyParam2)</strong>,<br />в теле функции аргументы </p><p>MyParam1, MyParam2 получают значения </p><p>MyParam1 = 123<br />MyParam2 = 124<br />, и эти значения передаются в выражение</p><div class="codebox"><pre><code> TestFunction = MyParam1 * MyParam2</code></pre></div><p>где, происходит их вычисление, и затем результат возвращается<br />значением&nbsp; <strong>123*124 = 15252</strong></p><p>Так ?</p><p> Ну тогда как понять этот пример в контексте справки на сайте <strong>microsoft</strong>, в которой описывается механизм передачи параметров <strong>ByVal&nbsp; </strong>и <strong>ByRef</strong>, это еще больше сбивает с толку, так же как и описание механизма переопределения передачи аргументов.</p><p> тогда как должен выглядить скрипт, наглядно показывающий эти механизмы ?</p>]]></content>
			<author>
				<name><![CDATA[sat-tim]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33965</uri>
			</author>
			<updated>2016-06-09T16:32:15Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105039#p105039</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Byref и ByVAl (переопределение)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105019#p105019" />
			<content type="html"><![CDATA[<p>Нет, это старые, которые существуют до вызова функции. А 5 и 6 присваиваются во время её вызова, но уже после вычисления её возвращаемого значения.</p><p>То, что определение функции располагается в начале скрипта, не значит, что её код там же и выполняется. Он выполняется при её вызове.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2016-06-09T11:12:18Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105019#p105019</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Byref и ByVAl (переопределение)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105016#p105016" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>значения параметров изменяются внутри функции уже после того, как вычислен результат. А он вычисляется ещё со старыми их значениями</p></blockquote></div><p>Что вы понимаете под старыми значениями ?</p><p>Ведь </p><p>MyArg1 = 123<br />MyArg2 = 124</p><p>Это новые значения и результат вычисляется с ними</p>]]></content>
			<author>
				<name><![CDATA[sat-tim]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33965</uri>
			</author>
			<updated>2016-06-09T10:26:30Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105016#p105016</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Byref и ByVAl (переопределение)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105013#p105013" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>sat-tim пишет:</cite><blockquote><p>Так как ответ не 123*6 = 615, а<br />123*124 = 15252<br />Почему ?<br />почему код не отрабатывается так как надо.</p></blockquote></div><p>Ну, видимо, потому, что значения параметров изменяются внутри функции уже после того, как вычислен результат. А он вычисляется ещё со старыми их значениями.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2016-06-09T08:39:11Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105013#p105013</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBS: Byref и ByVAl (переопределение)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105012#p105012" />
			<content type="html"><![CDATA[<p>Изучаю передачу аргумента по значению и по ссылке и пытаюсь разобраться.<br />Но вот <a href="https://msdn.microsoft.com/ru-ru/library/ee478101.aspx">https://msdn.microsoft.com/ru-ru/library/ee478101.aspx</a> написан код, который выдает совсем другой результат и не работает, так как написано в справке, поясните пожалуйста почему?</p><div class="codebox"><pre><code>Function TestFunction(MyParam1, MyParam2) 
    &#039; Both parameters are ByRef, because neither ByRef nor ByVal
    &#039; is specified for either parameter.
    TestFunction = MyParam1 * MyParam2
    MyParam1 = 5
    MyParam2 = 6
End Function
Dim MyArg1, MyArg2, Result
MyArg1 = 123
MyArg2 = 124
 
Result = TestFunction ((MyArg1), MyArg2)
&#039; MyArg1 is still 123.
&#039; MyArg2 is changed in TestFunction to 6.
</code></pre></div><p>Так как ответ не 123*6 = 615, а<br />123*124 = 15252</p><p>Почему ?</p><p>почему код не отрабатывается так как надо.</p><br /><div class="codebox"><pre><code>...TestFunction ((MyArg1),...</code></pre></div><p>Вызов функции в таком виде, передает параметр <strong>MyArg1 </strong>в тело функции в список аргументов функции - по значению (<strong>ByVal</strong>) MyArg1 = <strong>123</strong>, <br /> так как круглые скобки переопределили, что параметр передается не по ссылке, а по значению...</p><p>Поэтому и непонятно почему не отрабатывается функция, так как я только изучаю VBScript...</p><br /><p>Если записать вот так</p><br /><div class="codebox"><pre><code>Result = TestFunction(MyArg1,MyArg2)</code></pre></div><p>или так</p><div class="codebox"><pre><code>Result = TestFunction((MyArg1),(MyArg2))</code></pre></div><p>Ответ все равно 123*124</p><br /><p>Если параметр определяется как <strong>ByRef</strong>, аргумент может быть передан по значению, если он находиться в круглых скобках.</p><p>Это показано в следующем примере.</p><div class="codebox"><pre><code>
Sub TestSub(ByRef MyParam) 
    MyParam = 5
result = MyArg
MsgBox &quot;result - &quot; &amp; result
End Sub
 
Dim MyArg
MyArg = 123
TestSub (MyArg)
&#039; MyArg is still 123.
</code></pre></div><p>Параметр <strong>ByRef </strong>передается по значению, если аргумент находиться в закрытых скобках и данные скобки не применяются к списку аргументов.<br />&nbsp; <br /> Данные закрытые скобки применяются к списку аргументов, если одно из следующих условий верно:</p><p>• Данный оператор – это вызов функции (обращение к функции), которая назначена к возвращаемому значению.</p><div class="codebox"><pre><code>Result = TestFunction (MyArg)</code></pre></div><p>• Данный оператор использует ключевое слово <strong>Call</strong>. (Ключевое слово Call может необязательно быть использовано для вызова подпрограммы или для вызова функции без назначения.)</p><div class="codebox"><pre><code>Call TestFunction (MyArg)</code></pre></div>]]></content>
			<author>
				<name><![CDATA[sat-tim]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33965</uri>
			</author>
			<updated>2016-06-09T08:09:07Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105012#p105012</id>
		</entry>
</feed>
