Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Pointer [D5, Win2k]


nimble ©   (2002-06-24 06:30:00) 

Вот есть указатель на динамический массив, как используя этот указатель пробежать по всему массиву?


msts   (2002-06-24 09:38:00) [1]

Использование поинтеров:
INC(A,20) - переместить указатель A на 20 "размеров указателя" - "вперед".

DEC(A,20) - переместить указатель A на 20 "размеров указателя" - "назад".

INC(A) равноценен INC(A,1)
DEC(A) равноценен DEC(A,1)

"размер указателя" - это сколько байтов памяти занимает переменная указанного типа (на которую указывает указатель :) ) - соответственно на сколько минимум он будет перемещен
в данном случае SizeOf(main)

не помню на сколько будет перемещатся Pointer, проверь

пример :

TOne = record
item : integer
end;

POne = ^TOne; указатель на TOne

a : array of TOne;
p : POne;

p1 : POne absolute a; указывает на первый элемент масива "сразу"
неуверен будет ли работать с динамичесим массивом



p:=@a

p - указывает на первый эл.
inc(P)
p - указывает на второй эл.
















nimble   (2002-06-24 07:58:00) [2]

С самого начала! Есть два динамических массива, которые представляют собой следующую запись:
main = record
i: integer;
s: string;
f: Float;
...
mas1 = array of record;
i1: integer;
f1: float
end;
mas2 = array of record
i2: integer;
f2: float;
s2: string;
end;
и еще 3 таких же массива похожей конструкции.
end;

Далее в var

BufArray: array of main;
SQLArray,TXTArray: BufArray;

Первый массив черпает данные из базы, второй из текстовиков.
Задача: нужно сравнить эти дав массива (SQLArray,TXTArray) и разницу куда-нибудь вывести.
А дальше пошел тупняк.
Имеется процедурка->
procedure CheckArrays(SQL,TXT: BufArray; PosInSQL,PosInTXT: Integer; Param: byte);
begin
if param =1 then
сравниваем mas 1;
if param = 2 then
сравниваем mas 2;
И так далее...
end;

Работать работает, но все это примитивно! Вот и подумалось про указатели. Структура внутренних массивов примерно одинаковая, может чего и вышло бы :(


MBo   (2002-06-24 07:32:00) [3]

здесь пиши, может еще кто разберется


nimble   (2002-06-24 07:31:00) [4]

Мыло есть?


MBo   (2002-06-24 07:22:00) [5]

ничего не понял, приведи полное объявление типов и переменных


nimble   (2002-06-24 07:06:00) [6]

Скорее всего вопрос посавил не точно! Вот смотри у меня есть такая запись:
main = record
...
...
w = array of record
a: integer;
b: float;
end;
p_w: PChar; // типа указатель на массив W
...
...
ww = array of record
a: integer;
b: float;
s: String;
...
end;
p_ww: PChar; // типа указатель на массив Ww
А дальше, когда заполняю записи и массивы пишу -
p_w:=@Mas[i].w;
...
p_ww:=@Mas[i].ww;
mas - это динамический масив состоящий из main record;

Если есть идеи, то поделись плииииз!!!!


MBo   (2002-06-24 06:48:00) [7]

можно и так

p:=a;

a:=p;

for i:=0 to high(a) do ...


MBo   (2002-06-24 06:47:00) [8]

переменная типа динамический массив как раз и есть указатель на первый (с нулевым индексом) элемент.

вот один из методов доступа

procedure TForm1.Button1Click(Sender: TObject);
type aint=array of integer;
var a:array of integer;
p:pointer;
i:integer;
begin
setlength(a,5);
p:=@a[0];// у тебя, очевидно, указатель каким-то другим способом получен
// или просто p:=a;
for i:=0 to high(aint(p)) do
aint(p)[i]:=i;
caption:=inttostr(aint(p)[2]);
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо