Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.07.2010, 23:07
Fazotron Fazotron вне форума
Прохожий
 
Регистрация: 26.10.2009
Сообщения: 38
Репутация: 10
По умолчанию Двумерный массив

Код:
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  
Старый 12.07.2010, 23:44
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,098
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

На какой строке? Тут телепатов нет...
Ответить с цитированием
  #3  
Старый 13.07.2010, 00:09
Fazotron Fazotron вне форума
Прохожий
 
Регистрация: 26.10.2009
Сообщения: 38
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
На какой строке? Тут телепатов нет...
Код:
c[i,j]:=a[i+1]*b[j+1];
тут кажется проблема
Ответить с цитированием
  #4  
Старый 13.07.2010, 00:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,098
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ага, понятно.
Дело в том, что индексация динамических массивов начинается с 0. Ты просто вылетаешь за границу массива и попадаешь в защищенную облась. Если включишь в компиляторе нужную проверку,то будешь получать ошибку Out of bounds. Используй при навигации по динамическим (да лучше всего по любым) массивам функции Low() и High() (в смысле для определения их границ).
Ответить с цитированием
  #5  
Старый 18.07.2010, 17:48
Fazotron Fazotron вне форума
Прохожий
 
Регистрация: 26.10.2009
Сообщения: 38
Репутация: 10
По умолчанию

А в двумерных динамических тоже с 0?
Ответить с цитированием
  #6  
Старый 18.07.2010, 18:04
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от Fazotron
А в двумерных динамических тоже с 0?
да, только в pchar (String) текст идёт от 1, но 0 всё же используется
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #7  
Старый 18.07.2010, 18:10
Fazotron Fazotron вне форума
Прохожий
 
Регистрация: 26.10.2009
Сообщения: 38
Репутация: 10
По умолчанию

Цитата:
Сообщение от AleD
да, только в pchar (String) текст идёт от 1, но 0 всё же используется
у меня массивы действительных чисел

сделал так:

Код:
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  
Старый 18.07.2010, 22:56
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Надо посмотреть в отладчике, что передается в функцию: strtofloat().
Может быть это не число (например, есть пробелы).
Ответить с цитированием
  #9  
Старый 18.07.2010, 23:52
Fazotron Fazotron вне форума
Прохожий
 
Регистрация: 26.10.2009
Сообщения: 38
Репутация: 10
По умолчанию

да не, там числа передаются
с границами чет не так, только не пойму что

вот так сделал например
Код:
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  
Старый 19.07.2010, 00:22
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Думаю нужно так:
Код:
...
 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  
Старый 19.07.2010, 10:13
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Цитата:
Сообщение от Fazotron
да не, там числа передаются
с границами чет не так...

Может быть надо переменные объявить не real, а extended.
И, кроме этого, надо проверить, какой разделитель целой и дробной части числа установлен в системе.
Точна или запятая. И сравнить свое строковое представление чисел.
Ответить с цитированием
  #12  
Старый 19.07.2010, 16:46
Fazotron Fazotron вне форума
Прохожий
 
Регистрация: 26.10.2009
Сообщения: 38
Репутация: 10
По умолчанию

Drozh, спасибо , работает
Ответить с цитированием
  #13  
Старый 19.07.2010, 18:23
Fazotron Fazotron вне форума
Прохожий
 
Регистрация: 26.10.2009
Сообщения: 38
Репутация: 10
По умолчанию

Код:
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 в красной строке.
в чем может быть проблема?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:17.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025