Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Указатель на Array [D7, XP]


Страницы:   1 2 3 4 5

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 - уменьшает на ту же величину.
>

Это-то как раз я и понял.
Но в Си, если мне не изменяет мой склероз, разрешены простые арифметические операции над указателями. Которые не зависят от того, на что данный указатель указывает.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо