大家帮我看看 ( 积分: 10 )

  • 主题发起人 主题发起人 lmk
  • 开始时间 开始时间
L

lmk

Unregistered / Unconfirmed
GUEST, unregistred user!
看看程序错在哪了?中间的2个做标记的地方。
unit Unit1;

interface

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

type
TDoubleArray = array[0..2] of Double;
TDoubleArray2 = array[0..2] of array[0..2] of Double;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
function Trans(A: TDoubleArray
B: TDoubleArray2): TDoubleArray;
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;
arr1: TDoubleArray;
arr2: TDoubleArray2;
arr3: TDoubleArray;
num: double;


implementation
{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
arr1[0]:=1/3;arr1[1]:=1/3;arr1[2]:=1/3;
arr2[0][0]:=strtofloat(edit1.Text);arr2[0][1]:=strtofloat(edit2.Text);arr2[0][2]:=strtofloat(edit3.Text);
arr2[1][0]:=strtofloat(edit4.Text);arr2[1][1]:=strtofloat(edit5.Text);arr2[1][2]:=strtofloat(edit6.Text);
arr2[2][0]:=strtofloat(edit7.Text);arr2[2][1]:=strtofloat(edit8.Text);arr2[2][2]:=strtofloat(edit9.Text);
end;
{如过把上面数组直接付值就可以运行
arr2[0][0]:=1;arr2[0][1]:=1;arr2[0][2]:=1/5;
arr2[1][0]:=1;arr2[1][1]:=1;arr2[1][2]:=1/3;
arr2[2][0]:=5;arr2[2][1]:=3;arr2[2][2]:=1;
}

procedure TForm1.Button1Click(Sender: TObject);
begin
arr3:=Trans(arr1,arr2);
edit1.Text:=floattostr(arr3[0]);
edit2.Text:=floattostr(arr3[1]);
edit3.Text:=floattostr(arr3[2]);
edit4.Text:=floattostr(num);
end;

function tform1.Trans(A: TDoubleArray
B: TDoubleArray2): TDoubleArray

var
arr: TDoubleArray;
tB: TDoubleArray2;
i,j: integer;
begin
for i:=0 to length(A)-1 do
for j:=0 to length(A)-1 do
tB[j]:=B[j];

edit1.Text:=floattostr(tB[0][0]);
edit2.Text:=floattostr(tB[0][1]);
edit3.Text:=floattostr(tB[0][2]);
edit4.Text:=floattostr(num);

num:=0;
for i:=0 to length(A)-1 do
begin
arr:=0;
for j:=0 to length(A)-1 do
begin
arr:=arr+A[j]*tB[j];
end;
num:=num+arr;
end;

for i:=0 to length(arr) do
begin
arr:=arr/num;
end;

for i:=0 to length(A)-1 do
if abs(A-arr)>0.01 then
arr:=Trans(arr,tB);
result:=arr
//这样返回安全吗?
end;
end.
 
看看程序错在哪了?中间的2个做标记的地方。
unit Unit1;

interface

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

type
TDoubleArray = array[0..2] of Double;
TDoubleArray2 = array[0..2] of array[0..2] of Double;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
function Trans(A: TDoubleArray
B: TDoubleArray2): TDoubleArray;
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;
arr1: TDoubleArray;
arr2: TDoubleArray2;
arr3: TDoubleArray;
num: double;


implementation
{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
arr1[0]:=1/3;arr1[1]:=1/3;arr1[2]:=1/3;
arr2[0][0]:=strtofloat(edit1.Text);arr2[0][1]:=strtofloat(edit2.Text);arr2[0][2]:=strtofloat(edit3.Text);
arr2[1][0]:=strtofloat(edit4.Text);arr2[1][1]:=strtofloat(edit5.Text);arr2[1][2]:=strtofloat(edit6.Text);
arr2[2][0]:=strtofloat(edit7.Text);arr2[2][1]:=strtofloat(edit8.Text);arr2[2][2]:=strtofloat(edit9.Text);
end;
{如过把上面数组直接付值就可以运行
arr2[0][0]:=1;arr2[0][1]:=1;arr2[0][2]:=1/5;
arr2[1][0]:=1;arr2[1][1]:=1;arr2[1][2]:=1/3;
arr2[2][0]:=5;arr2[2][1]:=3;arr2[2][2]:=1;
}

procedure TForm1.Button1Click(Sender: TObject);
begin
arr3:=Trans(arr1,arr2);
edit1.Text:=floattostr(arr3[0]);
edit2.Text:=floattostr(arr3[1]);
edit3.Text:=floattostr(arr3[2]);
edit4.Text:=floattostr(num);
end;

function tform1.Trans(A: TDoubleArray
B: TDoubleArray2): TDoubleArray

var
arr: TDoubleArray;
tB: TDoubleArray2;
i,j: integer;
begin
for i:=0 to length(A)-1 do
for j:=0 to length(A)-1 do
tB[j]:=B[j];

edit1.Text:=floattostr(tB[0][0]);
edit2.Text:=floattostr(tB[0][1]);
edit3.Text:=floattostr(tB[0][2]);
edit4.Text:=floattostr(num);

num:=0;
for i:=0 to length(A)-1 do
begin
arr:=0;
for j:=0 to length(A)-1 do
begin
arr:=arr+A[j]*tB[j];
end;
num:=num+arr;
end;

for i:=0 to length(arr) do
begin
arr:=arr/num;
end;

for i:=0 to length(A)-1 do
if abs(A-arr)>0.01 then
arr:=Trans(arr,tB);
result:=arr
//这样返回安全吗?
end;
end.
 
我现在想把上面第一个有注释的地方的二维数组的直接付值改成通过edit输入的形式,现在用
arr2[0][0]:=strtofloat(edit1.Text);arr2[0][1]:=strtofloat(edit2.Text);arr2[0][2]:=strtofloat(edit3.Text);
arr2[1][0]:=strtofloat(edit4.Text);arr2[1][1]:=strtofloat(edit5.Text);arr2[1][2]:=strtofloat(edit6.Text);
arr2[2][0]:=strtofloat(edit7.Text);arr2[2][1]:=strtofloat(edit8.Text);arr2[2][2]:=strtofloat(edit9.Text);
但运行错误,是不是strfloat不能在这里用啊?但程序运行错误中止的地方是倒数第8行,因为是初学,不知道错误出在哪儿了?各位大虾帮帮忙把。
另外现在这个函数的功能是实现3维数组的运算,但如果我想让他能实现任意维的运算,应该怎么改?
 
说错了,应该是3介矩阵。虽然分少了点,但还是希望大家帮帮忙
 
什么错误啊??贴出来。。。
 
strtofloat 没错啊,你的错误提示是什么?
strtofloat返回值是 Extended类型 除非是你返回的范围超过了范围

Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10
 
哎!终于还是靠自己解决了。很简单就是放错了地方
不应该在procedure TForm1.FormCreate(Sender: TObject);中
而是在procedure TForm1.Button1Click(Sender: TObject);中付值。
可惜了我分数
 
你的学习态度有问题啊
 
不过还好有两位来给小弟捧场,在下不胜感激,请到另外个帖子领分
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
584
import
I
I
回复
0
查看
630
import
I
I
回复
0
查看
574
import
I
I
回复
0
查看
671
import
I
I
回复
0
查看
529
import
I
后退
顶部