Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2012, 16:22   #1
steeledguy
 
Регистрация: 18.11.2011
Сообщений: 6
По умолчанию Динамическая память и двумерный массив

Здравствуйте. Не могу выделить динамическую память под свою программу (два двумерных массива)
Вот код программы
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
StringGrid1: TStringGrid;
Button2: TButton;
StringGrid2: TStringGrid;
btn1: TBitBtn;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMatr = array[1..1] Of Extended;
mas1=^TMatr;
SMas= array[1..1] of mas1;
mas2=^SMas;
var
Form1: TForm1;
A:mas2;
B:mas2;
n,m,i,j:Byte;
x,r:integer;
max,min: extended;
implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
N:=3;
M:=3;
edit1.text:= floattostr(n);
edit2.text:= floattostr(m);
stringGrid1.rowcount:=n+1;
stringGrid1.colcount:=m+1;
stringGrid2.rowcount:=n+1;
stringGrid2.colcount:=2;
stringgrid1.cells[0,0]:='Ìàññèâ À:';
stringgrid2.cells[0,0]:='Ìàññèâ Á';
for i:=1 to n do begin
stringgrid1.Cells[0,i]:='i='+inttostr(i);
stringgrid1.Cells[i,0]:='j='+inttostr(i);
stringgrid2.Cells[0,i]:='i='+inttostr(i);
end;
for i:=1 to m do begin
stringgrid2.Cells[i,0]:='j='+inttostr(i);
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin

n:=strtoint(edit1.text);
m:=strtoint(edit2.text);
If (n=0) or (n>10) Then begin
ShowMessage('Íåïðàâèëüíûé ðàçìåð ìàññèâà');
Exit;
end;
If (m=0) or (n>10) Then begin
ShowMessage('Íåïðàâèëüíûé ðàçìåð ìàññèâà');
Exit;
end;


stringGrid1.rowcount:=n+1;
stringGrid1.colcount:=m+1;
stringGrid2.rowcount:=n+1;
stringGrid2.colcount:=2;

for i:=1 to n do stringgrid1.cells[0,i]:='i='+inttostr(i);
for i:=1 to m do stringgrid1.cells[i,0]:='j='+inttostr(i);
for i:=1 to n do stringgrid2.cells[0,i]:='j='+inttostr(i);

end;


procedure TForm1.Button2Click(Sender: TObject);

begin
try
GetMem(A,m*SizeOf(Pointer));
for i:=1 to m do
GetMem(A^[i],n*SizeOf(Extended));
GetMem(b,m*SizeOf(Pointer));
for i:=1 to m do
GetMem(b^[i],n*SizeOf(Extended));
for i:=1 to n do begin
for j:=1 to m do begin
a^[i]^[j]:=strtofloat(stringgrid1.cells[j,i]);
end;
end;

for i:=1 to n do begin
b^[i]^[j]:=0;
end;

for i:=1 to n do begin
x:=0;
for j:=1 to (m div 2) do begin
if (a^[i]^[j]<>a[i,m-j+1]) then begin x:=1;
end;
end;
if (x=0) then b^[i]^[j]:=1;
end;


for i:=1 to m do begin
StringGrid2.Cells[1,i]:=FloatToStr(b^[i]^[j]);
end;


except
on ERangeError do begin showmessage('Âûõîä çà ïðåäåëû ìàññèâà. Óìåíèøüòå ðàçìåð ìàññèâà');
Exit;
end;
on EConvertError do begin showmessage(' ÿ÷åéêå îòñóòñâóåò çíà÷åíèå ëèáî ÷èñëî ââåäåíî íåâåðíî');
Exit;
end;
end;
for i:=1 to m do
FreeMem(A^[i],n*sizeof(Extended));
FreeMem(A,m*Sizeof(Pointer));

for i:=1 to m do
FreeMem(B^[i],n*sizeof(Extended));
FreeMem(B,m*Sizeof(Pointer));


end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
begin
If not (Key in ['0'..'9',Chr(VK_BACK)]) then
key:=#0;
end;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
begin
If not (Key in ['0'..'9',Chr(VK_BACK)]) then
key:=#0;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
for j:=1 to n do
Stringgrid1.cells[j,m+1]:='';
Randomize;
for i:=1 to n do
for j:=1 to m do begin
r:=Random(10);
StringGrid1.Cells[i,j]:=IntToStr(r);
end;
for j:=1 to m+1 Do
for i:=1 to n Do
Stringgrid2.cells[i,j]:='';
end;

end.
steeledguy вне форума Ответить с цитированием
Старый 15.01.2012, 16:27   #2
steeledguy
 
Регистрация: 18.11.2011
Сообщений: 6
По умолчанию

насколько я понимаю ошибка где-то в задании указателя (После "type").
steeledguy вне форума Ответить с цитированием
Старый 15.01.2012, 17:29   #3
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

используйте динамические массивы ...
Код:
var A,B: array of array of extended;
...
SetLength(A,n,m);
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 16.01.2012, 16:08   #4
steeledguy
 
Регистрация: 18.11.2011
Сообщений: 6
По умолчанию

я уже пробовал оформлять через setlenght , но преподаватель говорит , что такому нас не учил и что все должны оформлять через GetMem и указатели. Мне бы найти ошибку в ЭТОМ коде. Но все-равно спасибо... Буду дальше разбираться..
steeledguy вне форума Ответить с цитированием
Старый 16.01.2012, 17:21   #5
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

просмотрел только Button2Click - вы просто запутались в размерностях ...
Код:
GetMem(A,m*SizeOf(Pointer)); //размерность от 1 до m
 for i:=1 to m do
 GetMem(A^[i],n*SizeOf(Extended)); // и второй размерностью от 1 до n
...
 for i:=1 to n do begin // первая размерность до n
 for j:=1 to m do begin  // вторая размерность до m
 a^[i]^[j]:=strtofloat(stringgrid1.cells[j,i]);
 end;
 end;
ну и дальше
Код:
for i:=1 to n do begin
 b^[i]^[j]:=0; // какое значение имеет J ?
 end;
...
for i:=1 to m do begin
 StringGrid2.Cells[1,i]:=FloatToStr(b^[i]^[j]); // какое значение имеет J ?
 end;
... отладка в пошаговом режиме - вещь сильная
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 19.01.2012, 00:03   #6
steeledguy
 
Регистрация: 18.11.2011
Сообщений: 6
По умолчанию

хммм( не совсем понятно. Осмелюсь спросить : А можно готовый вариант уже? я просто совсем уж никак не врубаюсь, что тут делать.
steeledguy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая память vladxxl Общие вопросы C/C++ 0 25.04.2011 20:04
Клаасы, массив, динамическая память vladxxl Общие вопросы C/C++ 1 23.03.2011 23:19
Динамическая память I.C.E Общие вопросы C/C++ 15 16.01.2011 19:27
Динамическая память zhenya.ya Помощь студентам 1 22.09.2010 08:43
динамическая память aka_faith Общие вопросы C/C++ 47 12.06.2009 12:35