Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2016, 14:29   #11
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

но как ни странно на всём форуме не пользуется это var к входящим элементам. в функциях в особенности.!
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 15.11.2016 в 14:31.
IliaIT вне форума Ответить с цитированием
Старый 15.11.2016, 14:43   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от IliaIT Посмотреть сообщение
но как ни странно на всём форуме не пользуется это var к входящим элементам. в функциях в особенности.
IliaIT, или я вашу мысль не понимаю, или Вы ошибаетесь.

Модификатор var применяется не к "входящим" или "исходящим" параметрам.
Это всё навсего указание компилятору, что данный параметр передаётся в процедуру/функцию по ссылке (т.е. передаётся адрес), поэтому, если внутри процедуры/функции этот параметр изменяется, то изменяется и переменная, которая была передана.
сравните:
Код:
procedure Test1(k:integer);
begin
  k:=100
end;
var n : integer;
begin
  n := 1;
  Test1(n);
  WriteLn(n);
end.
Код:
procedure Test2(var k:integer);
begin
  k:=100
end;
var n : integer;
begin
  n := 1;
  Test2(n);
  WriteLn(n);
end.
И, например, в связи с этим, в качестве такого параметра нельзя передать константу.
т.е. Test1(33) можно вызвать, Test2(33) - нельзя - компилятор такое не пропустит.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.11.2016, 15:09   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
но как ни странно на всём форуме не пользуется это var к входящим элементам. в функциях в особенности
Не знали наверно, что так нельзя:
Код:
function FindNext(var F: TSearchRec): Integer;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 15.11.2016 в 15:51.
Аватар вне форума Ответить с цитированием
Старый 16.11.2016, 23:49   #14
lichking
Пользователь
 
Регистрация: 31.10.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TCompRec =record real, extend: Extended; end; // избавимся от массивов

   TComplex = class(TObject)
   private
   { private declarations }
   protected
   { protected declarations }
   public
     constructor Create(F: TForm;I:integer);
   { public declarations }
   published
     class function slojenie (S2,S3 :TCompRec): TCompRec; //будем получать нормальный результат
     { published declarations }
   end;


  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Button1: TButton;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

//var  НИКАКИХ глобальных переменных
//IM:TComplex;
//i:integer;  ОСОБЕННО для переменных цикла.
//s,s2,s3,S4: array [0..1] of Extended;
 

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 s2, s3, s4: TcompRec;
begin
s2.real:=strtofloat(Edit1.Text);
s2.extend:=strtofloat(Edit2.Text);
s3.real:=strtofloat(Edit3.Text);
s3.extend:=strtofloat(Edit4.Text);
//for I := 0 to 1 do // нет массива нет и цикла
s4:=TComplex.slojenie(S2,S3);
StaticText1.Caption:='';
StaticText2.Caption:='';
StaticText3.Caption:='';
begin
StaticText1.Caption:=format('[%f;%f]', [s4.real, s4.extend]);
StaticText2.Caption:=format('[%f;%f]', [s4.real, s3.extend]);
StaticText3.Caption:=format('[%f;%f]', [s4.real, s2.extend]);
end;
end;

{ TComplex }

constructor TComplex.Create(F: TForm; I: integer);
begin

end;

class function TComplex.slojenie(S2, S3: TCompRec): TCompRec;
begin
  result.real:=s2.real +s3.real; 
  result.extend:=s2.extend +s3.extend;
end;

end.
P.S. если ОЧЕНЬ хочется вернуться к массиву, то
Код:
TCompRec =record real, extend: extended; end;array [0..1] of extended;
далее замена
xx.real --> xx[0]
xx.extend --> xx[1]
наверно это очень хороший и возможно даже рабочий но я не могу это проверить в Delphi 10.1 Berlin т.к. там нет функции
s2.real
s2.extend
lichking вне форума Ответить с цитированием
Старый 17.11.2016, 13:54   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
т.к. там нет функции
s2.real
s2.extend
их нет, есть полЯ объявленной НАМИ записи(record) с такими именами.
Цитата:
type
TCompRec = record real, extend: Extended; end; // избавимся от массивов
s2: TcompRec;

s2.real:=.......//задать (или получить если справа от:=) значение соответствующего поля указанной переменной.

Мы вместо использования массива array [0..1] of extended
для хранение ДВУХ чисел используем запись(record) с ДВУМЯ же полями.

Цитата:
не могу это проверить в Delphi 10.1 Berlin
то что там написано работает в Deplhi 7.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.11.2016 в 13:58.
evg_m вне форума Ответить с цитированием
Старый 19.11.2016, 19:57   #16
lichking
Пользователь
 
Регистрация: 31.10.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TCompRec =record real, extend: Extended; end; // избавимся от массивов

   TComplex = class(TObject)
   private
   { private declarations }
   protected
   { protected declarations }
   public
     constructor Create(F: TForm;I:integer);
   { public declarations }
   published
     class function slojenie (S2,S3 :TCompRec): TCompRec; //будем получать нормальный результат
     { published declarations }
   end;


  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Button1: TButton;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

//var  НИКАКИХ глобальных переменных
//IM:TComplex;
//i:integer;  ОСОБЕННО для переменных цикла.
//s,s2,s3,S4: array [0..1] of Extended;
 

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 s2, s3, s4: TcompRec;
begin
s2.real:=strtofloat(Edit1.Text);
s2.extend:=strtofloat(Edit2.Text);
s3.real:=strtofloat(Edit3.Text);
s3.extend:=strtofloat(Edit4.Text);
//for I := 0 to 1 do // нет массива нет и цикла
s4:=TComplex.slojenie(S2,S3);
StaticText1.Caption:='';
StaticText2.Caption:='';
StaticText3.Caption:='';
begin
StaticText1.Caption:=format('[%f;%f]', [s4.real, s4.extend]);
StaticText2.Caption:=format('[%f;%f]', [s4.real, s3.extend]);
StaticText3.Caption:=format('[%f;%f]', [s4.real, s2.extend]);
end;
end;

{ TComplex }

constructor TComplex.Create(F: TForm; I: integer);
begin

end;

class function TComplex.slojenie(S2, S3: TCompRec): TCompRec;
begin
  result.real:=s2.real +s3.real; 
  result.extend:=s2.extend +s3.extend;
end;

end.
P.S. если ОЧЕНЬ хочется вернуться к массиву, то
Код:
TCompRec =record real, extend: extended; end;array [0..1] of extended;
далее замена
xx.real --> xx[0]
xx.extend --> xx[1]
спасибо помогло
lichking вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача в функцию указателя на функцию C Jar Помощь студентам 3 03.05.2014 16:27
Оброботка масива.найти елемент масива с указанием его адреса в строке и в столбце Rokko195 Паскаль, Turbo Pascal, PascalABC.NET 3 20.12.2012 07:22
Передача масива в функциу ВасяСВВ Общие вопросы C/C++ 23 01.12.2010 08:52
Проблема с функциями(передача масива в функцию типа int) sekator Общие вопросы C/C++ 4 27.07.2010 22:13
Методы передачи масива в функцию ROD Общие вопросы C/C++ 4 30.11.2008 19:58