![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 20.11.2014
Сообщений: 7
|
![]()
Уважаемые друзья!
Помогите, пожалуйста, разобраться. ))) Я в самом начале, но уже возникли сложности. Высылаю Вам две небольшие программы, созданные в среде Free Pascal. Обе работают и выдают одинаковый результат. Разница в том, что мне понятен второй вариант, а первый – нет. Собственно, в этом и весь вопрос. Первый вариант. Код:
Второй вариант. Код:
основной переменной значение переменной x, объявленной в процедуре. Это понятно. В первом варианте, в процедуре объявляется переменная x. var x : integer; - В этой строке. Но в теле программы нигде нет обращения к этой переменной. А также нет присваивания переменной SumNum значения переменной x. Тем не менее, программа выдаёт правильный результат. Так как же взаимодействуют эти две переменные в первом варианте? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 02.03.2008
Сообщений: 2,504
|
![]()
А я наоборот, первый вариант сразу понял, а второй - не сразу. Второй сделан как-то странно.
В первом варианте в процедуре summa переменная x - формальный параметр. При вызове summa вместо формального параметра x подставляется фактический SumNum . То есть программа работает, как если бы внутри вместо x была бы SumNum Почитайте про формальные и фактические параметры (аргументы). PS В случае a,b - тут просто совпадают имена формальных и фактических параметров. Совпадение допускается и ни к чему не обязывает. Последний раз редактировалось type_Oleg; 20.11.2014 в 22:26. |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,367
|
![]()
По очереди приведенных примеров:
1. Procedure summa (var x : integer; a, b : integer); В данном описании x, a, b - параметры процедуры. Вместо них могут фигурировать и другие имена переменных. Передача параметров выполняется через стек, который представляет собой память, адресация к которой выполняется через специальный регистр. Запись var x : integer; означает, что в стек будет записан адрес, по которому будет размещаться переменная, подставленная вместо "x" в вызове процедуры. Так, в первом примере вызов представлен так: Код:
Параметры a и b передаются по значению. Т.е. в стек передаются только значения, которые хранятся в переменных a и b. Если заглянуть в область памяти, где хранятся параметры, то можно было бы увидеть примерно следующее (естественно это условно так): Код:
Т.о. из процедуры видна область памяти в которой хранится переменная SumNum. 2. В этом примере переменная SumNum описана в самом начале программы, до описания процедуры. Она видна в процедуре. Попробуйте описать ее пониже, перед началом программы. ![]() Этот пример работает так: При вызове процедуры Код:
Затем результат из этой области передается в область памяти SumNum. Код:
Как другой вариант для пробы. Опиши переменную SumNum внутри процедуры, оставив ее описание в голове программы. Код:
Как-то так, ... PS: Второй пример плох. Это только некоторая случайность, которая позволила получить верный результат.
Как-то так, ...
|
![]() |
![]() |
![]() |
#4 |
Цифровой кот
Старожил
Регистрация: 29.08.2014
Сообщений: 7,629
|
![]()
Правильно когда-то наш старый пердун препод говорил: увижу глобальную переменную там, где без неё можно обойтись – получите подсрачник и на пересдачу!
Как же дед был прав! По делу: убери все глобальные переменные и всё сразу станет понятно. Совет: именуй формальные параметры так, чтобы было понятно, что это формальные параметры. Я использую букву «А». Например: Код:
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
|
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
кстати, в Паскале в подобном коде использование глобальных переменных ОЧЕНЬ просто выявляется. Нужно блок VAR перенести ПОСЛЕ всех функций и процедур: Код:
Вот от неё и надо избавляться! |
|
![]() |
![]() |
![]() |
#6 | |
Цифровой кот
Старожил
Регистрация: 29.08.2014
Сообщений: 7,629
|
![]() Цитата:
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
|
|
![]() |
![]() |
![]() |
#7 |
Регистрация: 20.11.2014
Сообщений: 7
|
![]()
Дорогие друзья! Спасибо Вам за помощь! Вы прислали мне очень много интересной и полезной информации! Обязательно разберусь! Самой, конечно, трудно организовать процесс самообучения, к тому же я вижу, что мои знания очень и очень невелики. Я хотела узнать ещё насчёт возможности дополнительного обучения. Но я не знаю, вправе ли я спрашивать это здесь? Если нет, то прошу меня извинить. Может быть, эту тему можно создать в другом разделе? Прошу меня простить, если я что-то нарушила. В любом случае я очень благодарна всем Вам за то, что прислали мне столько откликов! Спасибо!!!
|
![]() |
![]() |
![]() |
#8 | |
Цифровой кот
Старожил
Регистрация: 29.08.2014
Сообщений: 7,629
|
![]() Цитата:
Совет: скачай годную хорошую книжку и прочитай для начала первые 5-6 глав. Будет хорошо. Если появится желание читать дальше, то есть вероятность стать начинающим программистомЪ... Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
|
|
![]() |
![]() |
![]() |
#9 | |
Регистрация: 20.11.2014
Сообщений: 7
|
![]() Цитата:
Мы не в равных условиях. Я же просто хотела узнать – есть ли возможность обучиться факультативом или как-нибудь ещё. |
|
![]() |
![]() |
![]() |
#10 | |||
Цифровой кот
Старожил
Регистрация: 29.08.2014
Сообщений: 7,629
|
![]() Цитата:
Цитата:
Цитата:
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
|
|||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вопрос по поводу getch() | Тёма_) | Общие вопросы C/C++ | 4 | 27.02.2013 19:07 |
Вопрос по поводу граббинга. | egorzenit | Общие вопросы Delphi | 1 | 13.04.2012 02:11 |
Вопрос по поводу StringList(а) | KAMENYKA | Компоненты Delphi | 4 | 07.12.2007 13:01 |
Вопрос по поводу типов | werser | Помощь студентам | 4 | 23.06.2007 14:18 |