Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2010, 17:49   #1
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию Обращение к элементам массива через указатель

Как можно получить доступ к каждому элементу массива с помощью указателя на него? Вот пример для наглядности:

Код:
type
  TByteArray = array[0..0] of Byte;
  PByteArray = ^TByteArray;

var
  A: array[0..9] of Byte;


procedure InitArrai(Array_: PByteArray);
begin
  // Определение длины
  // Инициализация
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  InitArrai(@A); // Вызываем метод
end;

Последний раз редактировалось Miha85193; 17.07.2010 в 17:55.
Miha85193 вне форума Ответить с цитированием
Старый 17.07.2010, 23:12   #2
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Такой подмены компилятор не поймет и длина массива, переданного в параметре всегда будет равна 1. Независимо от того какой массив передается. Адрес @А (а это и есть указатель) реального массива транслируется в тип TByteArray, а он имеет длину в 1 байт.

Последний раз редактировалось Karabash; 17.07.2010 в 23:14.
Karabash вне форума Ответить с цитированием
Старый 18.07.2010, 02:37   #3
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

А если сделать вот так:
Код:
type
  TByteArray = array[0..0] of Byte;
  PByteArray = ^TByteArray;

var
  A: PByteArray;


procedure InitArrai(Array_: PByteArray);
begin
  // Определение длины
  // Инициализация
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  GetMem(A, 10);
  InitArrai(A); // Вызываем метод
end;
Miha85193 вне форума Ответить с цитированием
Старый 18.07.2010, 03:29   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

указательные массивы это не array. вообще такого типа нет.
посмотрите примеры работы со ScanLine
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.07.2010, 03:43   #5
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Вы не сможете таким образом узнавать размер массива. Его придётся помнить отдельно - или в глобальных или передавать вместе с указателем в функции/процедуры...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 18.07.2010, 10:17   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от DomiNick
Вы не сможете таким образом узнавать размер массива. Его придётся помнить отдельно - или в глобальных или передавать вместе с указателем в функции/процедуры...
+1
Полностью согласен!

к слову, а зачем этот огород? Если речь идёт о Delphi - то там есть динамические массивы (это которые array of тип). Чем они не устраивают?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.07.2010, 00:25   #7
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

Цитата:
к слову, а зачем этот огород? Если речь идёт о Delphi - то там есть динамические массивы (это которые array of тип). Чем они не устраивают?!
Тем, что динамический массив не возможно передать в качестве параметра так, как размер не постоянный.
Miha85193 вне форума Ответить с цитированием
Старый 19.07.2010, 00:32   #8
ZaRDaK
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 197
По умолчанию

Куда его нельзя передать в качестве параметра, пример бы.
Размер спокойно опередляется Length(arr);
ZaRDaK вне форума Ответить с цитированием
Старый 19.07.2010, 00:47   #9
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

В процедуры и функции конечно же. Если бы было возможным передавать методам динамические массивы в качестве параметров, то согласен, длину определить не проблема.
Miha85193 вне форума Ответить с цитированием
Старый 19.07.2010, 00:55   #10
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от Miha85193 Посмотреть сообщение
В процедуры и функции конечно же. Если бы было возможным передавать методам динамические массивы в качестве параметров, то согласен, длину определить не проблема.
а почему не передать его как открытый массив?
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обращение к элементам двумерного массива через указатели в С++ серг Помощь студентам 17 06.12.2009 18:00
обращение к элементам двумерного массива через указатели серг Общие вопросы C/C++ 2 05.12.2009 23:33
Обращение к элементам массива через указатель в С++ серг Помощь студентам 1 24.11.2009 01:30
обращение к элементам двумерного массива через указатели в С ++ серг Помощь студентам 0 23.11.2009 22:43