Форум: "Основная";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
ВнизПроблема с указателями на указатели Найти похожие ветки
← →
Misha (2002-11-11 12:30) [0]В данной программе нужно быстро поменять содержимое одного
массива на соодержимое другого, они у меня представляют строки
матрицы. Можно ли просто присвить указатель на первую строку
указателю на вторую и наоборот. Я так делал, но при выводе результатов в ListBox происходит ошибка. Посоветуйте как решить данную проблему
unit Mem;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
Const MaxExt = (High(Cardinal) - $F) div sqr(sizeof(extended));
N_S=(High(Cardinal)div High(Integer));
Type
TEArray = array[1..MaxExt] of extended;
PEArray = ^TEArray;
TSArray =array[1..N_S] of ^TEArray;
PMArray=^TSArray;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);//выделение памяти под матрицу состояний
Var Pt:PEArray;
PM:PMArray;
i,j,n,m,k:cardinal;
Sw:PMArray;
f:extended;
begin
n:=10;
m:=n*Sizeof(PEArray);
GetMem(PM,m);//n*Sizeof(PEArray));
Form1.Caption:=IntToStr(m);
Randomize;
ListBox1.Clear;
m:=0;
if (PM=Nil)then ShowMessage("Не выделена память")
else
Begin
For i:=1 to n do
Begin
k:=5;
//k:=round(5*Random)+1;
GetMem(PM[i],k*Sizeof(Extended));
For j:=1 to k do
Begin
PM^[i,j]:=round(1000*Random);
ListBox1.Items.Add("A["+IntToStr(i)+"]["+ IntToStr(j)+ "]="+
FloatToStr(PM^[i,j]));
m:=m+1;
end;
end;
FreeMem(PM,n*Sizeof(PEArray));//?????
ListBox1.Items.Add("Всего: "+IntToStr(m));
end;
GetMem(Sw,Sizeof(PEArray));
GetMem(Sw[1],k*Sizeof(Extended));
Sw[1]:=PM[1];
PM[1]:=PM[2];
PM[2]:=Sw[1];
For i:=1 to k do ListBox1.Items.Add("A[1<-2"+IntToStr(1)+"]["+ IntToStr(i)+ "]="+
FloatToStr(PM^[1,i]));
//здесь выдаёт ошибку во время выполнения
end;
end.
← →
Skier (2002-11-11 12:37) [1]>Misha
For i:=1 to k do ListBox1.Items.Add("A[1<-2"+IntToStr(1)+"]["+ IntToStr(i)+ "]=" + FloatToStr(PM^[1]^[i])); ?
← →
Misha (2002-11-11 12:48) [2]Я попробовал так, но он всёравно выдаёт ошибку
← →
Skier (2002-11-11 12:55) [3]>Misha
Проверяй выделение памяти и индексы...
← →
mmb1 (2002-11-11 13:01) [4]Воспользуйся
array of array of extended
и SetLength
намного проще в написании и есть проверка выхода за пределы
← →
Misha (2002-11-11 13:08) [5]Но мене важно сделать именно через указатели
← →
icWasya (2002-11-11 13:52) [6]а что имелось ввиду
GetMem(Sw[1],k*Sizeof(Extended));
Sw[1]:=PM[1];
← →
Misha (2002-11-11 16:17) [7]Выделение памяти под промежуточный указатель на указатели Sw
← →
Misha (2002-11-11 19:31) [8]Иначе, если я этого не напишу GetMem(Sw[1],k*Sizeof(Extended));
Sw[1]:=PM[1];то тогда приложение вообще не откомпилируется
← →
icWasya (2002-11-12 09:28) [9]{1} GetMem(Sw[1],k*Sizeof(Extended));
(* выделение k*Sizeof(Extended) байт и поместить указатель
в Sw[1]
*)
{2} Sw[1]:=PM[1];
(*
забыть, что было записано в Sw[1] и поместить туда
то, что было записано в PM[1]
*)
(* кроме того, пятью строчками выше написано *)
{3} FreeMem(PM,n*Sizeof(PEArray));//?????
(* то есть вообще стереть массив PM*)
повторяю вопрос - что имелось ввиду
← →
Misha (2002-11-14 10:18) [10]Спасибо, icWasya, ты всё правмльно понял и нащёл то место
{3} FreeMem(PM,n*Sizeof(PEArray));//?????
(* то есть вообще стереть массив PM*),про котое я забыл.
Терерь всё работает.Ещё раз спасибо!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c