Форум: "Начинающим";
Текущий архив: 2011.12.04;
Скачать: [xml.tar.bz2];
ВнизУказатель на Array Найти похожие ветки
← →
rammic © (2011-08-15 15:47) [40]Понятно как сделать с указателями, но что такое адресация без указателей
не понятно. В совете [2] я не понял зачем всем элементам массива
присваивать 1. Ведь массив уже есть. Мне нужно брать из него заданный
элемент.
← →
DiamondShark © (2011-08-15 15:58) [41]
> В совете [2] я не понял зачем всем элементам массиваприсваивать 1
facepalm.jpg
← →
Юрий Зотов © (2011-08-15 16:00) [42]> rammic © (15.08.11 15:25) [39]
Для полноты картины:
В обоих конструкциях [35] и [38] переменная p будет содержать адрес НУЛЕВОГО элемента массива (потому что он совпадает с адресом самого массива).
Но в конструкции [38] мы сказали компилятору, что переменная p указывает на число, а не на массив. А применить индекс к ЧИСЛУ мы не можем, поэтому переменная a будет содержать НУЛЕВОЙ элемент массива.
А в конструкции [35] мы сказали компилятору, что переменная p указывает на сам массив. Поэтому мы можем применить индекс и переменная a будет содержать ПЕРВЫЙ элемент массива, так как явно указан индекс 1.
Но и в конструкции [38] тоже можно получить i-й элемент массива, только для этого придется применить адресную арифметику и вычислить его адрес ручками:
type
TExt = packedarray[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;
← →
Anatoly Podgoretsky © (2011-08-15 16:08) [43]> rammic (15.08.2011 15:47:40) [40]
Они есть, но только за сценой
← →
rammic © (2011-08-15 16:12) [44]
> Юрий Зотов © (15.08.11 16:00) [42]
Списибо, но теперь я хочу понять Ваш совет[2]
← →
Юрий Зотов © (2011-08-15 16:40) [45]
> rammic © (15.08.11 16:12) [44]
> теперь я хочу понять Ваш совет[2]
Для этого нужно перечитать вопрос [0] и убедиться, что ни о каких двух массивах и о переключении между ними внем речи не идет, а спрашивается ТОЛЬКО о том, "как в Delphi указатель на Array of Real переводится на заданный элемент массива".
Поэтому в [2] и было сказано, что получить доступ к заданному элементу можно проще, без указателей.
← →
rammic © (2011-08-15 18:15) [46]Всем спасибо!
← →
Германн © (2011-08-16 00:12) [47]
> Ega23 © (15.08.11 09:32) [19]
>
>
> > Ограничена символьными указателями
>
> Есть Inc и Dec. Если чё.
>
Хм. Действительно для типизированных указателей есть.
Только вот объяснил бы кто мне как они в этом случае работают?
← →
Германн © (2011-08-16 00:20) [48]
> Только вот объяснил бы кто мне как они в этом случае работают?
А. Кажись понял. Но это совсем не та арифметика, которая в Си. Или я ошибаюсь?
← →
Юрий Зотов © (2011-08-16 00:26) [49]> Германн © (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:28) [50]
> Германн © (16.08.11 00:20) [48]
> Но это совсем не та арифметика, которая в Си.
Адресная арифметика - она одна и от языка не зависит. Разный только синтаксис.
← →
Германн © (2011-08-16 01:02) [51]
> Юрий Зотов © (16.08.11 00:26) [49]
>
> > Германн © (16.08.11 00:12) [47]
>
> Inc - увеличивает указатель на размер адресуемого им типа
> данных, умноженный на второй аргумент.
>
> Dec - уменьшает на ту же величину.
>
Это-то как раз я и понял.
Но в Си, если мне не изменяет мой склероз, разрешены простые арифметические операции над указателями. Которые не зависят от того, на что данный указатель указывает.
← →
Ega23 © (2011-08-16 08:35) [52]
> Но в Си, если мне не изменяет мой склероз, разрешены простые
> арифметические операции над указателями. Которые не зависят
> от того, на что данный указатель указывает.
procedure TForm8.Button1Click(Sender: TObject);
var
i: Integer;
p: PInteger;
arr: array[0..1] of Integer;
begin
arr[0] := $44332211;
arr[1] := $88776655;
p := @arr[0];
for i := 1 to 4 do
begin
Cardinal(p) := Cardinal(p) + 1;
Memo1.Lines.Add(IntToHex(p^, 8));
end;
end;
← →
Юрий Зотов © (2011-08-16 08:40) [53]
> Германн © (16.08.11 01:02) [51]
> Но в Си, если мне не изменяет мой склероз, разрешены простые
> арифметические операции над указателями. Которые не зависят
> от того, на что данный указатель указывает.
В Delphi их тоже никто не запрещал. Надо только привести типы.
← →
Вариант (2011-08-16 08:48) [54]
> Ega23 © (16.08.11 08:35) [52]
Это совсем не эквивалент*(p+1)
, впрочем Inc и Dec вполне хватает, о чем ты уже писал выше.
← →
Ega23 © (2011-08-16 08:53) [55]
> Это совсем не эквивалент *(p+1)Cardinal(p) := Cardinal(p) + 1;
Те же яйца, только сбоку.
← →
Юрий Зотов © (2011-08-16 08:58) [56]
> Вариант (16.08.11 08:48) [54]
> Это совсем не эквивалент *(p+1),
А в чем различие?
← →
Вариант (2011-08-16 09:06) [57]Когда указатель преобразовали к числу и увеличили его на 1, как в коде Ega32, то указатель стал указывать на следующий байт в массиве, а не наследующий его элемент. Если бы в СИ я так же сделал с преобразованием указтеля к числу, то получил бы то же самое. Но
*(p+1)
увеличивает адрес указателя так, что указатель будет указывать на следующий элемент, то есть 1 неявно умножается на sizeof(тип элемента). Для указателя на char разницы нет, для указателя на другие типы разница есть. Для указателя на тип void операция запрещена или считается , что указатель на тип char - зависит от компилятора
← →
Вариант (2011-08-16 09:11) [58]
> Юрий Зотов © (16.08.11 08:58) [56]
Резюме
*(P+N) -> Inc(P,N)
Inc(P) <> Pinteger(Cardinal(P)+1)
← →
Ega23 © (2011-08-16 09:15) [59]
> увеличивает адрес указателя так, что указатель будет указывать
> на следующий элемент, то есть 1 неявно умножается на sizeof(тип
> элемента).
Для этого Inc есть
> Для указателя на char разницы нет
Это в этих ваших сях нет. А мы тут зимой потрахались, меняя PChar на PByte
P.S. Вообще я не в первый раз уже встречаю такое чёткое заблуждение, что "только PChar" можно использовать. Причём у таких людей, на которых никогда бы не подумал.
Может какое наследие Turbo Pascal, или там Delphi 3?
← →
Вариант (2011-08-16 09:24) [60]
> Ega23 © (16.08.11 09:15) [59]
Про Inc согласен, он и служит для адресной арифметики в дельфи, иCardinal(p) := Cardinal(p) + 1;
, где P указатель, скорее всего в дельфи будет ошибкой.
> Это в этих ваших сях нет. А мы тут зимой потрахались, меняя
> PChar на PByte
А мои не только Си:-) Кстати Pbyte соответствует более unsigned char *. Правда char в си шире char в паскале.
А разница есть и для си. Контроль за типами слабже -это да. Но результат можно получить другой и в программе на С, если путать типы.
← →
Anatoly Podgoretsky © (2011-08-16 09:34) [61]
> Вариант (16.08.11 09:11) [58]
Так и прибавляй не 1 а sizeof(element)
← →
Anatoly Podgoretsky © (2011-08-16 09:35) [62]> Вариант (16.08.2011 09:24:00) [60]
Char в СИ совсем не char
← →
Вариант (2011-08-16 09:38) [63]
> Anatoly Podgoretsky © (16.08.11 09:34) [61]
> Так и прибавляй не 1 а sizeof(element)
А зачем мне лишние действия, когда есть нужные процедуры?
> Char в СИ совсем не char
сhar в СИ не только Char LOL:-)
← →
Anatoly Podgoretsky © (2011-08-16 10:01) [64]> Вариант (16.08.2011 09:38:03) [63]
И это дурдом
← →
Юрий Зотов © (2011-08-16 10:10) [65]> Вариант
> 1 неявно умножается на sizeof(тип элемента).
То же самое делает Inc.
> Для указателя на тип void операция запрещена
А в Delphi - без проблем. Приводим тип - и можем делать что угодно Выходит, что в Delphi адресная арифметика даже богаче, чем в C.
> или считается , что указатель на тип char - зависит от компилятора
А вот это - серьезная засада. Один и тот же исходный код может вести себя по-разному.
> Про Inc согласен, он и служит для адресной арифметики в дельфи
Не только Inc. В Delphi с указателями можно проделывать любые целочисленные операции, хоть деление. И снова выходит, что в Delphi адресная арифметика даже богаче, чем в C.
> Cardinal(p) := Cardinal(p) + 1;, где P указатель, скорее всего
> в дельфи будет ошибкой.
Не будет.
← →
Вариант (2011-08-16 10:11) [66]
> Anatoly Podgoretsky © (16.08.11 10:01) [64]
Этой фразы не понял, к чему?
← →
Ega23 © (2011-08-16 10:13) [67]
> Cardinal(p) := Cardinal(p) + 1;, где P указатель, скорее
> всего в дельфи будет ошибкой.
Нет там ошибки:procedure TForm8.Button1Click(Sender: TObject);
var
i: Integer;
p: PInteger;
arr: array[0..1] of Integer;
begin
arr[0] := $44332211;
arr[1] := $88776655;
p := @arr[0];
for i := 1 to 4 do
begin
Cardinal(p) := Cardinal(p) + 1;
Memo1.Lines.Add(IntToHex(p^, 8));
end;
end;
Результат в Memo1:55443322
66554433
77665544
88776655
Всё как и задумывалось.
← →
Anatoly Podgoretsky © (2011-08-16 10:14) [68]
> Этой фразы не понял, к чему?
Дурдом это дурачкий дом, применять к char
← →
Вариант (2011-08-16 10:27) [69]
> Юрий Зотов © (16.08.11 10:10) [65]
Начнем с того, что разговор был не о Inc/
Покажите, где я говорил беднее:-) Inc и Dec хватает. Но я отвечал на вопрос
> Юрий Зотов © (16.08.11 08:58) [56]
>
> > Вариант (16.08.11 08:48) [54]
> > Это совсем не эквивалент *(p+1),
>
> А в чем различие?
>
Вроде разницу объяснил, или не очень понятно объяснил? Могу попробовать на примере, если необходимо?
А насчет богаче или беднее, мне честно говоря все равно, какой язык богаче или беднее, мне важно, какой удобней для той или иной цели. А все, что вы делаете в виде преобразования указателя к числу, можно сделать так же и в си, поверьте уж. А вот делить именно указатель нельзя ни там ни там;-) Я сейчас зачастую в некоторых задачах использую язык вообще без указателей и хватает
← →
Вариант (2011-08-16 10:29) [70]
> Anatoly Podgoretsky © (16.08.11 10:14) [68]
Извините, но я опять не понял, что вы хотели сказать
← →
Игорь Шевченко © (2011-08-16 10:32) [71]
> Я сейчас зачастую в некоторых задачах использую язык вообще
> без указателей и хватает
Например, русский :))
← →
Ega23 © (2011-08-16 10:35) [72]
> Например, русский :))
В русском без указателей плохо. Особенно - в метро в центре.
← →
Вариант (2011-08-16 10:39) [73]
> Ega23 © (16.08.11 10:13) [67]
Ошибка, пользоваться микроскопом для забивания гвоздей. И наоборот молотком для ловли блох. Нет в этом необходимости, писать кучу лишнего кода. Зотов вон си ругает, а в чем плюс дельфи, если писать так, как ты показал? У Си и дельфи разные спсобы адресной арифметики. У дельфи более безопасные. Зачем делать так, как в си? Что бы поиметь возможность проблем?
Причем си даже в этом случае получается предпочтительней.
← →
Вариант (2011-08-16 10:40) [74]
> Игорь Шевченко © (16.08.11 10:32) [71]
Вот и неправда, в русском указатели есть LOL
← →
Ega23 © (2011-08-16 10:50) [75]
> Зачем делать так, как в си? Что бы поиметь возможность проблем?
Я всего лишь показал возможность сделать и через Inc, и через приведение типов.
Как лично я делаю? В зависимости от задачи.
← →
Игорь Шевченко © (2011-08-16 11:20) [76]Ega23 © (16.08.11 10:13) [67]
А что делает этот код ?
← →
Ega23 © (2011-08-16 11:38) [77]
> А что делает этот код ?
Мемо заполняет цифрами.
← →
Inovet © (2011-08-16 11:42) [78]> [51] Германн © (16.08.11 01:02)
> Но в Си, если мне не изменяет мой склероз, разрешены простые
> арифметические операции над указателями. Которые не зависят
> от того, на что данный указатель указывает.
У указателя всегда есть тип, на который он указывает, кроме void*.
← →
Игорь Шевченко © (2011-08-16 11:43) [79]
> Мемо заполняет цифрами.
Я тебе совет дам по оптимизации, так проще:Memo1.Lines.Add("55443322"#13#10"66554433"#13#10"77665544"#13#10"88776655" );
всего одна строчка против 16
← →
Anatoly Podgoretsky © (2011-08-16 12:20) [80]> Игорь Шевченко (16.08.2011 10:32:11) [71]
Ну не надо, там есть явные указатели (направления)
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.12.04;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.008 c