Покажчик на array

Покажчик на Array

З покорою прошу відповісти. Як в Delphi покажчик на Array of Real
перекладається на заданий елемент масиву. Якщо в С ++ це виходить
якщо написати р [i] то в Delphi # XA0; 1й елемент він показує а будь-який інший
не хоче.

Шаблон затріщав.
Переведи на російську.

Не потрібно покажчика. У Delphi це робиться простіше:

var
# XA0; P: array [0..9] of extended; // real - застарілий тип.
.
# XA0; for i: = 0 to 9 do
# XA0; # XA0; P [i]: = 1;

Або з динамічним масивом:

type
# XA0; TP: array of extended;
var
# XA0; P: TP;
.
# XA0; SetLength (P, 10);
# XA0; for i: = 0 to 9 do
# XA0; # XA0; P [i]: = 1;

> Є 2 масиву, в залежності від стану Checkbox потрібно обробляти
елементи одного або іншого


type
TDAExt = array of extended;
var
Arr1, Arr2, Temp: TDAExt;

begin
if Checkbox1.Checked then
# XA0; Temp: = Arr1
else
# XA0; Temp: = Arr2;
with Temp do
begin
end;
end;

var
# XA0; arr: array [False..True] of array of Integer;
begin
# XA0; arr [CheckBox1.Checked].
end;

Можна через IfThen або так ще:


var
arr: array [boolean] of array of Integer;
begin
arr [CheckBox1.Checked].
end;

В С ++ з покажчиками вже розібрався?
Тоді обрадую. Дороговкази в Дельфи від сішних нічим не відрізняються. Якщо ж не розбирався, тоді для чого потрібно було приплітати тут С ++?


> Щоб не писати багато разів if.

Навіщо писати одне і те ж багато разів? Один раз напиши.

Все-таки. як через покажчик на масив отримати i-й елемент масиву?


> Все-таки. як через покажчик на масив отримати i-й елемент
> Масиву?

якщо через "покажчик на масив", то майже як в C, P ^ [i], за умови, що P має тип ^ array [кордону] of type.

const
# XA0; arr. array [0..2] of extended = (1.3,0.3,5.4);

procedure TForm1.Button1Click (Sender: TObject);
var
# XA0; p. ^ Extended;
# XA0; a. extended;
begin
# XA0; p: = @arr;
# XA0; a: = p ^ [1];
end;

[Error] Unit1.pas (36): Array type required

Розумію, що роблю якусь дурну помилку.

> [Error] Unit1.pas (36): Array type required
покажчик це жодного разу не масив. не потрібно змішувати синтаксиси.

> Роблю якусь дурну помилку.
Чи не безглуздо, ідіотську. намагаєшся писати на С в Дельфи.
в 2 хороші приклади, чому не влаштовує?

p у тебе покажчик на extended, а потрібно зробити покажчик на масив extended "ов. А взагалі - покажчики тобі взагалі не потрібні, думається.


> # XA0; І арифметику покажчиків не надто любить

З чого це.

Обмежена символьними вказівниками

> You can use the + and - operators to increment and decrement the offset of
> A character pointer. You can also use - to calculate the difference
> Between the offsets of two character pointers.

А загальне тільки операція разіменованія.

type
# XA0; PExtended = ^ Extended; // покажчик на єдиний Extended
# XA0; TExtendedArray = array [0..MaxInt div Sizeof (Extended) -1] of Extended;
# XA0; PExtendedArray = ^ TExtendedArray; // майже те, що потрібно

const
arr. array [0..2] of extended = (1.3,0.3,5.4);

procedure TForm1.Button1Click (Sender: TObject);
var
p. PExtendedArray;
a. extended;
begin
p: = @arr;
a: = p ^ [1]; // тепер має працювати
end;
але щоб працювати по Сішному, модно зробити так

const
arr. array [0..2] of extended = (1.3,0.3,5.4);

procedure TForm1.Button1Click (Sender: TObject);
var
p. ^ Extended; // все таки так
a. extended;
I: Integer;
begin
p: = @arr;
a: = 0;
for I: = 0 to 2 do begin
a: = a + # XA0; p ^;
Inc (p); // майже p ++
end;
end;


> Обмежена символьними вказівниками

Є Inc і Dec. Якщо че.

і в підсумку сгенеренний asm код буде нічим не краще, а скоріше гірше ніж з [2]. але це навіть непогано. дасть привід посварити дельфи в стилі "ну і гидота ця ваша заливна риба".

Схоже, сам того не бажаючи, за своєю малограмотність торкнувся слабке
місце Delphi. Виходить що потрібно замість 2-х масивів мати справу з трьома,
причому третій - штучний - копія одного з потрібних, або замість 2-х простих масивів робити один багатовимірний, або # XA0; писати багато type-ів.


> Схоже, сам того не бажаючи, за своєю малограмотність торкнувся
> слабке
> Місце Delphi.

Схоже на "X, Y, Z"

Прошу не скандалити, мені здавалося, що все буде простіше.

> Слабке місце Delphi.
це слабке місце слабких умів.
при кількох варіантах ігнорувати нормальні, вибрати самий збочений, і після зловтішатися, "а, вот! не може він так."

