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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2016, 21:01   #1
lichking
Пользователь
 
Регистрация: 31.10.2016
Сообщений: 54
По умолчанию передача масива в функцию

Необходимо предать массив в в функцию другого класа
Код:
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
  type
   TComplex = class(TObject)
            private
              { private declarations }
            protected
              { protected declarations }
            public
    constructor Create(F: TForm;I:integer);
              { public declarations }

            published


            function slojenie ( var S2,S3 :array of Extended): Extended;
              { published declarations }
            end;
type
  TForm3 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var

Form3: TForm3;
IM:TComplex;
i:integer;
s,s2,s3,S4: array [0..1] of Extended;


implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);


begin
s2[0]:=strtofloat(Edit1.Text);
s2[1]:=strtofloat(Edit2.Text);
s3[0]:=strtofloat(Edit3.Text);
s3[1]:=strtofloat(Edit4.Text);
for I := 0 to I do
s4[i]:=Im.slojenie(S2[i],S3[i]);
for I := 0 to I do
begin
StaticText1.Caption:=StaticText1.Caption+'s4'+inttostr(i)+'['+floattostr(s4[i])+']';
StaticText2.Caption:=StaticText2.Caption+'s3'+inttostr(i)+'['+floattostr(s3[i])+']';
StaticText3.Caption:=StaticText3.Caption+'s2'+inttostr(i)+'['+floattostr(s2[i])+']';
end;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
I:=1;
end;

{ TComplex }



constructor TComplex.Create(F: TForm;I:integer);
begin
 F:=Form3;
  I:=0;
end;



function TComplex.slojenie(var S2, S3: array of Extended): Extended;
var
s4: array [0..1] of Extended;
begin
S4[i]:=s2[i]+s3[i];
end;

end.
выдает ошибку:
First chance exception at $004079FC. Exception class $C0000090 with message 'floating point invalid operation at 0x004079fc'. Process Project2.exe (8576)

Последний раз редактировалось lichking; 14.11.2016 в 21:04.
lichking вне форума Ответить с цитированием
Старый 14.11.2016, 21:57   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от lichking Посмотреть сообщение
floating point invalid operation at 0x004079fc'. Process Project2.exe (8576)
Вы бы показали сроку, где такая ошибка возникает. А такая ошибка происходит, насколько я знаю, из-за извлечения корня чётной степени из отрицательного числа или взятия логарифма из числа меньшего, либо равного нулю.
Вадим Мошев вне форума Ответить с цитированием
Старый 14.11.2016, 22:28   #3
lichking
Пользователь
 
Регистрация: 31.10.2016
Сообщений: 54
По умолчанию

нет это передача в функцию 2х массивов в функцию другого класcа сложение и выдача результата обратно в класс Form3

а вот где возникает ошибка:
Изображения
Тип файла: jpg d1.jpg (113.7 Кб, 125 просмотров)
Тип файла: jpg d2.jpg (122.2 Кб, 121 просмотров)
lichking вне форума Ответить с цитированием
Старый 14.11.2016, 22:29   #4
lichking
Пользователь
 
Регистрация: 31.10.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
Вы бы показали сроку, где такая ошибка возникает. А такая ошибка происходит, насколько я знаю, из-за извлечения корня чётной степени из отрицательного числа или взятия логарифма из числа меньшего, либо равного нулю.
ответ выше
lichking вне форума Ответить с цитированием
Старый 14.11.2016, 23:11   #5
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Во первых, что вы хотите от цикла
Код:
 for I := 0 to I do   //  I - от 0 до .. самой себя
Во вторых - какая-то фигня у вас с функцией TComplex.slojenie.
Какой в ней смысл, если она непонятно что возвращает ? Зачем там переменная s4 , которая нигде не используется, а тихо умирает при выходе из функции? Это кстати совсем не та s4, которая указана выше в другом var

Последний раз редактировалось type_Oleg; 14.11.2016 в 23:13.
type_Oleg вне форума Ответить с цитированием
Старый 15.11.2016, 10:48   #6
lichking
Пользователь
 
Регистрация: 31.10.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Во первых, что вы хотите от цикла
Код:
 for I := 0 to I do   //  I - от 0 до .. самой себя
Во вторых - какая-то фигня у вас с функцией TComplex.slojenie.
Какой в ней смысл, если она непонятно что возвращает ? Зачем там переменная s4 , которая нигде не используется, а тихо умирает при выходе из функции? Это кстати совсем не та s4, которая указана выше в другом var

Вот это работает:
Код:
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
  type
   TComplex = class(TObject)
            private
              { private declarations }
            protected
              { protected declarations }
            public
    constructor Create(F: TForm;I:integer);
              { public declarations }

            published


            function slojenie ( var S2,S3 :array of Extended): Extended;
              { published declarations }
            end;
type
  TForm3 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure StaticText1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var

Form3: TForm3;
IM:TComplex;
i:integer;
s,s2,s3,S4: array [0..1] of Extended;


implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);


begin
s2[0]:=strtofloat(Edit1.Text);
s2[1]:=strtofloat(Edit2.Text);
s3[0]:=strtofloat(Edit3.Text);
s3[1]:=strtofloat(Edit4.Text);
for I := 0 to I do
s4[i]:=Im.slojenie(S2[i],S3[i]);
for I := 0 to I do
begin
StaticText1.Caption:=StaticText1.Caption+inttostr(i)+' ['+floattostr(s4[i])+'] ';
StaticText2.Caption:=StaticText2.Caption+inttostr(i)+' ['+floattostr(s3[i])+'] ';
StaticText3.Caption:=StaticText3.Caption+inttostr(i)+' ['+floattostr(s2[i])+'] ';
end;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
I:=1;
end;

procedure TForm3.StaticText1Click(Sender: TObject);
begin

end;

{ TComplex }



constructor TComplex.Create(F: TForm;I:integer);
begin
 F:=Form3;
  I:=0;
end;



function TComplex.slojenie(var S2, S3: array of Extended): Extended;

begin
Result:=s2[i]+s3[i];
end;


end.
но не складывает все элементы массива:
Изображения
Тип файла: jpg d3.jpg (14.5 Кб, 113 просмотров)
lichking вне форума Ответить с цитированием
Старый 15.11.2016, 11:18   #7
lichking
Пользователь
 
Регистрация: 31.10.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Во первых, что вы хотите от цикла
Код:
 for I := 0 to I do   //  I - от 0 до .. самой себя
Во вторых - какая-то фигня у вас с функцией TComplex.slojenie.
Какой в ней смысл, если она непонятно что возвращает ? Зачем там переменная s4 , которая нигде не используется, а тихо умирает при выходе из функции? Это кстати совсем не та s4, которая указана выше в другом var
а ели такой код:

Код:
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
  type
   TComplex = class(TObject)
            private
              { private declarations }
            protected
              { protected declarations }
            public
    constructor Create(F: TForm;I:integer);
              { public declarations }

            published


            function slojenie ( var S2,S3 :array of Extended): Extended;
              { published declarations }
            end;
type
  TForm3 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure StaticText1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var

Form3: TForm3;
IM:TComplex;
i:integer;
s,s2,s3,S4: array [0..1] of Extended;


implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);


begin
s2[0]:=strtofloat(Edit1.Text);
s2[1]:=strtofloat(Edit2.Text);
s3[0]:=strtofloat(Edit3.Text);
s3[1]:=strtofloat(Edit4.Text);
for I := 0 to I do
s4[i]:=Im.slojenie(S2[i],S3[i]);
for I := 0 to I do
begin
StaticText1.Caption:=StaticText1.Caption+inttostr(i)+' ['+floattostr(s4[i])+'] ';
StaticText2.Caption:=StaticText2.Caption+inttostr(i)+' ['+floattostr(s3[i])+'] ';
StaticText3.Caption:=StaticText3.Caption+inttostr(i)+' ['+floattostr(s2[i])+'] ';
end;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
I:=1;
end;

procedure TForm3.StaticText1Click(Sender: TObject);
begin

end;

{ TComplex }



constructor TComplex.Create(F: TForm;I:integer);
begin
 F:=Form3;
  I:=0;
end;



function TComplex.slojenie(var S2, S3: array of Extended): Extended;

begin
for I := 0 to 1 do
Result:=s2[i]+s3[i];
end;


end.
то
Изображения
Тип файла: jpg d4.jpg (94.1 Кб, 127 просмотров)
Тип файла: jpg d5.jpg (106.1 Кб, 124 просмотров)
lichking вне форума Ответить с цитированием
Старый 15.11.2016, 11:49   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
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]
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 15.11.2016 в 11:59.
evg_m вне форума Ответить с цитированием
Старый 15.11.2016, 13:48   #9
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

Код:
function TComplex.slojenie(var S2, S3: array of Extended): Extended;
нет ни одного входящего элемента.! все исходящие. либо
Код:
var
уберите.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 15.11.2016 в 13:53.
IliaIT вне форума Ответить с цитированием
Старый 15.11.2016, 13:55   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Почему var не входящий? В том числе и входящий.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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