![]() |
|
|
#1
|
|||
|
|||
|
Код:
procedure TForm1.Button1Click(Sender: TObject); var i,j: integer; l1,l2:integer; a:array of real; b:array of real; c:array of array of real; begin l1:=Memo1.Lines.Count; l2:=Memo2.Lines.Count; setlength(a,l1); setlength(b,l2); setlength(c,l1,l2); For i:= 1 to l1 do begin a[i]:= strtofloat(Memo1.Lines[i-1]); end; For j:= 1 to l2 do begin b[j]:= strtofloat(Memo2.Lines[j-1]); end; For i:= 0 to (l1-1) do begin For j:= 0 to (l2-1) do begin c[i,j]:=a[i+1]*b[j+1]; end; end; Почему у меня вылетает ошибка Invalid pointer operation? |
|
#2
|
|||
|
|||
|
На какой строке? Тут телепатов нет...
|
|
#3
|
|||
|
|||
|
Цитата:
Код:
c[i,j]:=a[i+1]*b[j+1]; |
|
#4
|
|||
|
|||
|
Ага, понятно.
Дело в том, что индексация динамических массивов начинается с 0. Ты просто вылетаешь за границу массива и попадаешь в защищенную облась. Если включишь в компиляторе нужную проверку,то будешь получать ошибку Out of bounds. Используй при навигации по динамическим (да лучше всего по любым) массивам функции Low() и High() (в смысле для определения их границ). |
|
#5
|
|||
|
|||
|
А в двумерных динамических тоже с 0?
|
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
|||
|
|||
|
Цитата:
сделал так: Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,j,f,k: integer;
e:real;
l1,l2:integer;
a:array of real;
b:array of real;
c:array of array of real;
begin
l1:=Memo1.Lines.Count;
l2:=Memo2.Lines.Count;
SetLength(a,l1);
SetLength(b,l2);
Setlength(c, l1,l2);
For i:= Low(a) to High(a) do
begin
a[i]:= strtofloat(Memo1.Lines[i-1]);
end;
For j:= Low(b) to High(b) do
begin
b[j]:= strtofloat(Memo2.Lines[j-1]);
end;
For i:= Low(a) to High(a) do
begin
For j:= Low(b) to High(b) do
begin
c[i,j]:=a[i]*b[j];
end;
end;
For i:= Low(a) to High(a) do
begin
For j:= Low(b) to Low(b) do
begin
stringGrid1.Cells[i,j]:=floatToStr(c[i,j]);
end;
end;
end;но вылетает на end; с ошибкой "Project1.exe raised exception class EConvertError with message "" is not a valid floating point value'. Process stopped. Use Run or Step to continue." Последний раз редактировалось Fazotron, 18.07.2010 в 18:18. |
|
#8
|
|||
|
|||
|
Надо посмотреть в отладчике, что передается в функцию: strtofloat().
Может быть это не число (например, есть пробелы). |
|
#9
|
|||
|
|||
|
да не, там числа передаются
с границами чет не так, только не пойму что вот так сделал например Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,j,f,k: integer;
e:real;
l1,l2:integer;
a:array of real;
b:array of real;
c:array of array of real;
d:array of real;
begin
l1:=Memo1.Lines.Count;
l2:=Memo2.Lines.Count;
SetLength(a,l1);
SetLength(b,l2);
Setlength(c, l1,l2);
For i:= 1 to (l1-1) do
begin
a[i]:= strtofloat(Memo1.Lines[i-1]);
end;
For i:= 1 to l1 do
begin
Memo3.Lines.Add(floattostr(a[i]));
end;
end;ввел числа 1 2 1 но массив странный получился, последнее число непонятное Код:
1 2 2,05567408571617E-307 Последний раз редактировалось Fazotron, 18.07.2010 в 23:57. |
|
#10
|
|||
|
|||
|
Думаю нужно так:
Код:
... for i := 0 to l1-1 do a[i]:= StrToFloat(Memo1.Lines[i]); for i := 0 to l1-1 do Memo3.Lines.Add(FloatToStr(a[i])); |
|
#11
|
|||
|
|||
|
Цитата:
Может быть надо переменные объявить не real, а extended. И, кроме этого, надо проверить, какой разделитель целой и дробной части числа установлен в системе. Точна или запятая. И сравнить свое строковое представление чисел. |
|
#12
|
|||
|
|||
|
Drozh, спасибо , работает
|
|
#13
|
|||
|
|||
|
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,j,f,k: integer;
e:real;
l1,l2:integer;
a:array of real;
b:array of real;
c:array of array of real;
d:array of real;
begin
l1:=Memo1.Lines.Count;
l2:=Memo2.Lines.Count;
SetLength(a,l1);
SetLength(b,l2);
Setlength(c, l1,l2);
SetLength(d, (l1+l2-1));
for i := 0 to l1-1 do
a[i]:= StrToFloat(Memo1.Lines[i]);
for j := 0 to l2-1 do
begin
b[j]:= strtofloat(Memo2.Lines[j]);
end;
for i := 0 to l1-1 do
begin
for j := 0 to l2-1 do
begin
c[i,j]:=a[i]*b[j];
end;
end;
for i := 0 to l1-1 do
begin
for j := 0 to l2-1 do
begin
stringGrid1.Cells[i,j]:=floatToStr(c[i,j]);
end;
end;
d[1]:=c[1,1];
f:=3;
e:=0;
For k:=2 to (l1+l2) do
begin
for i := 1 to l1 do
begin
for j := 1 to l2 do
begin
if (j+i)=f then
e:=e + c[i,j];
end;
end;
d[k]:=e;
e:=0;
f:=f+1;
end;
for j := 0 to High(d) do
begin
Memo3.Lines.Add(floattostr(d[j]));
end;
end;выдает ошибку Acsess Violation в красной строке. в чем может быть проблема? |