|
Вопрос # 4 350/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Подскажите пожалуста почему в описанной мною функции остаётся неиспользованной переменная "b" ?
Фрагмент программы :
function proizved(a:array of vect;b:integer):integer;
var i,j,k:integer;
begin
k:=1;
b:=0;
for i:=0 to high(a) do
for j:=0 to high(a[i]) do
begin
if a[i,j]<0 then
begin break;k:=0; end
else
k:=k*a[i,j];
b:=k;
end;
end;
 |
Вопрос задал: Point (статус: Посетитель)
Вопрос отправлен: 20 июня 2010, 20:42
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Тебе не мешает подучить матчасть, особенно про передачу параметров в функции.
Небольшой ликбез:
procedure p1(b: Integer);
Здесь компилятор делает такой код, при котором в параметр b копируется передаваемое значение. В теле функции переменную b можно менять как угодно, под неё в стеке выделяется новый кусок памяти, однако исходная переменная (если передавалась переменная) не изменится.
Другое дело, когда
procedure p1(var b: Integer);
В этом случае в функцию передаётся фактический начальный адрес ячейки памяти, в которой содержится значение передаваемой переменной; все изменения в теле функции будут связаны именно с переменной, переданной в качестве параметра.
Ну и частный случай:
procedure p1(const b: Integer);
Здесь, как и в случае с var-параметром, в функцию передаётся адрес переменной, однако компилятор не позволит присваивать внутри функции какие-либо значения этой переменной.
Вот такие дела... Ты присваиваешь переменной b значение, которое никуда потом не попадает, память из-под неё освобождается при выходе из тела функции (теоретически), а на самом деле компилятор просто выкинет этот код и всё. Я понятно объясняю?
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 20 июня 2010, 20:59
Оценка за ответ: 5
Комментарий к оценке: да,спасибо большое !
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 20 июня 2010, 21:56; участников в обсуждении: 4.
|
Егор (статус: 10-ый класс), 20 июня 2010, 20:48 [#1]:
потому что она не используется. нигде не используется значение, записанное в эту переменную. если убрать эту переменную и все строки кода с упоминанием b, то суть программы не изменится
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
bugmenot (статус: 3-ий класс), 20 июня 2010, 21:42 [#2]:
>begin break;k:=0; end
^^^^^ ^^^^
и здесь
приучаемся форматировать код для того чтобы такие вещи бросались в глаза
проклятье, опять пробелы режутся >:-E
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
min@y™ (статус: Доктор наук), 20 июня 2010, 21:47 [#3]:
Цитата (Point):
да,спасибо большое !
Помогло?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Point (статус: Посетитель), 20 июня 2010, 21:56 [#4]:
да,теперь нормально работаетю
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|