![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как упростить конструкцию Smallint(Pointer(@apeaks[i, 0])^) ? [D7, WinXP]
Dr.Andrew © (2009-05-31 13:24:00)Добрый день!
Как можно упростить данный код (конструкции типа Smallint(Pointer(@apeaks[i, 0])^) и PSmallInt(@apeaks[i, 1])^) без изменения объявления глобальных переменных (массава apeaks : array of array of ^SmallInt)? И, пожалуйста объясните смысл этих конструкций (Smallint(Pointer(@apeaks[i, 0])^) и PSmallInt(@apeaks[i, 1])^).
procedure TForm1.Button1Click(Sender: TObject);
var i : Integer;
begin
Memo1.Lines.Clear;
SetLength(apeaks, 0, 0);
for i := 0 to 9 do
begin
SetLength(apeaks, i+1, 2);
Smallint(Pointer(@apeaks[i, 0])^) := i - RandomRange(0, 32768);
Smallint(Pointer(@apeaks[i, 1])^) := i - RandomRange(0, 32768);
Memo1.Lines.Add(Format('%d. %d : %d; %d : %d', [i, b, c, SmallInt(Pointer(@apeaks[i, 0])^), PSmallInt(@apeaks[i, 1])^]));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i : Integer;
begin
Memo2.Lines.Clear;
for i := 0 to High(apeaks) do
begin
Memo2.Lines.Add(Format('%d. %d : %d', [i, SmallInt(Pointer(@apeaks[i, 0])^), SmallInt(@(apeaks[i, 1])^)])); //PSmallInt(@apeaks[i, 1])^]));
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.Clear;
Memo2.Lines.Clear;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetLength(apeaks, 0, 0);
end;
Спасибо!
Дмитрий Белькевич (2009-06-01 00:23:00) [1]Неясна логика программы. Зачем в ней вообще какие-то указатели? Почему просто не массивами SmallInt обойтись?
Dr.Andrew (2009-05-31 18:43:00) [2]Всем спасибо за помощь.
sniknik (2009-05-31 17:22:00) [3]хотя, конечно, если тема курсовой "указатели" и он думает, что так он с ними работает, то непременно надо изучать.
sniknik (2009-05-31 17:21:00) [4]он не использует тут указатели... все что тут с ними связано это только видимость, он просто в переменную указателя пишет значение смолинта... такой своеобразный самообман. но собственно указателей, и работы с ними нет.
сделать так
apeaks : array of array of integer;
и так
apeaks[i, 0]:= Smallint(i - RandomRange(0, 32768));
и будет то же самое. (по структуре/значениям в массиве)
(приведение к смолинт тут только для "обрезки" старших байт, т.к. вычисляемое значение, вычисляется "криво" и может переваливать за значение смолинта. да и вообще все тут криво, зачем то установка размера массива на каждую итерацию, и тип в массиве заведомо больший чем предполагается хранить, жуткие присвоения через несколько приведений типа... похоже все специально чтобы запутать читающего код. больше в них смысла нет)
Palladin (2009-05-31 16:45:00) [5]Изучай тему типизированных и нетипизированных указателей.
Palladin (2009-05-31 16:45:00) [6]И вообще - указателей, тоже.
Dr.Andrew (2009-05-31 13:28:00) [7]Небольшое дополнение к предыдущему коду:
вначале кода нужно добавить:
var
Form1: TForm1;
apeaks : array of array of ^SmallInt;
implementation
uses Math;
{$R *.dfm}
Спасибо!
Dr.Andrew (2009-05-31 13:28:00) [8]Удалено модератором