Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.25;
Скачать: CL | DM;

Вниз

Проблема с указателями на указатели   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
6-82908
Aralekin
2002-09-26 19:41
2002.11.25
Vot takoy voprosik u menya....


4-83072
Василий2
2002-10-14 12:50
2002.11.25
Как в консольной проге


14-82994
iZEN
2002-11-07 13:39
2002.11.25
Лёгкий Офис


6-82891
kostya2000
2002-09-16 23:48
2002.11.25
Люди кто знает где найти доку по сетям?


14-82957
Shadow
2002-11-05 17:11
2002.11.25
Какого хЋкcвЋрfsиhjf!,AЋ?.иH