Указатели в Паскале
Если:
я создаю запись
x:integer;
y:integer;
i:integer;
Всем заранее спасибо!
Инкремент до места назначения -- и есть адекватный способ работы с указателями в TP, если включен расширенный синтаксис флагом {$X+} или в настройках компиляции.
Psome_type=^some_type; { ваше определение }
var
ArrayItem: Psome_type;
begin
Inc(ArrayItem, 5); { передвигает указатель вперед на 5 some_type-ов }
end;
Я примерно так себе это представляю:
typedef struct{
int x;
int y;
} arr;
//----------------//
//GetMem()
arr* pArr=(arr*)malloc(10*sizeof(arr));
//Этого мне не хватает. Хотя бы одного из вариантов.
(pArr+3)->x=5;
int xx=(*(arr*)(pArr+3)).x;
Не знаю для чего умножать на 10?
Выделить память
Адрес в памяти можно узнать с помощи оператора @ or функция Addr.
P :=@arr;
p/s типа от маски
Всё выше сказанное относится к Turbo Pascal 7.0 1992 года.
Не знаю для чего умножать на 10?
Адрес в памяти можно узнать с помощи оператора @ or функция Addr.
Умножать на десять затем, что это массив элементов типа some_type, причем в недрах программы это будет не константа.
Как получить адрес я знаю. Я не знаю, как получить адрес i-го элемента либо сам его, то бишь arr[ i ] либо (arr+i)^.
Либо я чего-то не понимаю. Может быть эти массивы делаются еще как-то, чтобы с ними по-людски работать, хотя обидно, если так, потому что я уже реализовал все боксингом/анбоксингом того времени как Вы и написали через pointer.
arr : array of some_type; {динамический массив записей}
arr10 : array [0..9] of some_type; {статический массив записей}
arr_p : array of Psome_type; {динамический массив указателей на записи}
arr10_p : array [0..9] of Psome_type; {статический массив указателей на записи}
i : Integer;
begin
SetLength(arr, 10);
for i := 0 to Length(arr) - 1 do
begin
arr[i].x := i;
arr[i].y := i;
end;
for i := Low(arr10) to High(arr10) do
begin
arr10[i].x := i;
arr10[i].y := i;
end;
end;
arr : array of some_type; {динамический массив записей}
[/code]
Это не работает в TP 7.0
TDynArr = array [1..$FFFF div SizeOf(some_type)] of some_type;
PDynArr = ^TDynArr;
var
myarr : PDynArr;
i, Count, Size : Integer;
begin
Count := 10;
Size := SizeOf(some_type) * Count;
GetMem(myarr, Size);
for i := 1 to Count do
begin
myarr^[i].x := i;
myarr^[i].y := -i;
end;
FreeMem(myarr, Size);
end;
type
TDynArr = array [1..1] of some_type;
PDynArr = ^TDynArr;
var
myarr : PDynArr;
i, Count, Size : Integer;
begin
Count := 10;
Size := SizeOf(some_type) * Count;
GetMem(myarr, Size);
for i := 1 to Count do
begin
myarr^[i].x := i;
myarr^[i].y := -i;
end;
FreeMem(myarr, Size);
end;
Инкремент до места назначения -- и есть адекватный способ работы с указателями в TP, если включен расширенный синтаксис флагом {$X+} или в настройках компиляции.
{$X+} не включал, и так все работает. Мне на RSDN тоже сказали что-то в этом духе, я не поверил. Раньше догадывался, теперь точно знаю - говененький язык этот Паскаль:)
Спасибо за помощь!
И зачем это делать:
Если проследить хронологию Ваших вопроса и ответов, то не очень ясно, что Вам нужно:
Что Вам нужно получить адрес массива or массива объектов?
P :=@arr[i];
{Вы получите два hex слова BA:BS. BA-сегментный адрес,BS-смещение.}
{~567:~096 не помню может быть знак $ | $567:$096}
Объект в TP 7.0 это типа Класса. Можно порождать, а вот создать массив объектов не знаю.
Да и мы через 25 годов то будем говененьки, если будем.
p/s Вы лучше показали массив в реальном коде, а не бестолковые куски кода.
Ну решено так решено.
• Вы знаете, я к C# так же отношусь примерно. Читаешь книжку про C#, потом про Java. И дежавю постоянно. Единственное, что радует, так это WFP. Так что не думаю, что в возрасте дело. Просто строгая типизация и корявая работа с динамической памятью, хотя во Free Pascal все работает вполне удобно.
• Получать указатель на элемент через нетипизированный указатель я, насколько я понимаю, должен буду путем калькуляций при каждом обращении к массиву, а у меня предполагаются тысячи и тысячи итераций в программе, и злой препод скажет мне "а какого это черта ты сюда написал калькуляции? иди переделывай!", хотя сам он на мой вопрос не ответил:)
• Адрес массива мне не нужен, ибо указатель суть адрес. Мне нужен(был) i-й элемент без лишних действий. Как в Си. Выделил память и обращаешься по индексу.
• Я счел вопрос решенным. т.к. реализовал все через инкремент, хотя и выглядит это коряво.
Всем спасибо!