Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2009, 18:31   #1
Asira
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 84
По умолчанию Параметры переменной и значения

Объясните пожалуйста доступными(!) словами чем отличаются параметры значения от параметров переменной ну например в таком случае
Код:
procedure Ci(a:integer; var k:integer);
begin
k:=0;
while a>0 do
begin k:=k+1; a:=a div 10; end;
end;
и
Код:
procedure Ci(a,k:integer; );
begin
k:=0;
while a>0 do
begin k:=k+1; a:=a div 10; end;
end;
Только не надо заумных слов.!!!!!!!!!!!!!!!!!!!!!!!!
процедура считает количество цифр в числе
Asira вне форума Ответить с цитированием
Старый 23.12.2009, 18:43   #2
Dzmitry Loktseu
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 18
По умолчанию

Цитата:
procedure Ci(a:integer; var k:integer);
внутри процедуры работа ведется конкретно с переменной k и ее содержимым

Цитата:
procedure Ci(a,k:integer; );
внутри процедуры работа ведется с копией переменной k и ее содержимым
Dzmitry Loktseu вне форума Ответить с цитированием
Старый 23.12.2009, 18:45   #3
Asira
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 84
По умолчанию

А ОРИГИНАЛ k где в теле самой программы???????????????
Asira вне форума Ответить с цитированием
Старый 23.12.2009, 18:51   #4
Dzmitry Loktseu
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Asira Посмотреть сообщение
А ОРИГИНАЛ k где в теле самой программы???????????????
Смотри справку. Там даже пример приведен.

Most parameters are either value parameters (the default) or variable (var) parameters. Value parameters are passed by value, while variable parameters are passed by reference. To see what this means, consider the following functions.

function DoubleByValue(X: Integer): Integer; // X is a value parameter
begin
X := X * 2;
Result := X;
end;
function DoubleByRef(var X: Integer): Integer; // X is a variable parameter
begin
X := X * 2;
Result := X;
end;

These functions return the same result, but only the second one--DoubleByRef--can change the value of a variable passed to it. Suppose we call the functions like this:

var
I, J, V, W: Integer;
begin
I := 4;
V := 4;
J := DoubleByValue(I); // J = 8, I = 4
W := DoubleByRef(V); // W = 8, V = 8
end;

After this code executes, the variable I, which was passed to DoubleByValue, has the same value we initially assigned to it. But the variable V, which was passed to DoubleByRef, has a different value.

A value parameter acts like a local variable that gets initialized to the value passed in the procedure or function call. If you pass a variable as a value parameter, the procedure or function creates a copy of it; changes made to the copy have no effect on the original variable and are lost when program execution returns to the caller.

A variable parameter, on the other hand, acts like a pointer rather than a copy. Changes made to the parameter within the body of a function or procedure persist after program execution returns to the caller and the parameter name itself has gone out of scope.

Even if the same variable is passed in two or more var parameters, no copies are made. This is illustrated in the following example.

procedure AddOne(var X, Y: Integer);
begin
X := X + 1;
Y := Y + 1;
end;
var I: Integer;
begin
I := 1;
AddOne(I, I);
end;

After this code executes, the value of I is 3.

If a routine's declaration specifies a var parameter, you must pass an assignable expression--that is, a variable, typed constant (in the {$J+} state), dereferenced pointer, field, or indexed variable--to the routine when you call it. To use our previous examples, DoubleByRef(7) produces an error, although DoubleByValue(7) is legal.

Indexes and pointer dereferences passed in var parameters--for example, DoubleByRef(MyArray[I])--are evaluated once, before execution of the routine.

Последний раз редактировалось Dzmitry Loktseu; 23.12.2009 в 18:55.
Dzmitry Loktseu вне форума Ответить с цитированием
Старый 23.12.2009, 18:52   #5
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

Я бы ответил, но не понял вопроса (пост 3). Может вопрос был: "как обратиться к "оригиналу" переменной, если имеется копия"?
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс

Последний раз редактировалось Олвин; 23.12.2009 в 18:54.
Олвин вне форума Ответить с цитированием
Старый 23.12.2009, 18:57   #6
Asira
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 84
По умолчанию

Dzmitry Loktseu Я ЖЕ НАПИСАЛА ПОНЯТНЫМ ЯЗЫКОМ!!!!!!!!!!!!!!!!!! Английский для меня не понятен!!!!!!!!!!!!!!!!тем более в таких объёмах
Asira вне форума Ответить с цитированием
Старый 23.12.2009, 18:59   #7
Asira
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 84
По умолчанию

Олвин вы правильно поняли вопрос!!!!!!!
Asira вне форума Ответить с цитированием
Старый 23.12.2009, 19:03   #8
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

Если имена "копии" и "оригинала" совпадают - из процедуры можно обратиться только к копии. А к оригиналу - только из программы.

Если нужно обращаться к оригиналу из процедуры (только это является плохим стилем программирования) - у переменных не должны совпадать имена.
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс
Олвин вне форума Ответить с цитированием
Старый 23.12.2009, 19:09   #9
Asira
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 84
По умолчанию

Вообщем мне надо понять ....
какая разница будет в вычислениях( ну точнее на выходе из программы)
например в такой программе
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
procedure Ci(a:integer; var k:integer);
begin
k:=0;
while a>0 do
begin k:=k+1; a:=a div 10; end;
end;
var a,s1:integer;
begin
writeln('Vvedite chisla :a');
readln(a);
Ci(a,s1);
readln;
end.
и в той же самой но без var
программу запускала результаты разные но как это объяснить?...
Asira вне форума Ответить с цитированием
Старый 23.12.2009, 19:29   #10
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Есть две функции DoubleByValue и DoubleByRef
Код:
function DoubleByValue(X: Integer): Integer; // X параметр значения
begin
X := X * 2;
Result := X;
end;
function DoubleByRef(var X: Integer): Integer; // X параметр переменной
begin
X := X * 2; // т.к. Х это V -> X = V = 8
Result := X;
end;

var
I, J, V, W: Integer;
begin
I := 4;
V := 4;
J := DoubleByValue(I); // J = 8(4*2 = 8), I = 4,
W := DoubleByRef(V); // W = 8, V = 8 (см. DoubleByRef)
end;
Понятно?
psycho-coder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить значения переменной внутри процедуры kartalex Помощь студентам 5 20.11.2010 18:44
чем пераметр переменной отличается от параметров значения 7karandashik7 Помощь студентам 3 12.04.2010 10:38
Ввод значения переменной в C# с клавиатуры nec117 Общие вопросы C/C++ 2 24.09.2009 04:14
Имя переменной как переменная. Как получить доступ к такой переменной? Denni Microsoft Office Access 8 02.04.2009 10:06
Работа с файлами (создание, удаление, открытие, связываение с переменной, очищение памяти переменной) Arkuz Общие вопросы Delphi 12 25.09.2007 20:47