![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатель на Array [D7, XP]
rammic © (2011-08-14 15:50:00)Со смирением прошу ответить. Как в Delphi указатель на Array of Real
переводится на заданный элемент массива. Если в С++ это получается
если написать р[i] то в Delphi 1й элемент он показывает а любой другой
не хочет.
Вариант (2011-08-16 10:29:00) [21]
> Anatoly Podgoretsky © (16.08.11 10:14) [68]
Извините, но я опять не понял, что вы хотели сказать
Вариант (2011-08-16 10:27:00) [22]
> Юрий Зотов © (16.08.11 10:10) [65]
Начнем с того, что разговор был не о Inc/
Покажите, где я говорил беднее:-) Inc и Dec хватает. Но я отвечал на вопрос
> Юрий Зотов © (16.08.11 08:58) [56]
>
> > Вариант (16.08.11 08:48) [54]
> > Это совсем не эквивалент *(p+1),
>
> А в чем различие?
>
Вроде разницу объяснил, или не очень понятно объяснил? Могу попробовать на примере, если необходимо?
А насчет богаче или беднее, мне честно говоря все равно, какой язык богаче или беднее, мне важно, какой удобней для той или иной цели. А все, что вы делаете в виде преобразования указателя к числу, можно сделать так же и в си, поверьте уж. А вот делить именно указатель нельзя ни там ни там;-) Я сейчас зачастую в некоторых задачах использую язык вообще без указателей и хватает
Anatoly Podgoretsky (2011-08-16 10:14:00) [23]
> Этой фразы не понял, к чему?
Дурдом это дурачкий дом, применять к char
Ega23 (2011-08-16 10:13:00) [24]
> 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
Всё как и задумывалось.
Вариант (2011-08-16 10:11:00) [25]
> Anatoly Podgoretsky © (16.08.11 10:01) [64]
Этой фразы не понял, к чему?
Юрий Зотов (2011-08-16 10:10:00) [26]> Вариант
> 1 неявно умножается на sizeof(тип элемента).
То же самое делает Inc.
> Для указателя на тип void операция запрещена
А в Delphi - без проблем. Приводим тип - и можем делать что угодно Выходит, что в Delphi адресная арифметика даже богаче, чем в C.
> или считается , что указатель на тип char - зависит от компилятора
А вот это - серьезная засада. Один и тот же исходный код может вести себя по-разному.
> Про Inc согласен, он и служит для адресной арифметики в дельфи
Не только Inc. В Delphi с указателями можно проделывать любые целочисленные операции, хоть деление. И снова выходит, что в Delphi адресная арифметика даже богаче, чем в C.
> Cardinal(p) := Cardinal(p) + 1;, где P указатель, скорее всего
> в дельфи будет ошибкой.
Не будет.
Anatoly Podgoretsky (2011-08-16 10:01:00) [27]> Вариант (16.08.2011 09:38:03) [63]
И это дурдом
Вариант (2011-08-16 09:38:00) [28]
> Anatoly Podgoretsky © (16.08.11 09:34) [61]
> Так и прибавляй не 1 а sizeof(element)
А зачем мне лишние действия, когда есть нужные процедуры?
> Char в СИ совсем не char
сhar в СИ не только Char LOL:-)
Anatoly Podgoretsky (2011-08-16 09:35:00) [29]> Вариант (16.08.2011 09:24:00) [60]
Char в СИ совсем не char
Anatoly Podgoretsky (2011-08-16 09:34:00) [30]
> Вариант (16.08.11 09:11) [58]
Так и прибавляй не 1 а sizeof(element)
Вариант (2011-08-16 09:24:00) [31]
> Ega23 © (16.08.11 09:15) [59]
Про Inc согласен, он и служит для адресной арифметики в дельфи, и
Cardinal(p) := Cardinal(p) + 1;, где P указатель, скорее всего в дельфи будет ошибкой.
> Это в этих ваших сях нет. А мы тут зимой потрахались, меняя
> PChar на PByte
А мои не только Си:-) Кстати Pbyte соответствует более unsigned char *. Правда char в си шире char в паскале.
А разница есть и для си. Контроль за типами слабже -это да. Но результат можно получить другой и в программе на С, если путать типы.
Ega23 (2011-08-16 09:15:00) [32]
> увеличивает адрес указателя так, что указатель будет указывать
> на следующий элемент, то есть 1 неявно умножается на sizeof(тип
> элемента).
Для этого Inc есть
> Для указателя на char разницы нет
Это в этих ваших сях нет. А мы тут зимой потрахались, меняя PChar на PByte
P.S. Вообще я не в первый раз уже встречаю такое чёткое заблуждение, что "только PChar" можно использовать. Причём у таких людей, на которых никогда бы не подумал.
Может какое наследие Turbo Pascal, или там Delphi 3?
Вариант (2011-08-16 09:11:00) [33]
> Юрий Зотов © (16.08.11 08:58) [56]
Резюме
*(P+N) -> Inc(P,N)
Inc(P) <> Pinteger(Cardinal(P)+1)
Вариант (2011-08-16 09:06:00) [34]Когда указатель преобразовали к числу и увеличили его на 1, как в коде Ega32, то указатель стал указывать на следующий байт в массиве, а не наследующий его элемент. Если бы в СИ я так же сделал с преобразованием указтеля к числу, то получил бы то же самое. Но
*(p+1)
увеличивает адрес указателя так, что указатель будет указывать на следующий элемент, то есть 1 неявно умножается на sizeof(тип элемента). Для указателя на char разницы нет, для указателя на другие типы разница есть. Для указателя на тип void операция запрещена или считается , что указатель на тип char - зависит от компилятора
Юрий Зотов (2011-08-16 08:58:00) [35]
> Вариант (16.08.11 08:48) [54]
> Это совсем не эквивалент *(p+1),
А в чем различие?
Ega23 (2011-08-16 08:53:00) [36]
> Это совсем не эквивалент *(p+1)
Cardinal(p) := Cardinal(p) + 1;
Те же яйца, только сбоку.
Вариант (2011-08-16 08:48:00) [37]
> Ega23 © (16.08.11 08:35) [52]
Это совсем не эквивалент*(p+1), впрочем Inc и Dec вполне хватает, о чем ты уже писал выше.
Юрий Зотов (2011-08-16 08:40:00) [38]
> Германн © (16.08.11 01:02) [51]
> Но в Си, если мне не изменяет мой склероз, разрешены простые
> арифметические операции над указателями. Которые не зависят
> от того, на что данный указатель указывает.
В Delphi их тоже никто не запрещал. Надо только привести типы.
Ega23 (2011-08-16 08:35:00) [39]
> Но в Си, если мне не изменяет мой склероз, разрешены простые
> арифметические операции над указателями. Которые не зависят
> от того, на что данный указатель указывает.
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 01:02:00) [40]
> Юрий Зотов © (16.08.11 00:26) [49]
>
> > Германн © (16.08.11 00:12) [47]
>
> Inc - увеличивает указатель на размер адресуемого им типа
> данных, умноженный на второй аргумент.
>
> Dec - уменьшает на ту же величину.
>
Это-то как раз я и понял.
Но в Си, если мне не изменяет мой склероз, разрешены простые арифметические операции над указателями. Которые не зависят от того, на что данный указатель указывает.