Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.12.04;
Скачать: [xml.tar.bz2];

Вниз

Указатель на Array   Найти похожие ветки 

 
rammic ©   (2011-08-14 15:50) [0]

Со смирением прошу ответить. Как в Delphi указатель на Array of Real
переводится на заданный элемент массива. Если в С++ это получается
если написать р[i] то в Delphi  1й элемент он показывает а любой другой
не хочет.


 
Ega23 ©   (2011-08-14 16:29) [1]

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


 
Юрий Зотов ©   (2011-08-14 17:48) [2]

> rammic ©   (14.08.11 15:50)  

Не нужно указателя. В Delphi это делается проще:

var
 P: array[0..9] of extended; // real - устаревший тип.
...
 for i := 0 to 9 do
   P[i] := 1;

Или с динамическим массивом:

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


 
rammic ©   (2011-08-14 17:51) [3]

Есть 2 массива, в зависимости от состояния Checkbox нужно обрабатывать
элементы одного или другого, Чтобы не писать много раз if. я хочу
указателю присвоить адрес нужного и через него иметь доступ к любому
его элементу, но не знаю как получить дальше первого элемента


 
Дмитрий Белькевич   (2011-08-14 18:00) [4]

>Есть 2 массива, в зависимости от состояния Checkbox нужно обрабатывать
элементы одного или другого


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

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


?


 
Ega23 ©   (2011-08-14 21:24) [5]

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


 
Псарь   (2011-08-14 21:59) [6]


> Ega23 ©   (14.08.11 21:24) [5]


Можно через IfThen или так ещё:


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


 
Loginov Dmitry ©   (2011-08-14 23:05) [7]


> Если в С++ это получается
> если написать р[i] то


> я хочу
> указателю присвоить адрес нужного и через него иметь доступ
> к любому
> его элементу, но не знаю как получить дальше первого элемента


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


> Чтобы не писать много раз if...


Зачем писать одно и то же много раз? Один раз напиши.


 
rammic ©   (2011-08-14 23:21) [8]

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


 
Inovet ©   (2011-08-14 23:23) [9]

> [8] rammic ©   (14.08.11 23:21)
> Все-таки. как через указатель на массив получить i-й элемент массива?

Вот те раз.


 
Игорь Шевченко ©   (2011-08-14 23:28) [10]


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


если через "указатель на массив", то почти как в C, P^[i], при условии, что P имеет тип ^array [границы] of type.

иначе как в [2]


 
rammic ©   (2011-08-15 00:00) [11]

Пишу:

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

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

Получаю

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

Понимаю, что делаю какую- то глупую ошибку.


 
sniknik ©   (2011-08-15 00:12) [12]

> [Error] Unit1.pas(36): Array type required
указатель это ни разу не массив... не нужно смешивать синтаксисы.

> делаю какую- то глупую ошибку.
не глупую, идиотскую... пытаешься писать на С в дельфи.
в 2 хорошие примеры, чем не устраивает?


 
Дмитрий Белькевич   (2011-08-15 00:16) [13]

p у тебя указатель на extended, а нужно сделать указатель на массив extended"ов. А вообще - указатели тебе вообще не нужны, думается.


 
Плохиш ©   (2011-08-15 00:23) [14]


> rammic ©   (15.08.11 00:00) [11]

Зачем спрашиваешь, если ответы тебя не интересуют?


 
Германн ©   (2011-08-15 01:32) [15]


> rammic ©   (14.08.11 15:50)
>
> Со смирением прошу ответить.

А Паскаль ака Дельфи "строгий язык" в отличие от Си. И арифметику указателей не очень любит, хотя и приходится иногда.


 
Ega23 ©   (2011-08-15 08:52) [16]


>  И арифметику указателей не очень любит

С чего это???


 
Anatoly Podgoretsky ©   (2011-08-15 09:09) [17]

> Ega23  (15.08.2011 08:52:16)  [16]

Ограничена символьными указателями

> 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.

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


 
icWasya ©   (2011-08-15 09:30) [18]

Пара костылей

type
 PExtended = ^Extended; // указатель на единственный Extended
 TExtendedArray = array [0..MaxInt div Sizeof(Extended)-1] of Extended;
 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+  p^;
Inc(p); // почти p++
end;
end;


 
Ega23 ©   (2011-08-15 09:32) [19]


> Ограничена символьными указателями

Есть Inc и Dec. Если чё.


 
sniknik ©   (2011-08-15 09:38) [20]

> Пара костылей
ага, раз уж привык "на костылях" то ходи на них всю жизнь, не вздумай переучиваться, даже если "выздоровел"...

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


 
rammic ©   (2011-08-15 12:52) [21]

Похоже, сам того не желая, по своей малограмотности затронул слабое
место Delphi. Выходит что нужно вместо 2-х массивов иметь дело с тремя,
причем третий - искусственный - копия одного из нужных, или вместо 2-х простых массивов делать один многомерный, или  писать много type -ов.


 
RWolf ©   (2011-08-15 13:07) [22]


> [21]

Бред.


 
Dennis I. Komarov ©   (2011-08-15 13:08) [23]


> Похоже, сам того не желая, по своей малограмотности затронул
> слабое
> место Delphi.

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


 
Dennis I. Komarov ©   (2011-08-15 13:08) [24]


> Бред.

С пометкой "опасный"


 
rammic ©   (2011-08-15 13:25) [25]

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


 
sniknik ©   (2011-08-15 13:28) [26]