------------------------
Купили суворі російські мужики японську бензопилу, почали її випробовувати, в пилу тріску
- Вжик! - сказала пила і розпиляла тріску.
- А-а, б **! - сказали суворі російські мужики і засунули в пилу дошку.
- Вжжік! - сказала пила і розпиляла дошку.
- У-у, б **! - сказали суворі російські мужики і засунули в пилу колоду.
- Вжжжжік! - сказала пила і розпиляла колоду.
- У-у, б **. - сказали суворі російські мужики і засунули в пилу рейок.
- Хррр-дзень - сказала пила і зламалася.
- Ах-ха, б **. - сказали суворі російські мужики і пішли валити ліс сокирами.

> Мені здавалося, що все буде простіше.
ЩО СКЛАДНОГО в [2].

Наскільки я зрозумів, можливо невірно, Юрій Зотов пропонує зробити
копію потрібного масиву і працювати з нею. Звичайно. це просто. Я так і
думав зробити, але сподівався # XA0; що мені порадять щось цікавіше.


> Я так і думав зробити, але сподівався # XA0; що мені порадять щось цікавіше.

Убий себе, спаси світ.
Втім ні, не вбивай. Піди працювати. Моя зарплата виросте, якщо таких як ти буде багато.


> [29]

мені завдання видається якось так:

type
# XA0; PMyData = ^ TMyData;
# XA0; TMyData = array [0..9] of Extended;

var
# XA0; MyData: array [Boolean] of TMyData = (
# XA0; (1.1, 2.2, ...),
# XA0; (5.5, 6.7, ...)
# XA0;);

function ConquerTheWorldWith (const AData: TMyData);
begin
...
end;

> Зробити копію потрібного масиву і працювати з нею.
звідки "дровишки"? в [2] немає ні копій, ні рад їх зробити.

> Але сподівався # XA0; що мені порадять щось цікавіше.
і як це можливо якщо завдання немає? а то, що є вимагає перекладу на російську.

> Мені завдання видається якось так:
ви б поостереглись давати код людині не знає основ. він же все сприймає через "криве дзеркало свого уявлення". дуже криве, в Дельфи нічого не знає, в С думає що знає.

зараз # XA0; знову будуть висновки в стилі "гидоти заливний риби".

Мої пізнання в Сі і Дельфі незначні, тому я і ставлю свої
питання. Буду дуже вдячний якщо мені пояснять що я не зрозумів в раді
Юрія Зотова.

> Юрій Зотов пропонує зробити копію потрібного масиву і працювати з нею.

Я довго шукав, де ж я це пропонував. Не знайшов.

Робота з покажчиками в Delphi НІЧИМ, КРІМ синтаксису не відрізняється від роботи з укзателямі в C. І без всяких "слабких місць". Немає там ніяких слабких місць - все ТО Ж САМЕ, що і в С.

В [11] Ви вже самі все написали. З єдиною помилкою, на яку Вам вже теж вказали в [13]. Що ж ще потрібно-то?

type
# XA0; TArr. array [0..2] of extended;
# XA0; PArr = ^ TArr;

const
# XA0; arr. TArr = (1.3,0.3,5.4);

procedure TForm1.Button1Click (Sender: TObject);
var
# XA0; p. PArr; // Нам потрібен покажчик на МАСИВ, а не на extended
# XA0; a. extended;
begin
# XA0; p: = @arr;
# XA0; a: = p ^ [1];
end;

> P. PArr; // Нам потрібен покажчик на МАСИВ, а не на extended
яка різниця, нехай було б покажчиком на extended

const
# XA0; arr. array [0..2] of extended = (1.3,0.3,5.4);

procedure TForm1.Button1Click (Sender: TObject);
var
# XA0; p. ^ Extended;
# XA0; a. extended;
begin
p: = @arr;
a: = p ^;
end;

теж саме. якщо вже хочеться через покажчики. але вони ж просто не потрібні, як собаці п'ята нога. (Це не взагалі, а стосовно "тут")

Спасибі, тепер все зрозуміло. Прошу вибачення за дурість і настирливість.


> У раді [2] я не зрозумів навіщо всіх елементів массівапрісваівать 1

facepalm.jpg

Для повноти картини:

Але в конструкції [38] ми сказали компілятору, що змінна p вказує на число, а не на масив. А застосувати індекс до числа ми не можемо, тому змінна a буде містити НУЛЬОВИЙ елемент масиву.

А в конструкції [35] ми сказали компілятору, що змінна p вказує на сам масив. Тому ми можемо застосувати індекс і змінна a буде містити ПЕРШИЙ елемент масиву, так як явно вказано індекс 1.

const
# XA0; arr. TExt # XA0; = (1.3,0.3,5.4);

procedure TForm1.Button1Click (Sender: TObject);
var
# XA0; p. PExt;
# XA0; a. extended;
# XA0; i. integer;
begin
# XA0; i: = 1;
# XA0; p: = PExt (Integer (@arr) + i * SizeOf (Extended));
# XA0; a: = p ^;
end;

