Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-82718
AndrewCh
2002-11-14 19:48
2002.11.25
Наиболее оптимальный поиск с заменой подстроки в файле


3-82669
Shadow
2002-11-06 17:20
2002.11.25
Сортировка. Быстрая сортировка


14-82976
Lony
2002-11-07 02:59
2002.11.25
Home Page


14-82970
XPOH
2002-11-04 12:02
2002.11.25
Формат *.dcu файла


1-82866
bondik
2002-11-14 15:57
2002.11.25
вопос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский