
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.5] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Я знаю 2 способа передачи параметров в функцию: по значению и по адресу. В DELPHI существует ещё один способ, а всего их 6. Не подскажите какой?
PS: И ещё, можно ли изменить шаг в цикле? Например в BASIC это выглядит так: For i = 1 to 10 STEP 2 А в паскале я подобной конструкции не встречал... |
![]() |
|
|
Я тоже знаю только 2 способа передачи параметров-переменных: по ссылке и по значению. Было бы интересно узнать про другие 4.
![]() А что касается цикла, то попробуй так: ![]() ![]() step := 2; for i := 1 to 10 do if i mod step = 0 then begin (*...*) end; Или так: ![]() ![]() while i <= 10 do begin (*...*) i := i + 2; end; |
Сообщ.
#3
,
|
|
|
А такие способы передачи параметров считаются отдельно, или все-таки как передача по ссылке?
![]() ![]() procedure A(const x); begin end; procedure B(out x); begin end; А если это метод какого-либо объекта, то что есть тогда self? |
![]() |
|
|
Цитата Kotor @ 27.05.04, 21:47 В DELPHI существует ещё один способ, а всего их 6. Kotor, а где ты читал (кто тебе сказал), что способов 6? Мне интересно, я просто никогда такое не слышал. ![]() И какой же ещё способ существует в Delphi? |
Сообщ.
#5
,
|
|
|
6 способов, это что-то новенькое в программировании.
До сего дня, было лишь 2 - передача значения, и передача ссылки. Все остальное (const, in, и out), обозначает лишь допустимые способы использования переданного параметра в функции (процедуре). Цитата albom, 27.05.04, 22:18 А если это метод какого-либо объекта, то что есть тогда self? self - это собственно экземпляр объекта для которого был вызван метод. Например есть следующие определения: ![]() ![]() type tX = class Text :String; function GetText :String; end; function tX.GetText :String; begin Result := Self.Text; // В данном случае можно было просто написать: "Result := Text;" end; Тогда например: ![]() ![]() var x1, x2 :tX; begin x1 := tX.Create; x1.Text := 'Вася'; x2 := tX.Create; x2.Text := 'Петя'; WriteLn(x1.GetText); // выведет строку 'Вася' WriteLn(x2.GetText); // выведет строку 'Петя' end. Или, более сложный ![]() ![]() ![]() function Hello (X :tX) :String; begin Result := 'Привет ' + X.GetText; end; var x1, x2 :tX; begin x1 := tX.Create; x1.Text := 'Вася'; x2 := tX.Create; x2.Text := 'Петя'; WriteLn(Hello(x1)); // выведет строку 'Привет Вася' WriteLn(Hello(x2)); // выведет строку 'Привет Петя' end. |
Сообщ.
#6
,
|
|
|
Про 6 способов спросил препод. Я ответил известные 2, остальные он обещал спросить на экзамене... Теперь мучаюсь
![]() |
Сообщ.
#7
,
|
|
|
Только не забудь написать потом, угу?
![]() ![]() |
Сообщ.
#8
,
|
|
|
Цитата Kotor @ 28.05.04, 10:09 Про 6 способов спросил препод. Я ответил известные 2, остальные он обещал спросить на экзамене... Теперь мучаюсь ![]() Ты не сможешь ответить на экзамене поскольку способов всего два, а спрашивал он тебя не про способы, а об соглашения о вызовах, этих действительно 6, но используют они все равно два способа. Если интересуют соглашения, то тема в справке Calling conventions |
Сообщ.
#9
,
|
|
|
Оказалось, это всего навсего передача параметров как переменных(по ссылке) и как констант. Тогда надо сюда относить ещё и передачу параметров как выходных велечин. В сумме получим 4, а он говорил про 3... Совсем запутался! В справочнике Архангельского это даётся как разные способы.
|
Сообщ.
#10
,
|
|
|
1) по значению - при вызове подпрограммы выделяется память для формального параметра. Вычисляется значение фактического параметра и результат записывается в указанную память. Далее подпрограмма уже работает с этой копией (используется для входных параметров; т.к. мы работаем с копией, то сам фактический параметр изменить уже нельзя, что гарантирует защиту от побочного эффекта). По окончании работы подпрограммы память освобождается.
2) для результата - память для переменной выделяется, но туда ничего не записывается, по окнончанию работы подпрограммы происходит запись из нее в фактический параметр (используется для передачи выходных параметров, т.е. результата). 3) значение-результат - используются оба механизма (может использоваться для входных, входно-выходных и выходных параметров, но может возникнуть побочный эффект). 4) по ссылке (адресу) - память не выделяется, подпрограмма работает с памятью выделенной фактическому параметру (может быть использовано для входных, входно-выходных и выходных параметров) 5) Текст, макроподстановка – везде, где встречается обработка формального параметра происходит автоматическая замена формального параметра на текст фактического. При этом в зависимости от текста фактического параметра не всегда может произойти корректная работа компилятора. Пример: пусть xзаменяется на a+b, тогда выражение вида x:=x+1 заменяется на выражение a+b:=a+b+1, а это ошибка, т.к. не понятно значение какой переменной необходимо менять. 6) ![]() ![]() ![]() |
![]() |
|
|
Цитата Kotor @ 30.05.04, 13:37 В сумме получим 4, а он говорил про 3... Совсем запутался! А в начале ты сказал, что их 6... Я тебя понимаю - тут запутаться недолго. ![]() Кстати, просвяти меня, чем передача параметров по ссылке отличается от передачи параметров, как выходных величин? Я думаю, что это - одно и то же. Так наверно и получается, что способов три. Путанный какой-то вопрос... ![]() |
Сообщ.
#12
,
|
|
|
6 вообще, а в Delphi только 3 - имелось ввиду это. Передача параметра как выходного похожа на передачу по ссылке. Отличие в том, что при этом не гарантируется передача в прцедуру начального значения этого параметра. Параметр, переданный как выходной, указывает на некоторое место в памяти, куда процедура выводит значение. №2 в списке у Outlander.
|
Сообщ.
#13
,
|
|
|
Цитата Outlander, 30.05.04, 14:31 2) для результата - память для переменной выделяется, но туда ничего не записывается, по окнончанию работы подпрограммы происходит запись из нее в фактический параметр (используется для передачи выходных параметров, т.е. результата). Еслия правильно понял, имеется ввиду возврат результата функцией. Если так, то это не совсем параметр, точнее совсем не параметр ![]() Цитата 3) значение-результат - используются оба механизма (может использоваться для входных, входно-выходных и выходных параметров, но может возникнуть побочный эффект). Не понял, если можно пример на Delphi. Цитата 5) Текст, макроподстановка – везде, где встречается обработка формального параметра происходит автоматическая замена формального параметра на текст фактического. При этом в зависимости от текста фактического параметра не всегда может произойти корректная работа компилятора. Пример: пусть xзаменяется на a+b, тогда выражение вида x:=x+1 заменяется на выражение a+b:=a+b+1, а это ошибка, т.к. не понятно значение какой переменной необходимо менять. Хм. А что, в Delphi есть макропадстановки? А где вообще (в каком языке) существует такой способ передачи параметров? P.S. Прошу не считать наездом, просто интересно. |
![]() |
|
|
Согласен, действительно интересно - первый раз такое слышу (читаю).
![]() |
Сообщ.
#15
,
|
|
|
В принципе, есть три способа передачи параметра:
1) по значению; 2) по указателю; 3) по ссылке При этом 2 и 3 можно считать одним и тем же, записываемым разным способом. Цитата Человек видимо спутал с препроцессором C/C++ или макроассемблера. Петрович, 30.05.04, 20:19 Хм. А что, в Delphi есть макропадстановки? А где вообще (в каком языке) существует такой способ передачи параметров? ![]() |