Вони є, але тільки за сценою

Тому в [2] і було сказано, що отримати доступ до заданого елементу можна простіше, без покажчиків.


> Тільки ось пояснив би хто мені як вони в цьому випадку працюють?

А. Здається зрозумів. Але це зовсім не та арифметика, яка в Сі. Або я помиляюсь?

Dec - зменшує на ту ж величину.


> Але в Сі, якщо мені не зраджує мій склероз, дозволені прості
> Арифметичні операції над покажчиками. Які не залежать
> Від того, на що даний покажчик вказує.


procedure TForm8.Button1Click (Sender: TObject);
var
# XA0; i: Integer;
# XA0; p: PInteger;
# XA0; arr: array [0..1] of Integer;
begin
# XA0; arr [0]: = $ 44332211;
# XA0; arr [1]: = $ 88776655;

# XA0; p: = @arr [0];
# XA0; for i: = 1 to 4 do
# XA0; begin
# XA0; # XA0; Cardinal (p): = Cardinal (p) + 1;
# XA0; # XA0; Memo1.Lines.Add (IntToHex (p ^, 8));
# XA0; end;
end;


> Це зовсім не еквівалент * (p + 1)

Cardinal (p): = Cardinal (p) + 1;
Ті ж яйця, тільки збоку.


> Варіант # XA0; (16.08.11 8:48) [54]
> Це зовсім не еквівалент * (p + 1),

А в чому відмінність?

Для цього Inc є


> # XA0; Для # XA0; покажчика на char різниці немає

Це в цих ваших сях немає. А ми тут взимку потрахалісь, змінюючи PChar на PByte

P.S. Взагалі я не в перший раз вже зустрічаю таке чітке оману, що "тільки PChar" можна використовувати. Причому у таких людей, на яких ніколи б не подумав.
Може яку спадщину Turbo Pascal, або там Delphi 3?


> Це в цих ваших сях немає. А ми тут взимку потрахалісь, змінюючи
> PChar на PByte

А мої не тільки Сі :-) До речі Pbyte відповідає більш # XA0; unsigned char *. Правда char в сі ширше char # XA0; в паскале.
А різниця є і для сі. Контроль за типами слабже це так. Але результат можна отримати інший # XA0; і в програмі на С, якщо плутати типи.


> Варіант # XA0; (16.08.11 9:11) [58]

Так і додає не 1 а sizeof (element)

Char в СІ зовсім char


> Char в СІ зовсім char

сhar в СІ не тільки Char LOL :-)

> 1 неявно множиться на sizeof (тип елемента).
Те ж саме робить Inc.

> Або вважається. що покажчик на тип char - залежить від компілятора
А ось це - серйозна засідка. Один і той же вихідний код може вести себе по-різному.

> Cardinal (p): = Cardinal (p) + 1 ;, де P покажчик, швидше за все
> В Дельфи буде помилкою.


> 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
# XA0; Cardinal (p): = Cardinal (p) + 1;
# XA0; Memo1.Lines.Add (IntToHex (p ^, 8));
end;
end;

Результат в Memo1:
55443322
66554433
77665544
88776655

Все як і було задумано.


> Цієї фрази не зрозумів, до чого?

Дурдом це дурника будинок, застосовувати до char

Начебто різницю пояснив, чи не дуже зрозуміло пояснив? # XA0; Можу спробувати на прикладі, якщо необхідно?

А щодо багатшими або біднішими, # XA0; мені чесно кажучи все одно, яка мова багатша або біднішими, мені важливо, який зручніше для тієї чи іншої мети. А все, що ви робите в вигляді перетворення покажчика до числа, можна зробити так само і в сі, повірте вже. А ось ділити саме покажчик можна ні там ні там ;-) Я зараз часто в деяких завданнях використовую мову взагалі без покажчиків і вистачає


> # XA0; Я зараз часто в деяких завданнях використовую мову взагалі
> Без покажчиків і вистачає

У російській без покажчиків погано. Особливо - в метро в центрі.


> # XA0; Навіщо робити так, як в сі? Що б мати можливість проблем?

Я всього лише показав можливість зробити і через Inc, і через приведення типів.
Як особисто я роблю? Залежно від завдання.

А що робить цей код?


> А що робить цей код?

Мемо заповнює цифрами.


> Мемо заповнює цифрами.

Я тобі рада дам по оптимізації, так простіше:

всього одна строчка проти 16

Ну не треба, там є явні покажчики (напрямки)

А я завжди + щоб не потрапити в халепу, он сьогодні приклад такого халепу,
питання Left Side.
І як правило обидва варіанти призводить до однієї і тієї ж ассемблерной команді.


> Добре, що немає ще DELPHI64.

Ну вже практично є

> Які радості перекладу типів даних це нам готує?

Pointer стане 8-байтним.

Нам заважають дурні і дороги, їм же тільки дурні.

> Варіант # XA0; (16.08.11 15:46) [88]

Мозок Анатолія давно перейшов в новий якісний стан, що генерує багатошарові, суперметасмисловние ідіоматичні конструкції)

Схожі статті