> слабое место Delphi.
это слабое место слабых умов...
при нескольких вариантах игнорировать нормальные, выбрать самый извращенный, и после злорадствовать, "а, вот! не может он так..."

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


 
sniknik ©   (2011-08-15 13:29) [27]

> мне казалось, что все будет проще.
ЧТО СЛОЖНОГО в [2]?????????????


 
RWolf ©   (2011-08-15 13:44) [28]

зачем копировать массивы?
чем объявление двумерного константного массива хуже объявления двух одномерных?
зачем вообще думать в сторону адресной арифметики? компилятор не сможет проверить её корректность, в отличие от индексации массивов.


 
rammic ©   (2011-08-15 13:47) [29]

Насколько я понял, возможно неверно, Юрий Зотов предлагает сделать
копию нужного массива и работать с ней. Конечно. это просто. Я так и
думал сделать, но надеялся  что мне посоветуют что-то интереснее.


 
Ega23 ©   (2011-08-15 13:53) [30]


> Я так и думал сделать, но надеялся  что мне посоветуют что-то интереснее.


Убей себя, спаси мир.
Впрочем нет, не убивай. Пойди работать. Моя зарплата вырастет, если таких как ты будет много.


 
RWolf ©   (2011-08-15 14:05) [31]


>  [29]

мне задача представляется как-то так:

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

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

function ConquerTheWorldWith(const AData: TMyData);
begin

end;


 ConquerTheWorldWith(MyData[Checkbox1.Checked]);


 
sniknik ©   (2011-08-15 14:29) [32]

> сделать копию нужного массива и работать с ней.
откуда "дровишки"? в [2] нет ни копий, ни советов их сделать...

> но надеялся  что мне посоветуют что-то интереснее.
и как это возможно если задачи нет? а то, что есть требует перевода на русский.


 
sniknik ©   (2011-08-15 14:32) [33]

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

сейчас  опять будут выводы в стиле "гадости заливной рыбы".


 
rammic ©   (2011-08-15 14:49) [34]

Мои познания в Си и Дельфи незначительные, поэтому я и задаю свои
вопросы. Буду очень благодарен если мне объяснят что я не понял в совете
Юрия Зотова.


 
Юрий Зотов ©   (2011-08-15 15:02) [35]

> rammic ©   (15.08.11 13:47) [29]

> Юрий Зотов предлагает сделать копию нужного массива и работать с ней.

Я долго искал, где же я это предлагал. Не нашел.

Работа с указателями в Delphi НИЧЕМ, КРОМЕ СИНТАКСИСА не отличается от работы с укзателями в C. И без всяких "слабых мест". Нет там никаких слабых мест - все ТО ЖЕ САМОЕ, что и в С.

В [11] Вы уже сами все написали. С единственной ошибкой, на которую Вам уже тоже указали в [13]. Что же еще нужно-то?

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

const
 arr : TArr = (1.3,0.3,5.4);

procedure TForm1.Button1Click(Sender: TObject);
var
 p : PArr; // Нам нужен указатель на МАССИВ, а не на extended
 a : extended;
begin
 p:= @arr;
 a:= p^[1];
end;


 
Юрий Зотов ©   (2011-08-15 15:04) [36]

Поправка:

TArr = array[0..2] of extended;


 
sniknik ©   (2011-08-15 15:17) [37]

> Буду очень благодарен если мне объяснят что я не понял в совете
> Юрия Зотова.
самое главное, и не обязательно в совете Юрия Зотова ты не понял/нимаешь одно... никто кроме тебя не знает, что именно ты не понял, и чего именно "нарешал/навыдумывал" глядя на очевидные (для знающих) основы примеры.
т.е. не спрашивай чего ТЫ НЕ ПОНЯЛ, а напиши, что понял и как... и тогда возможно тебе объяснять где ты не прав.
вот откуда взял, что советуют сделать копию???? ведь там ни слов, ни действий копирования, ничего похожего нет, есть пример адресации без указателей про которые у тебя и был вопрос.... но почему то его ты посчитал "неотвеченным", а пример за совет копирования НУ ВОТ ОТКУДА????


 
sniknik ©   (2011-08-15 15:22) [38]

> p : PArr; // Нам нужен указатель на МАССИВ, а не на extended
какая разница, пусть было бы указателем на extended

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

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


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


 
rammic ©   (2011-08-15 15:25) [39]

Спасибо, теперь все понятно. Прошу прощения за глупость и назойливость.


 
rammic ©   (2011-08-15 15:47) [40]

Понятно как сделать с указателями, но что такое адресация без указателей
не понятно. В совете [2] я не понял зачем всем элементам массива
присваивать 1. Ведь массив уже есть. Мне нужно брать из него заданный
элемент.



Страницы: 1 2 3 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.12.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.005 c
4-1252480292
TarenoKostanay
2009-09-09 11:11
2011.12.04
Имя процесса


15-1313092214
Медвежонок Пятачок
2011-08-11 23:50
2011.12.04
большой гудронный кошмайдер. комнатный вариант.


2-1313206942
Gu
2011-08-13 07:42
2011.12.04
Запуск от имени администратора


15-1309448004
R_R
2011-06-30 19:33
2011.12.04
Фундаментальные шахматы...


15-1313357399
Юрий
2011-08-15 01:29
2011.12.04
С днем рождения ! 15 августа 2011 понедельник





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский