Глобальные переменные

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

В паскале имя функции — это …

глобальная переменная И глобальный идентификатор.
2
9%
НЕ глобальная переменная, НО глобальный идентификатор.
9
41%
глобальная переменная И НЕ глобальный идентификатор.
0
Голосов нет
НЕ глобальная переменная И НЕ глобальный идентификатор.
11
50%
 
Всего голосов : 22

Re: Глобальные переменные

Сообщение скалогрыз » 30.12.2015 23:25:24

Дож писал(а):В паскале по умолчанию используется своя конвенция (я так полагаю, называется register). Эта конвенция предписывает возвращать результат функции через регистры, если умеющаются, а если не умещаются, то класть в специально подготовленную область памяти.

не юли, скажи често , что если не умещаются в регистры, то кладутся в стэк ;)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Глобальные переменные

Сообщение Дож » 30.12.2015 23:29:43

скалогрыз писал(а):
Дож писал(а):В паскале по умолчанию используется своя конвенция (я так полагаю, называется register). Эта конвенция предписывает возвращать результат функции через регистры, если умеющаются, а если не умещаются, то класть в специально подготовленную область памяти.

не юли, скажи често , что если не умещаются в регистры, то кладутся в стэк ;)

С каких это пор аккуратные формулировки в областях, в которых автор не является специалистом, называются юлением? :) Я до сих пор был без понятия (абсолютно серьёзно) как действует register конвенция (хотя с stdcall и cdecl несколько лет назад разбирался) и сейчас впервые читал и смотрел ассемблерный код на эту тему.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Глобальные переменные

Сообщение скалогрыз » 30.12.2015 23:30:02

hinst писал(а):В паскакале могут быть вложенные локальные функции; так что функции могут быть и локальные и глобальные

с точки зрения компоновщика локальные переменные такие же глобальные, т.к. для него пространство имён плоское. И лишь благодаря неустанному труду компилятора коллизий не происходит :)

Добавлено спустя 1 минуту 36 секунд:
Дож писал(а):С каких это пор аккуратные формулировки в областях, в которых автор не является специалистом, называются юлением? :)

просто термин "специально подготовленная область памяти" намекает на пробелы в знаниях. Но сам факт ликвидации этих пробелов радует. Ликбез же!

А статья в википедии на эту тему хороша. Причём в русскоязычной Борландовский регистр назван разновидностью "fastcall"-а, то в англоязычной он всё ещё называется register.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Глобальные переменные

Сообщение Дож » 30.12.2015 23:35:54

скалогрыз писал(а):
hinst писал(а):В паскакале могут быть вложенные локальные функции; так что функции могут быть и локальные и глобальные

с точки зрения компоновщика локальные переменные такие же глобальные, т.к. для него пространство имён плоское. И лишь благодаря неустанному труду компилятора коллизий не происходит :)

Всё же не стоит смешивать видимость в программе на языке паскаль, и видимость в каком-то другом смысле (видимость у компилятора в ассемблере, видимость идентификаторов у компановщика, видимость куска памяти в конце работы функции и прочие видимости) :)
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Глобальные переменные

Сообщение скалогрыз » 30.12.2015 23:37:24

Кстати, о компонвщике! Почему никто не говорит, что для него, имя процедуры внезапно становится очень важной переменной? :mrgreen:
И что FPC позволяет назначать произвольное имя для процедур, а не то которое в объявлении. И причём сам RTL и LCL этим активно пользуются.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Глобальные переменные

Сообщение Дож » 30.12.2015 23:39:49

скалогрыз писал(а):
Дож писал(а):С каких это пор аккуратные формулировки в областях, в которых автор не является специалистом, называются юлением? :)

просто термин "специально подготовленная область памяти" намекает на пробелы в знаниях. Но сам факт ликвидации этих пробелов радует. Ликбез же!


Ну, ладно, мне даже стало интересно, что вообще произойдёт в таком коде?
Код: Выделить всё
type
PRecord = ^TRecord;
TRecord = record
  A, B, C, D: LongInt
end;

function func_register_record(A, B: LongInt): TRecord;
begin
  Result.A := A + B;
  Result.B := A - B;
  Result.C := A * B;
  Result.D := A div B;
end;

var
  R: PRecord;

begin
  New(R);
  R^ := func_register_record(4, 5);
end.

(Будет ли структура возвращена через стек? Или таки указатель на кучу будет передан в функцию и в эту кучу сразу запишется результат?)
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Глобальные переменные

Сообщение скалогрыз » 30.12.2015 23:43:51

Дож писал(а):Всё же не стоит смешивать видимость в программе на языке паскаль, и видимость в каком-то другом смысле (видимость у компилятора в ассемблере, видимость идентификаторов у компановщика, видимость куска памяти в конце работы функции и прочие видимости)

К сожалению, это не уже невозможно, именно из-за термина "язык паскаль".
Если брать какой-нибудь конкретный диалект, например Turbo Pascal, то там можно с уверенностью сказать, что имя функции это идентификатор и не переменная.
А вот если подниматся дальше, в Delphi, то язык обрастает всякими плюшками вроде RTTI, где это имя может хранится и граница становится размытой.
А если добавлять ещё и новомодные фичи FPC, с поддержкой objective-c, то там имя функции (идентификатор) как раз движется по направлению к глобальной переменной (selector-у).

Добавлено спустя 7 минут 41 секунду:
Дож писал(а):(Будет ли структура возвращена через стек? Или таки указатель на кучу будет передан в функцию и в эту кучу сразу запишется результат?)

через стек. хочешь указатель на кучу, используй "var".
Кстати именно по-этому эффективнее использовать "var" параметры, нежели возвращать структуры.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Глобальные переменные

Сообщение Снег Север » 31.12.2015 00:07:35

vitaly_l писал(а):
Снег Север писал(а):Но вы не покажете, поскольку такового не существует.

Вы заблуждаетесь. Точнее одурачены "плохим/ложным" образованием, равно как и те кто верит в сказку про "большой взрыв".
Или же Вы как физик можете объяснить: Как это галактика сменила курс более чем на 90 градусов и летит на нас со скоростью 110 т.к.с?
Можете пояснить?

Извините, но вы элементарно несете полную чушь. Начнем с того, что с какого бодуна вы вообразили, что галактика "сменила курс"? Вам лично Саваоф выдал траектории всех галактик со дня сингулярности? :lol: Сообщаю для вашего сведения, что если красное смещение и считать "разбеганием", это не более чем усреднение, ничто не препятствует галактикам иметь любое направление скорости.
И как там насчет перпетум мобиле? Где и когда состоится демонстрация? :lol:
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3039
Зарегистрирован: 27.11.2007 16:14:47

Re: Глобальные переменные

Сообщение Дож » 31.12.2015 00:15:46

скалогрыз писал(а):
Дож писал(а):(Будет ли структура возвращена через стек? Или таки указатель на кучу будет передан в функцию и в эту кучу сразу запишется результат?)

через стек. хочешь указатель на кучу, используй "var".
Кстати именно по-этому эффективнее использовать "var" параметры, нежели возвращать структуры.

Я примерно понимаю зачем это сделано (чтобы гарантировать отсутствие коллизий входных аргументов и возвращаемого значения), но я всё равно в печали. (Ибо var неудобен, особенно в случае сложных векторных, матричных и пр. выражений.)
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Глобальные переменные

Сообщение скалогрыз » 31.12.2015 00:23:03

Дож писал(а):(Ибо var неудобен, особенно в случае сложных векторных, матричных и пр. выражений.)

А неудобен каким образом?
Код: Выделить всё
type
PRecord = ^TRecord;
TRecord = record
  A, B, C, D: LongInt
end;

procedure func_var_record(A, B: LongInt; var Result: TRecord);
begin
  Result.A := A + B;
  Result.B := A - B;
  Result.C := A * B;
  Result.D := A div B;
end;

var
  R: PRecord;

begin
  New(R);
  func_var_record(4, 5, R^);
end.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Глобальные переменные

Сообщение Дож » 31.12.2015 00:34:49

скалогрыз, в данном примере разницы нет.

А если вообще, то хочется писать векторные выражения как с числами
Код: Выделить всё
// функция отражения вектора V относительно направления D
function Mir2f(const V, D: TVec2f): TVec2f;
begin
  Result := Add2f(V, Mul2f(Sub2f(Mul2f(D, Dot2f(V, D)), V), 2));
end;

а не как на каком-нибудь трёхадресном ассемблере
Код: Выделить всё
function Mir2f(const V, D: TVec2f): TVec2f;
var
  Temp1, Temp2: TVec2f;
begin
  Dot2f(V, D, Temp1);
  Mul2f(D, Temp1, Temp2);
  Sub2f(Temp2, V, Temp1);
  Mul2f(Temp1, 2, Temp2)
  Add2f(V, Temp2, Result);
end;
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Глобальные переменные

Сообщение скалогрыз » 31.12.2015 00:58:02

Дож писал(а):А если вообще, то хочется писать векторные выражения как с числами

Де жа вю!
я ещё тогда сказал, что трёхадресный ассемблер выглядит круче :mrgreen:
...хотя может есть какая оптимизация, которая заставляет результат функции возвращать через адрес.
Но тут проблема в том, что
Код: Выделить всё

  temp1:=Dot2f(V, D) // адрес есть

а скажем
Код: Выделить всё

   Dot2f(V, D) // адреса нет


Кстати, логическая ошибка! ибо Mir2f, тоже должен возвращать значение как var.
Код: Выделить всё
function Mir2f(const V, D: TVec2f; var Result: TVec2f);
var
  T: TVec2f;
begin
  Dot2f(V, D, Result);
  Mul2f(D, Result, T);
  Sub2f(T, V, Result);
  Mul2f(Result, 2, T)
  Add2f(V, T, Result);
end;
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Глобальные переменные

Сообщение Дож » 31.12.2015 01:19:56

скалогрыз писал(а):Но тут проблема в том, что
Код: Выделить всё

  temp1:=Dot2f(V, D) // адрес есть

а скажем
Код: Выделить всё

   Dot2f(V, D) // адреса нет

Этой проблемы нет, потому что компилятор перед вызовом функции может выделить кусок памяти на стеке и передать указатель на этот кусок в Dot2f. Тогда функция вообще не будет знать куда она пишет результат: в кучу или в стек.

Реальная проблема (того, почему компилятор не может тупо применить подобную оптимизацию во всех случаях) есть из-за вот такого
Код: Выделить всё
{$MODE OBJFPC}
type
TRecord = record
  A, B: LongInt;
end;

function Swap(const R: TRecord): TRecord;
begin
  Result.A := R.B;
  Result.B := R.A;
end;

procedure Swap(const R: TRecord; out Result: TRecord);
begin
  Result.A := R.B;
  Result.B := R.A;
end;

var
  R: TRecord;

begin
  R.A := 3;
  R.B := 4;
  R := Swap(R); // выведет 3 4
  Writeln(R.A, ' ', R.B);
  Swap(R, R); // выведет 3 3
  Writeln(R.A, ' ', R.B);
end.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Глобальные переменные

Сообщение скалогрыз » 31.12.2015 01:29:11

Дож писал(а):Реальная проблема (того, почему компилятор не может тупо применить подобную оптимизацию во всех случаях) есть из-за вот такого
Код: Выделить всё
procedure Swap(const R: TRecord; out Result: TRecord);
begin
  Result.A := R.B;
  Result.B := R.A;
end;


Это уже вопрос органиацзии API.
В целом, когда в функции есть const/var параметры одного типа, следует оговаривать, можно ли передавать одну и туже переменную и как const и как var параметр. Это напрямую зависит от реализации функции.

Если её реализовать таким образом:
Код: Выделить всё
procedure Swap(const R: TRecord; out Result: TRecord);
var
  t: integer;
begin
  t:=Result.A;
  Result.A := R.B;
  Result.B := t;
end;

то проблемы, очевидно, не возникнет.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Глобальные переменные

Сообщение vitaly_l » 31.12.2015 01:35:09

Снег Север писал(а):красное смещение и считать "разбеганием", это не более чем усреднение, ничто не препятствует галактикам иметь любое направление скорости

Вы салют видели? Точно видели? Уверены что видели? 100% уверены что, видели салют?
А салют, в котором "искры", летят друг другу на встречу - видели? А что касаемо положения галактик в пространстве, то обратитесь к ЛЮБОМУ астроному и он Вам подтвердит. Положение галактик, не соответствует (в смысле противоречит), положению "искр" от взрыва обыкновенного салюта. И кстати об Эйнштейне, он говорил что-то, про истинность и точность и разумность: доказательств, которые изложены на уровне объяснения понятного даже ребёнку...

И кстати я не говорил что: "галактика сменила курс"... я говорил, что: "при большом взрыве она должна была бы сменить курс"... но постольку поскольку, галактика не меняла курс (это технически не возможно см. пример с салютом). Соответственно: теория большого взрыва лопнула как мыльный пузырь. А вместе с ней и ещё куча мыльных пузырей, так что..., теория, в принципе конечно о большом взрыве... только не во вселенной, а в мыльных пузырях.

А к ВД, мы ещё вернёмся...
обещаю. Суть в том что, Ктулху слишком сильный и нужно сократить количество мыльных пузырей, чтобы Ктулху утратил силу... т.к. Ктулху - это не BSODа, и Ктулху - реально опасен, в отличии от новогоднего салюта... Ктулху тоже существует... :wink: И кстати, фраза фантастов "перебили всех говорунов", <=== далеко не сказка их действительно перебили, адепты злого Ктулху.

Или быть может салютинки/искры сталкиваются после взрыва? А?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Пред.След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru