Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1313514028
Pcrepair
2011-08-16 21:00
2011.12.04
Конвертер BMP 32 bit BGRA в BMP 8 bit c Palette


2-1313774122
Sega625
2011-08-19 21:15
2011.12.04
record в array of byte


2-1313438873
анонимус
2011-08-16 00:07
2011.12.04
std::sort на делфи


15-1312810075
Leon-Z
2011-08-08 17:27
2011.12.04
Компоненты DB.


3-1268214255
Spot
2010-03-10 12:44
2011.12.04
Резервирование БД mysql





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский