![]() |
|
#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
|
||||
|
||||
![]() Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#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 в красной строке. в чем может быть проблема? |