Консультация № 167199
13.05.2009, 17:05
0.00 руб.
0 7 0
Здравствуйте уважаемые эксперты! Подскажите пожалуйста возможно ли осуществить прямое обращение к полям записи через указатель. Допустим:
[font=courier new][/font]
type
TZapis=record
x0, y0, x1, y1:double;
end;
var
Zapis:Array [0..100] of TZapis;
...
// Заполняем массив
...
Zapis [0].x0:=70.5;
Zapis [0].y0:=0.5;
Zapis [0].x1:=1.5;
Zapis [0].y2:=7.5;
...
procedure ;
var
a,b:double;
begin
a:=@Zapis //////////-------------- Вот здесь и не понятно как вытащить значение поля н.п. "x0" из массива "Zapis" и присвоить его переменной "а"
end;
[font=Arial][/font]
Может это бред, или всетаки такое возможно.
Заранее благодарен

Обсуждение

давно
Мастер-Эксперт
425
4118
13.05.2009, 17:42
общий
Тимур
Не совсем понятно, что Вы имеете в виду и что вообще делаете. @ - это получение адреса переменной.
Никаких указателей у Вас нет. Поясните более подробно, что Вы хотите сделать.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
14.05.2009, 09:51
общий
Может имеется ввиду что-то типа такого (получение значения поля для элемента с индексом Index):

a := TZapis(Pointer(Integer(@Zapis) + Index * Sizeof(TZapis))^).x0;
давно
Мастер-Эксперт
425
4118
14.05.2009, 10:36
общий
PavelGM
a := TZapis(Pointer(Integer(@Zapis) + Index * Sizeof(TZapis))^).x0;

А не слишком ли сложно? По-моему значение можно получить гораздо проще.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
14.05.2009, 11:05
общий
sir Henry подскажите, как проще?
давно
Мастер-Эксперт
425
4118
14.05.2009, 11:22
общий
Тимур
Вы сначала толком скажите, что Вы хотите сделать. Потому что из того что Вы уже написали, я смысл, сколько ни ищу, найти не могу. То что Вы хотите, в армии называется "одевать сапог через голову". Напишите, как можно более подробно, что именно Вы хотите сделать или получить.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
14.05.2009, 11:29
общий
Правильнее для начала было разъяснить суть задачи. Допустим, есть запись с полями содержащими координаты точек (х0,y0 и т.д.), и есть массив содержащий эти записи - Zapis[...] .
Задача передать в проседуру этот массив (по аналогии с функцией openGL glColor3dv (@Array:Pointer) где Array=Array[0,0,0] of double)

Это как реализовано сейчас -
procedure Line (x0,y0,x1,y1)
begin
glBegin(GL_LINE)
glVertex2d(x0,y0);
glVertex2d(x1,y1);
glEnd;
end;

Хотелось бы передавать процедуре не 4 точки, а массив этих точек. Вся сложность для меня заключается в том, что нужно выделять из массива по одной точке, если применять не

glVertex2d(x0,y0); , а glVertex2dv(@Array);

давно
Мастер-Эксперт
425
4118
14.05.2009, 14:43
общий
Ага! Вот теперь всё совершенно понятно.
Можно объявить тип-массив и передавать переменную этого типа в процедуру:
Код:
type
TZapis=record
x0, y0, x1, y1:double;
end;

TArrayZapis:Array[0..100] of TZapis;

Procedure ArrayOfLine(arrLine: TArrayZapis);
Var
i: Integer;
Begin
For i:=0 To High(arrLine)-1 Do
Begin
arrLine[i].x0:=Значение;
arrLine[i].y0:=Значение;
arrLine[i].x1:=Значение;
arrLine[i].y1:=Значение;
End;

End;

Примечание. Если массив будет использоваться только в этой процедуре, то объявление процедуры так и оставить. Если же, к примеру, массив в этой процедуре только заполняется, а используется где-то в другом месте, то параметр нужно предварить волшебным словом var:
Код:
Procedure ArrayOfLine(var arrLine: TArrayZapis);
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Форма ответа