На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Способы передачи параметров. , ЛИКБЕЗ...
    Я знаю 2 способа передачи параметров в функцию: по значению и по адресу. В DELPHI существует ещё один способ, а всего их 6. Не подскажите какой?

    PS: И ещё, можно ли изменить шаг в цикле? Например в BASIC это выглядит так:
    For i = 1 to 10 STEP 2
    А в паскале я подобной конструкции не встречал...
      Я тоже знаю только 2 способа передачи параметров-переменных: по ссылке и по значению. Было бы интересно узнать про другие 4. :)

      А что касается цикла, то попробуй так:
      ExpandedWrap disabled
         
        step := 2;
        for i := 1 to 10 do if i mod step = 0 then begin
          (*...*)
        end;  

      Или так:
      ExpandedWrap disabled
         
          while i <= 10 do begin
            (*...*)
            i := i + 2;
          end;
      Сообщение отредактировано: Sky Shade -
        А такие способы передачи параметров считаются отдельно, или все-таки как передача по ссылке?
        ExpandedWrap disabled
          procedure A(const x);
           begin end;
          procedure B(out x);
           begin end;

        А если это метод какого-либо объекта, то что есть тогда self?
          Цитата Kotor @ 27.05.04, 21:47
          В DELPHI существует ещё один способ, а всего их 6.

          Kotor, а где ты читал (кто тебе сказал), что способов 6?
          Мне интересно, я просто никогда такое не слышал. :huh:
          И какой же ещё способ существует в Delphi?
          Сообщение отредактировано: Sky Shade -
            6 способов, это что-то новенькое в программировании.
            До сего дня, было лишь 2 - передача значения, и передача ссылки.
            Все остальное (const, in, и out), обозначает лишь допустимые способы использования переданного параметра в функции (процедуре).

            Цитата
            albom, 27.05.04, 22:18
            А если это метод какого-либо объекта, то что есть тогда self?


            self - это собственно экземпляр объекта для которого был вызван метод.

            Например есть следующие определения:

            ExpandedWrap disabled
              type
                tX = class
                  Text :String;
                  function GetText :String;
                end;
               
              function tX.GetText :String;
              begin
                Result := Self.Text; // В данном случае можно было просто написать: "Result := Text;"
              end;


            Тогда например:
            ExpandedWrap disabled
               
              var
                x1, x2 :tX;
              begin
                x1 := tX.Create;  x1.Text := 'Вася';
                x2 := tX.Create;  x2.Text := 'Петя';
               
                WriteLn(x1.GetText); // выведет строку 'Вася'
                WriteLn(x2.GetText); // выведет строку 'Петя'
              end.


            Или, более сложный :) случай:
            ExpandedWrap disabled
               
              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 способов спросил препод. Я ответил известные 2, остальные он обещал спросить на экзамене... Теперь мучаюсь :) Сегодня попробую разузнать у него, что имелось ввиду.
                Только не забудь написать потом, угу? :rolleyes: :yes:
                  Цитата Kotor @ 28.05.04, 10:09
                  Про 6 способов спросил препод. Я ответил известные 2, остальные он обещал спросить на экзамене... Теперь мучаюсь :) Сегодня попробую разузнать у него, что имелось ввиду.

                  Ты не сможешь ответить на экзамене поскольку способов всего два, а спрашивал он тебя не про способы, а об соглашения о вызовах, этих действительно 6, но используют они все равно два способа.
                  Если интересуют соглашения, то тема в справке Calling conventions
                    Оказалось, это всего навсего передача параметров как переменных(по ссылке) и как констант. Тогда надо сюда относить ещё и передачу параметров как выходных велечин. В сумме получим 4, а он говорил про 3... Совсем запутался! В справочнике Архангельского это даётся как разные способы.
                      1) по значению - при вызове подпрограммы выделяется память для формального параметра. Вычисляется значение фактического параметра и результат записывается в указанную память. Далее подпрограмма уже работает с этой копией (используется для входных параметров; т.к. мы работаем с копией, то сам фактический параметр изменить уже нельзя, что гарантирует защиту от побочного эффекта). По окончании работы подпрограммы память освобождается.
                      2) для результата - память для переменной выделяется, но туда ничего не записывается, по окнончанию работы подпрограммы происходит запись из нее в фактический параметр (используется для передачи выходных параметров, т.е. результата).
                      3) значение-результат - используются оба механизма (может использоваться для входных, входно-выходных и выходных параметров, но может возникнуть побочный эффект).
                      4) по ссылке (адресу) - память не выделяется, подпрограмма работает с памятью выделенной фактическому параметру (может быть использовано для входных, входно-выходных и выходных параметров)
                      5) Текст, макроподстановка – везде, где встречается обработка формального параметра происходит автоматическая замена формального параметра на текст фактического. При этом в зависимости от текста фактического параметра не всегда может произойти корректная работа компилятора. Пример: пусть xзаменяется на a+b, тогда выражение вида x:=x+1 заменяется на выражение a+b:=a+b+1, а это ошибка, т.к. не понятно значение какой переменной необходимо менять.
                      6) :no: Я такого не знаю :no: Подскажите :D
                        Цитата Kotor @ 30.05.04, 13:37
                        В сумме получим 4, а он говорил про 3... Совсем запутался!

                        А в начале ты сказал, что их 6...
                        Я тебя понимаю - тут запутаться недолго. :huh:

                        Кстати, просвяти меня, чем передача параметров по ссылке отличается от передачи параметров, как выходных величин? Я думаю, что это - одно и то же. Так наверно и получается, что способов три.

                        Путанный какой-то вопрос... <_<
                          6 вообще, а в Delphi только 3 - имелось ввиду это. Передача параметра как выходного похожа на передачу по ссылке. Отличие в том, что при этом не гарантируется передача в прцедуру начального значения этого параметра. Параметр, переданный как выходной, указывает на некоторое место в памяти, куда процедура выводит значение. №2 в списке у Outlander.
                            Цитата
                            Outlander, 30.05.04, 14:31
                            2) для результата - память для переменной выделяется, но туда ничего не записывается, по окнончанию работы подпрограммы происходит запись из нее в фактический параметр (используется для передачи выходных параметров, т.е. результата).

                            Еслия правильно понял, имеется ввиду возврат результата функцией. Если так, то это не совсем параметр, точнее совсем не параметр :)
                            Цитата

                            3) значение-результат - используются оба механизма (может использоваться для входных, входно-выходных и выходных параметров, но может возникнуть побочный эффект).

                            Не понял, если можно пример на Delphi.
                            Цитата

                            5) Текст, макроподстановка – везде, где встречается обработка формального параметра происходит автоматическая замена формального параметра на текст фактического. При этом в зависимости от текста фактического параметра не всегда может произойти корректная работа компилятора. Пример: пусть xзаменяется на a+b, тогда выражение вида x:=x+1 заменяется на выражение a+b:=a+b+1, а это ошибка, т.к. не понятно значение какой переменной необходимо менять.

                            Хм. А что, в Delphi есть макропадстановки? А где вообще (в каком языке) существует такой способ передачи параметров?

                            P.S. Прошу не считать наездом, просто интересно.
                              Согласен, действительно интересно - первый раз такое слышу (читаю). :)
                                В принципе, есть три способа передачи параметра:
                                1) по значению;
                                2) по указателю;
                                3) по ссылке
                                При этом 2 и 3 можно считать одним и тем же, записываемым разным способом.

                                Цитата
                                Петрович, 30.05.04, 20:19
                                Хм. А что, в Delphi есть макропадстановки? А где вообще (в каком языке) существует такой способ передачи параметров?
                                Человек видимо спутал с препроцессором C/C++ или макроассемблера. :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0418 ]   [ 16 queries used ]   [ Generated: 16.08.25, 16:39 GMT ]