| 
| 
 | Вопрос # 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]:да,теперь нормально работаетю |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |