Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

bugmenot (статус: 3-ий класс), 20 июня 2010, 21:42 [#2]:

>begin break;k:=0; end
^^^^^ ^^^^
и здесь
приучаемся форматировать код для того чтобы такие вещи бросались в глаза

проклятье, опять пробелы режутся >:-E
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 20 июня 2010, 21:47 [#3]:

Цитата (Point):

да,спасибо большое !

Помогло?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Point

Point (статус: Посетитель), 20 июня 2010, 21:56 [#4]:

да,теперь нормально работаетю

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.03 сек.