Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.04;
Скачать: CL | DM;

Вниз

Указатель на 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;
Скачать: CL | DM;

Наверх




Память: 0.64 MB
Время: 0.011 c
2-1313146108
Nikki
2011-08-12 14:48
2011.12.04
Работа с TMemo


2-1313689507
Pcrepair
2011-08-18 21:45
2011.12.04
Как получить цвет пикселя из палитры BMP 8bit


2-1313569604
Pepe
2011-08-17 12:26
2011.12.04
Обратный алгоритм.


15-1313278200
Юрий
2011-08-14 03:30
2011.12.04
С днем рождения ! 14 августа 2011 воскресенье


1-1276169691
kukuruza
2010-06-10 15:34
2011.12.04
Может TerminateProcess вызызвать BSOD? А то система падает.