Покажчик на 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]
Мозок Анатолія давно перейшов в новий якісний стан, що генерує багатошарові, суперметасмисловние ідіоматичні конструкції)