2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2
 
 Re: Метод конечных разностей
Сообщение15.06.2009, 22:38 
ну по формулам получается p=k-x ... а тут получается вместо x нич его нет! и p состоит только их k

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 14:05 
никто не ответит на мой вопрос?

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 14:50 
21rus
21rus в сообщении #222394 писал(а):
ну по формулам получается p=k-x ... а тут получается вместо x нич его нет! и p состоит только их k

Где конкретно Вы увидели такую глупость? В тексте программы было четко и ясно:
Код:
function p (var cof:real):real;
begin
     p:=k1-cof;
end;

Сравните с формулой
$p(x)=k_1-x$
Быть может, Вас смутило то, что автор программы перепутал $p(x)$ и $f(x)$ (по сравнению с условием они действительно перепутаны, но это, в общем-то, ерунда)?
Или сбил с толку несколько неудачный выбор наименования формального параметра cof?
А может быть (боюсь предположить страшное) Вы просто не знаете, каким образом в Pascal'е организуется возврат значения из функции?

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 15:38 
прав не знаю я паскаля=) просто интеерсно стало вмевсто x использовал cof ... просто перевел на си это все а откуда и как берется cof не понял

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 16:02 
Вы вообще знаете, что такое формальные параметры функции? Вот cof - как раз он самый...

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 17:59 
объясните

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 18:40 
Формальный параметр - это та переменная, которая объявляется в заголовке функции и может использоваться только в теле этой функции. При вызове функции в эту "переменную" копируется значение той переменной (или константы), которая указана в скобках на соответствующей позиции после наименования функции (в месте ее вызова в тексте программы). В реальности это скорее не настоящая переменная, а кусок памяти, выталкиваемый из стека в начале работы подпрограммы.
В C следовало бы записать что-то вроде
Код:
float p(float cof)
{
return k1-cof;
}

или:
Код:
double p(const double& cof)
{
return k1-cof;
}

Как-то так. По-моему, это перевод "строчка-в-строчку".

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 18:51 
ясна спасибо

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 19:20 
EtCetera в сообщении #222609 писал(а):
При вызове функции в эту "переменную" копируется значение той переменной (или константы), которая указана в скобках на соответствующей позиции после наименования функции (в месте ее вызова в тексте программы).

Зависит от того, как вызывается эта переменная -- "по имени" или "по значению". Если "по имени" (по-паскалевски -- с префиксом "var "), то в стек копируется не конкретное значение величины, а её адрес. (Константа "по имени" вызываться, естественно, не может, при трансляции выдаётся сообщение об ошибке.)

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 19:47 
Так и думал, что на мою недоговорку кто-нибудь набежит... При том, что к сути дела она отношения не имела...
ewert
Спасибо за разъяснения. Но я, в общем-то, в курсе. И второй пример кода иллюстрирует Ваши слова.
Строго говоря, такой случай передачи параметров в подпрограмму только в Pascal'e называется "по имени". Обычно его все же кличут "по ссылке".
И, кстати, Вы зря думаете, что по ссылке нельзя передать константу (в Pascal'e для этого можно использовать префикс const).

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 20:23 
EtCetera в сообщении #222624 писал(а):
такой случай передачи параметров в подпрограмму только в Pascal'e называется "по имени". Обычно его все же кличут "по ссылке".

(извините за буквоедство)

Не помню точно, где как кличут. Есть смутное детское воспоминание, что именно "по имени" кликали ещё в Фортране. А в Паскале -- ну, может, уже и "по ссылке". Не имеет значения, потому и не помню.

EtCetera в сообщении #222624 писал(а):
Вы зря думаете, что по ссылке нельзя передать константу (в Pascal'e для этого можно использовать префикс const).

Не припомню такого в Паскале. И во всяком случае это противоречит идеологии языка. Если константа обычная, то её пересылать по ссылке бессмысленно, да и запрещено -- ведь передача по ссылке подразумевает возможность изменения изнутри процедуры, что для константы низзя. Если же она типизированная, то фактически -- она просто переменная, только инициализируемая.

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 20:42 
ewert
ewert в сообщении #222635 писал(а):
Не помню точно, где как кличут. Есть смутное детское воспоминание, что именно "по имени" кликали ещё в Фортране. А в Паскале -- ну, может, уже и "по ссылке".

Нет, я имел в виду как раз то, что в Pascal'е и Fortran'е они именуются "по имени", а во всех языках, так или иначе произошедших от C - "по ссылке".
ewert в сообщении #222635 писал(а):
Если константа обычная, то её пересылать по ссылке бессмысленно, да и запрещено -- ведь передача по ссылке подразумевает возможность изменения изнутри процедуры, что для константы низзя.

Передача по ссылке предназначена прежде всего не для возможности изменения данных изнутри подпрограммы, а для минимизации данных, пропускаемых через стек (при ее вызове). Для изменения достаточно передать указатель на переменную в качестве параметра подпрограммы - такое и в Pascal'е будет работать. Просто в Pascal'е, в дополнение к такому (естественному) механизму ввели (на уровне языка) префиксы формальных параметров var и const, которые очень сходны со ссылками ...&... (и const...&..., соответственно) в C++. Эти высокоуровневые механизмы замещают явную передачу адреса в качестве параметра.
Дабы не лжесвидетельствовать, я еще перед предыдущим постом не поленился откопать у себя на компьютере старинный компилятор Pascal'я и набрать вот такую программку:
Код:
Procedure proc
  (
    const d : Real
  );
begin
  write(d:6);
end;

begin
  proc(3.14);
  readln;
end.

...которая успешно откомпилировалась и запустилась.
ewert в сообщении #222635 писал(а):
Если же она типизированная, то фактически -- она просто переменная, только инициализируемая.

Разумеется, но не о них речь.

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 21:04 
Ну вот наваял на коленке:

Код:
type  a = array[1..10] of integer;

const  x: a = (1,2,3,4,5,6,7,8,9,10);

procedure  y(const aa: a);
var  i,k: integer;
begin   for i:=1 to 10 do k:=k+aa[i];    end;

procedure  z(var aa: a);
var  i,k: integer;
begin   for i:=1 to 10 do k:=k+aa[i];    end;


begin
  end.

И впрямь, трансляция проходит. Но вот чего я в упор не понимаю -- каков глубокий философский смысл игрека по сравнению с зетом.

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 21:26 
Аватара пользователя
Дык, теперь если попробовать в теле функции менять сам аргумент, то - - -

 
 
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 21:41 
ewert
ewert в сообщении #222643 писал(а):
Но вот чего я в упор не понимаю -- каков глубокий философский смысл игрека по сравнению с зетом.

Смысл есть, хотя для Pascal'я он действительно довольно глубок. Просто когда пишутся более-менее большие программы, хорошим тоном считается все параметры, которые слишком велики для проталкивания в стек, но значение которых не должно меняться в ходе выполнения подпрограммы, объявлять как константную ссылку (const), а не как параметр-переменную (var). Иначе очень легко при внесении изменений в подпрограмму "забыться" и менять те данные, которые меняться не должны. А искать в большой программе внезапно возникшую ошибку (которая может и не вдруг себя проявлять) - дело затратное и утомительное... При использовании же префикса const и попытке изменения значения такого параметра ошибка выдается еще на этапе компиляции, что разом отсекает множество ненужных проблем.
В Pascal'е про const частенько забывают, так как на нем, все-таки, особо крупные программы не пишутся. Да и создавался он не для промышленных целей, а, скорее, для учебных (и с этой своей ролью он неплохо справляется)...

 
 
 [ Сообщений: 30 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group