![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатель на Array [D7, XP]
rammic © (2011-08-14 15:50:00)Со смирением прошу ответить. Как в Delphi указатель на Array of Real
переводится на заданный элемент массива. Если в С++ это получается
если написать р[i] то в Delphi 1й элемент он показывает а любой другой
не хочет.
Юрий Зотов (2011-08-16 00:28:00) [41]
> Германн © (16.08.11 00:20) [48]
> Но это совсем не та арифметика, которая в Си.
Адресная арифметика - она одна и от языка не зависит. Разный только синтаксис.
Юрий Зотов (2011-08-16 00:26:00) [42]> Германн © (16.08.11 00:12) [47]
Inc - увеличивает указатель на размер адресуемого им типа данных, умноженный на второй аргумент.
Dec - уменьшает на ту же величину.
Например:
var
P: PInteger;
D: integer;
begin
D := 1;
P := @D;
Inc(P, 2); // Или P := PInteger (Integer(P) + 2 * SizeOf(Integer))
end;
Поскольку размер адресуемых данных у нетипизированных указателей не определен, функции Inc и Dec к ним неприменимы.
Германн (2011-08-16 00:20:00) [43]
> Только вот объяснил бы кто мне как они в этом случае работают?
А. Кажись понял. Но это совсем не та арифметика, которая в Си. Или я ошибаюсь?
Германн (2011-08-16 00:12:00) [44]
> Ega23 © (15.08.11 09:32) [19]
>
>
> > Ограничена символьными указателями
>
> Есть Inc и Dec. Если чё.
>
Хм. Действительно для типизированных указателей есть.
Только вот объяснил бы кто мне как они в этом случае работают?
rammic (2011-08-15 18:15:00) [45]Всем спасибо!
Юрий Зотов (2011-08-15 16:40:00) [46]
> rammic © (15.08.11 16:12) [44]
> теперь я хочу понять Ваш совет[2]
Для этого нужно перечитать вопрос [0] и убедиться, что ни о каких двух массивах и о переключении между ними внем речи не идет, а спрашивается ТОЛЬКО о том, " как в Delphi указатель на Array of Real переводится на заданный элемент массива".
Поэтому в [2] и было сказано, что получить доступ к заданному элементу можно проще, без указателей.
rammic (2011-08-15 16:12:00) [47]
> Юрий Зотов © (15.08.11 16:00) [42]
Списибо, но теперь я хочу понять Ваш совет[2]
Anatoly Podgoretsky (2011-08-15 16:08:00) [48]> rammic (15.08.2011 15:47:40) [40]
Они есть, но только за сценой
Юрий Зотов (2011-08-15 16:00:00) [49]> rammic © (15.08.11 15:25) [39]
Для полноты картины:
В обоих конструкциях [35] и [38] переменная p будет содержать адрес НУЛЕВОГО элемента массива (потому что он совпадает с адресом самого массива).
Но в конструкции [38] мы сказали компилятору, что переменная p указывает на число, а не на массив. А применить индекс к ЧИСЛУ мы не можем, поэтому переменная a будет содержать НУЛЕВОЙ элемент массива.
А в конструкции [35] мы сказали компилятору, что переменная p указывает на сам массив. Поэтому мы можем применить индекс и переменная a будет содержать ПЕРВЫЙ элемент массива, так как явно указан индекс 1.
Но и в конструкции [38] тоже можно получить i-й элемент массива, только для этого придется применить адресную арифметику и вычислить его адрес ручками:
type
TExt = packed array[0..2] of extended;
PExt = ^TExt;
const
arr : TExt = (1.3,0.3,5.4);
procedure TForm1.Button1Click(Sender: TObject);
var
p : PExt;
a : extended;
i : integer;
begin
i := 1;
p := PExt(Integer(@arr) + i * SizeOf(Extended));
a := p^;
end;
DiamondShark (2011-08-15 15:58:00) [50]
> В совете [2] я не понял зачем всем элементам массиваприсваивать 1
facepalm.jpg
rammic (2011-08-15 15:47:00) [51]Понятно как сделать с указателями, но что такое адресация без указателей
не понятно. В совете [2] я не понял зачем всем элементам массива
присваивать 1. Ведь массив уже есть. Мне нужно брать из него заданный
элемент.
rammic (2011-08-15 15:25:00) [52]Спасибо, теперь все понятно. Прошу прощения за глупость и назойливость.
sniknik (2011-08-15 15:22:00) [53]>
p : PArr; // Нам нужен указатель на МАССИВ, а не на extended
какая разница, пусть было бы указателем на extended
const
arr : array[0..2] of extended = (1.3,0.3,5.4);
procedure TForm1.Button1Click(Sender: TObject);
var
p : ^extended;
a : extended;
begin
p:= @arr;
a:= p^;
end;
то же самое. раз уж хочется через указатели. но они же попросту не нужны, как собаке пятая нога... (это не вообще, а применительно к "тут")
sniknik (2011-08-15 15:17:00) [54]> Буду очень благодарен если мне объяснят что я не понял в совете
> Юрия Зотова.
самое главное, и не обязательно в совете Юрия Зотова ты не понял/нимаешь одно... никто кроме тебя не знает, что именно ты не понял, и чего именно "нарешал/навыдумывал" глядя на очевидные (для знающих) основы примеры.
т.е. не спрашивай чего ТЫ НЕ ПОНЯЛ, а напиши, что понял и как... и тогда возможно тебе объяснять где ты не прав.
вот откуда взял, что советуют сделать копию???? ведь там ни слов, ни действий копирования, ничего похожего нет, есть пример адресации без указателей про которые у тебя и был вопрос.... но почему то его ты посчитал "неотвеченным", а пример за совет копирования НУ ВОТ ОТКУДА????
Юрий Зотов (2011-08-15 15:04:00) [55]Поправка:
TArr =array[0..2] of extended;
Юрий Зотов (2011-08-15 15:02:00) [56]> rammic © (15.08.11 13:47) [29]
> Юрий Зотов предлагает сделать копию нужного массива и работать с ней.
Я долго искал, где же я это предлагал. Не нашел.
Работа с указателями в Delphi НИЧЕМ, КРОМЕ СИНТАКСИСА не отличается от работы с укзателями в C. И без всяких "слабых мест". Нет там никаких слабых мест - все ТО ЖЕ САМОЕ, что и в С.
В [11] Вы уже сами все написали. С единственной ошибкой, на которую Вам уже тоже указали в [13]. Что же еще нужно-то?
type
TArr : array[0..2] of extended;
PArr = ^TArr;
const
arr : TArr = (1.3,0.3,5.4);
procedure TForm1.Button1Click(Sender: TObject);
var
p : PArr; // Нам нужен указатель на МАССИВ, а не на extended
a : extended;
begin
p:= @arr;
a:= p^[1];
end;
rammic (2011-08-15 14:49:00) [57]Мои познания в Си и Дельфи незначительные, поэтому я и задаю свои
вопросы. Буду очень благодарен если мне объяснят что я не понял в совете
Юрия Зотова.
sniknik (2011-08-15 14:32:00) [58]> мне задача представляется как-то так:
вы бы поостереглись давать код человеку не знающему основ... он же все воспринимает через "кривое зеркало своего представления"... очень кривое, в дельфи ничего не знает, в С думает что знает.
сейчас опять будут выводы в стиле "гадости заливной рыбы".
sniknik (2011-08-15 14:29:00) [59]> сделать копию нужного массива и работать с ней.
откуда "дровишки"? в [2] нет ни копий, ни советов их сделать...
> но надеялся что мне посоветуют что-то интереснее.
и как это возможно если задачи нет? а то, что есть требует перевода на русский.
RWolf (2011-08-15 14:05:00) [60]
> [29]
мне задача представляется как-то так:
type
PMyData = ^TMyData;
TMyData = array[0..9] of Extended;
var
MyData:array[Boolean] of TMyData = (
(1.1, 2.2, …),
(5.5, 6.7, …)
);
function ConquerTheWorldWith(const AData: TMyData);
begin
…
end;
…
ConquerTheWorldWith(MyData[Checkbox1.Checked]);