Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
37 / 37 / 6
Регистрация: 17.04.2011
Сообщений: 418
1

Invalid pointer operation

16.10.2011, 17:33. Показов 2097. Ответов 1
Метки нет (Все метки)

Создал программу для поиска седловых точек в матрице (если элемент матрицы максимален в своей строке и минимален в своём столбце, или наоборот, то он седловой). Использовал одномерные динамические массивы - дело явно в них. В одномерные динамические массивы заносил минимальные и максимальные элементы строк и столбцов. Эта ошибка возникает время от времени, особенно, когда в программе меняешь размер стринггрида (двумерной матрицы), но при этом программа работает. Чтобы не создавать двумерный динамический массив, работал напрямую со стринггридом. (Статический не подойдёт, так как пользователь должен иметь возможность менять размер матрицы). Так как устранить эту ошибку, и что она вообще значит?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
procedure TForm1.Button5Click(Sender: TObject);
var
s:string;
i,j:integer;
Aminst,aminstr,amaxst,amaxstr: array of integer;
begin
setlength(aminst,stringgrid1.ColCount-2);
setlength(aminstr,stringgrid1.rowCount-2);
setlength(amaxst,stringgrid1.ColCount-2);
setlength(amaxstr,stringgrid1.rowCount-2);
// Вычисляем минимальные и максимальные элементы строк
for j:=0 to stringgrid1.rowCount-2 do begin
 Aminstr[j]:=strtoint(stringgrid1.cells[1,j+1]);
 Amaxstr[j]:=strtoint(stringgrid1.cells[1,j+1]);
  for i:=0 to stringgrid1.ColCount-2 do begin
   if strtoint(stringgrid1.cells[i+1,j+1])< Aminstr[j] then Aminstr[j]:=strtoint((stringgrid1.cells[i+1,j+1]));
   if strtoint(stringgrid1.cells[i+1,j+1])> Amaxstr[j] then Amaxstr[j]:=strtoint((stringgrid1.cells[i+1,j+1]));
end;
 end;
 for j:=0 to stringgrid1.rowCount-2 do stringgrid2.Cells[j+1,1]:=inttostr(Aminstr[j]);
 for j:=0 to stringgrid1.rowCount-2 do stringgrid2.Cells[j+1,2]:=inttostr(Amaxstr[j]);
 //  Вычисляем минимальные и максималные элементы столбцов
 for i:=0 to stringgrid1.colCount-2 do begin
 Aminst[i]:=strtoint(stringgrid1.cells[i+1,1]);
 Amaxst[i]:=strtoint(stringgrid1.cells[i+1,1]);
  for j:=0 to stringgrid1.rowcount-2 do begin
   if strtoint(stringgrid1.cells[i+1,j+1])< Aminst[i] then Aminst[i]:=strtoint((stringgrid1.cells[i+1,j+1]));
   if strtoint(stringgrid1.cells[i+1,j+1])> Amaxst[i] then Amaxst[i]:=strtoint((stringgrid1.cells[i+1,j+1]));
end;
 end;
 for i:=0 to stringgrid1.colCount-2 do stringgrid3.Cells[i+1,1]:=inttostr(Aminst[i]);
 for i:=0 to stringgrid1.colCount-2 do stringgrid3.Cells[i+1,2]:=inttostr(Amaxst[i]);
 
 for j:=0 to stringgrid1.rowCount-2 do
 for i:=0 to stringgrid1.colCount-2 do   // условия седловых точек
 if (((strtoint(stringgrid1.cells[i+1,j+1])=Aminstr[j]) and (strtoint(stringgrid1.cells[i+1,j+1])=Amaxst[i])) or ((strtoint(stringgrid1.cells[i+1,j+1])=Amaxstr[j]) and (strtoint(stringgrid1.cells[i+1,j+1])=Aminst[i]))) then s:=s+stringgrid1.cells[i+1,j+1]+' '+inttostr(j+1)+' строка '+inttostr(i+1)+' столбец '+#13;
 if s='' then showmessage('Нет седловых точек') else
showmessage('Седловые точки матрицы:'+#13+s);
 Aminst:=nil;
 aminstr:=nil;
 amaxst:=nil;
 amaxstr:=nil;
 
 end;
0
Заказывайте контрольные, курсовые и дипломы здесь.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2011, 17:33
Ответы с готовыми решениями:

invalid pointer operation
function MathFunc.MyMath(m:integer):integer; var i1,i,n,i2,i3:integer; b,g,a:mas;...

Invalid pointer operation
Доброго времени суток! Есть программа тестирования, которая работает с двумя типами вопросов : -...

Ошибка: Invalid pointer operation
procedure TForm1.Button2Click(Sender: TObject); var i, n : Integer; Point : array of...

Ошибка Invalid pointer operation
Type TICQContact = record uin: string; pwd: string; end; var Form2: TForm2;...

1
Модератор
63400 / 47085 / 32454
Регистрация: 18.05.2008
Сообщений: 114,133
16.10.2011, 17:45 2
Цитата Сообщение от Akmas Посмотреть сообщение
Использовал одномерные динамические массивы - дело явно в них. В одномерные динамические массивы заносил минимальные и максимальные элементы строк и столбцов.
...................... Чтобы не создавать двумерный динамический массив, работал напрямую со стринггридом.
Вот это все и зря. Создайте 1 динамический двумерный массив и все.
Грид используйте только для вывода. Одномерные массивы вообще не нужны.

Добавлено через 3 минуты
Или вот пример. Здесь грид используется для ввода матрицы.
Размер константой, но это без разницы, добавьте 2 SpinEdit для ввода размеров и все.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
 
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Label2: TLabel;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const n=3;
      m=3;
var
  Form1: TForm1;
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.RowCount:=n;
StringGrid1.ColCount:=m;
Showmessage('Введите в таблицу целые числа!');
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i,j,k,min,imin,jmax,t: integer;
    a:array[1..n,1..m] of integer;
begin
for i:=1 to n do
for k:=1 to m do
a[i,k]:=StrToInt(StringGrid1.Cells[k-1,i-1]);
imin:=0;
for i:=1 to n do
  begin
    Min:=a[i,1];
    for k:=1 to m do
    if a[i,k]<Min then Min:=a[i,k]; //находими минимальный в строке
    for k:=1 to m do
    if a[i,k]=min then //ищем все минимальные в этой строке
     begin
      t:=0;
      for j:=1 to n do
      if a[j,k]>min then t:=1; //и проверяем есть ли в столбце с ними элементы больше его
      if t=0 then //если нет
       begin
        jmax:=k;//то это индекс столбцаовой точки
        imin:=i; //индекс строки седловой точки
        Edit1.Text:='[ '+IntToStr(imin)+' , '+IntToStr(jmax)+' ]';//выводим
        exit; //больше не ищем, по условию одну нужно
        end;
      end;
   end;
if imin=0 then  Edit1.Text:='Седловых точек нет!'; //если не нашли ни одной
end;
 
end.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2011, 17:45

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Ошибка: invalid pointer operation
Привет не могу вытащить настройки CheckBox1 из ini файла если CheckBox1.Checked:=true то выдает ...

Ошибка: Invalid pointer operation
Здравствуйте. Пытаюсь вставить картинку в программу через компонент Image. После вставки, при...

Ошибка : Invalid pointer operation
При работе программы возникает данная ошибка ! Возможно она появляется при создании массива вот...

Ошибка: Invalid pointer operation
Не подскажете как исправить ошибку при вычислении второй функции т.е У вылезает окно &quot;Invalid...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.