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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2011, 04:58   #1
felix800
Новичок
Джуниор
 
Регистрация: 30.07.2011
Сообщений: 2
По умолчанию Процедура для ввода массива. Необъяснимо но факт!

При написании процедуры для ввода одномерного массива столкнулся с такой проблемой: программа компилируется, но выдает не тот результат, который ожидался.

Код:
const
   count_massive=3;
type
   mass_masive=array[1..count_massive] of real;

var
   m: mass_masive;
   kol_el, i: integer;


procedure entmas (var kol_elem: integer;  m: mass_masive);
   var
      i: integer;
   begin
      write ('Введите количество элементов массива: ');
      readln(kol_elem);
      writeln ('Ввод массива');
      for i:=1 to kol_elem do
         begin
            write ('Элемент №',i,' -> ');
            readln (m[i]);
         end;
   end;
   
begin
   entmas(kol_el,m);
   writeln ('Введенный массив');
   for i:=1 to kol_el do
      write (m[i],' ');
end.
Результат работы программы:
------------------------------------------
Введите количество элементов массива: 3
Ввод массива
Элемент №1 -> 1
Элемент №2 -> 2
Элемент №3 -> 3
Введенный массив
0 0 0
------------------------------------------
В общем выводит пустой массив, и все тут...



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 30.07.2011 в 14:59.
felix800 вне форума Ответить с цитированием
Старый 30.07.2011, 07:03   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Массив в процедуру в этом случае надо передавать по ссылке:
Код:
procedure entmas (var kol_elem: integer; var m: mass_masive);
Прик вне форума Ответить с цитированием
Старый 30.07.2011, 08:01   #3
felix800
Новичок
Джуниор
 
Регистрация: 30.07.2011
Сообщений: 2
По умолчанию

Прик-у РЕСПЕКТ!
Однако хотелось бы узнать, в чем фишка токого подхода к передачи массива в процедуру. Зачем повторно указывать раздел VAR, может и для каждого типа необходмо прописывать отдельное VAR (например procedure prim (var a: integer; var b: real; var c: byte и т.д.)???
felix800 вне форума Ответить с цитированием
Старый 30.07.2011, 08:43   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

var в нашем случае указание компилятору, что массив передается в виде указателя на него. Без этого служебного слова массив передается целиком - все его значения (собственно, копия массива). При этом изменения в массиве происходят только в локальной его копии и при выходе из процедуры эти значения естественным образом теряются. Нам же надо чтобы изменения были в том массиве, который объявлен "глобально", в модуле. Это можно сделать только если передать ссылку на эту переменную массива, как раз используя слово var.

VAR в параметрах указывается только тогда, когда нужно получить измененное значение этого параметра в вызывающей процедуре. Как, например, значение переменной kol_elem.
Если использование измененного значения параметра в вызывающем процедуру коде не предполагается, то и передавать параметр по ссылке нет никакой необходимости.
Прик вне форума Ответить с цитированием
Старый 30.07.2011, 12:35   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
...чтобы изменения были в том массиве, который объявлен "глобально", в модуле. Это можно сделать только если передать ссылку на эту переменную массива, как раз используя слово var...
Немного добавлю. Если массив в области видимости процедуры (как в данном случае), то можно вообще обойтись без передачи параметра.

2felix800, кстати, при использовании глобальных переменных надо внимательно следить за их областью видимости, иначе можно незаметно ошибиться.
eoln вне форума Ответить с цитированием
Старый 30.07.2011, 15:00   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

eoln, не надо учить плохому... Учите хорошему - плохому они сами научаться.

Это я про использование глобальных переменных.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедура для сортировки массива по возрастанию (прокоментируйте код программы на Delphi) Natashka Milashka Помощь студентам 1 20.05.2011 16:20
макрос для ввода значений массива в ячейки Olya1985 Microsoft Office Excel 7 23.01.2011 19:43
Процедура ввода матрицы из файла не работает...( rudal86 Помощь студентам 3 20.05.2010 12:24
ФАКТ+ФАКТ=НАУКА Hamond Общие вопросы Delphi 5 29.04.2010 21:58
Необъяснимо, но факт!!! Tayfun Свободное общение 7 16.12.2007 10:49