Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Открытый массив 
:(
    Опции темы
Scrip
Дата 24.5.2004, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



Можно ли считать открытый массив динамическим массивом предствляющим собой параметр подпрограммы?
__________________________________________________________
Что такое конструктор массива и для чего он нужен?

Это сообщение отредактировал(а) Scrip - 24.5.2004, 14:42
PM MAIL   Вверх
Kesh
Дата 24.5.2004, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 4
Всего: 54



Мне вопрос непонятен, поясни, что такое открытый массив?..
Добавлено @ 17:35
Что ты имеешь в виду под конструктором массива? SetLength?


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Jey_k
Дата 24.5.2004, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: 1
Всего: 61



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

Если все так, то связи в первом предложении не вижу(не обижайся, может не так понял)
А конструктор-процедура создания.

qwe:array[1..10] of integer; например



--------------------
PM MAIL WWW   Вверх
p0s0l
Дата 25.5.2004, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Открытый массив - массив неизвестного размера. Пример:
Код
procedure Proc1(var m : array of integer);
var i : integer;
begin
 for i := Low(m) to High(m) do m[i] := i;
// можно вместо Low(m) писать просто 0...
end;

Но это не динамический массив. Ответ на вопрос - нет.
К примеру, я не смогу в Proc1 написать SetLength(m, 10);
Сколько выделил памяти под m, столько и могу использовать...
Можно передать дин. массив в качестве открытого массива, также как и статический:
Код

var
 stat : array [4..11] of integer;
 dyn : array of integer;
begin
 SetLength(dyn, 20);
 Proc1(dyn);
 Proc1(stat);
end;

При передаче дин. массива передается указатель на первый элемент данных, и длина дин. массива (которая не известна на этапе компиляции).
При передаче стат. массива в качестве открытого массива длина массива сразу известна на этапе компиляции...


--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 25.5.2004, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



ЗЫ: Насчет статических массивов: можно схитрить насчет длины. Например, для приведенной выше процедуры можно сделать так:
Код
type PseudoP1 = procedure (Adr : pointer; Len : cardinal);
var
 stat : array [4..11] of integer;
begin
 asm push ebp end;
 PseudoP1(@Proc1)(@stat, 5);
end;

В результате, хоть и размер статического массива = 8, обработке в Proc1 пойдут только первый 6 (5+1=6) элементов... Ну это так, мало ли кому будет лень передавать еще один параметр для указания размера массива...



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 25.5.2004, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
Что такое конструктор массива и для чего он нужен?

Пример:
Код
procedure Proc1(m : array of integer);
var
 i : integer;
begin
 for i := Low(m) to High(m) do
   Form1.ListBox1.Items.Add(IntToStr(m[i]));
end;

Тут m - открытый массив. Пример вызова:
Код
var z : array [0..5] of integer;
begin
...
 Proc1(z);
end;

Пример использования конструктора:
Код
var
 a,b,c,d : integer;
begin
 ...
 Proc1([1,6,4,7,3,4,a,b,c,d]);
end;

Думаю, из примера видно что конструктор налету собирает массив.



--------------------
С уважением, г-н Посол.
PM   Вверх
Unregistered
Дата 25.5.2004, 02:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(p0s0l @ 25.5.2004, 01:23)
Код

var
 stat : array [4..11] of integer;
 dyn : array of integer;
begin
 SetLength(dyn, 20);
 Proc1(dyn);
 Proc1(stat);
end;

При передаче дин. массива передается указатель на первый элемент данных, и длина дин. массива (которая не известна на этапе компиляции).
При передаче стат. массива в качестве открытого массива длина массива сразу известна на этапе компиляции...

p0s0l, чего-то не понял.... в приведенном тобой коде, в процедуру передается динамический массив без параметра его длины... А дальше ты пишешь, что надо передавать длину массива. И так ли обязательно передавать длину массива? У меня написана длл в которой реализованы такие функции:
Код

function CheckAnswer (AAnswer:array of byte):boolean;stdcall;
var TmpBuf:array of byte;
begin
 if AAnswer[0]<>1 then
 begin
   Result:=false;
   exit;
 end;
 SetLength(TmpBuf,4);
 Move(AAnswer,Pointer(TmpBuf)^,4);
 if not CheckCS(TmpBuf) then
 begin
   Result:=false;
   exit;
 end;
 if not CheckCS(AAnswer) then
  begin
   Result:=false;
   exit;
 end;
 Result:=true;
end;

и внутренняя функция длл

function CheckCS(Buff:array of byte):boolean;stdcall;//контрольная сумма, не экспортируется
var i,CS:integer;
begin
 CS:=0;
 For i:=0 to SizeOf(Buff)-2 do
   CS:=CS+Buff[i];
 While CS>255 do
   dec(CS,255);
 Result:=(CS=Buff[SizeOf(Buff)-1]);
end;


Вызывая первую функцию я передаю ей динамический массив, в CheckCS передаю и динамический массив и открытый массив - SizeOf отлично справляется (как видно нет параметра передающего длину массива). Твой ответ заставил меня задуматься, а правильно ли я это реализовал? Поясни, пожалуйста.
PS написано несколько программ с использованием этой длл, и все нормально работает.
  Вверх
p0s0l
Дата 25.5.2004, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Я неправильно выразился. И имел в виду, что длина массива передается неявным параметром, что я потом и показал с помощью "псевдо"-функции...


--------------------
С уважением, г-н Посол.
PM   Вверх
Scrip
Дата 25.5.2004, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



Цитата

Пример использования конструктора:
Код

var
a,b,c,d : integer;
begin
...
Proc1([1,6,4,7,3,4,a,b,c,d]);
end;


Думаю, из примера видно что конструктор налету собирает массив.

Непонятно. Что значит конструктор налету собирает массив? Какой массив? Ведь при выполнении процедуры Proc1 не описано каким фактическим параметром заменить формальный параметр m. bored.gif

Это сообщение отредактировал(а) Scrip - 25.5.2004, 13:44
PM MAIL   Вверх
Unregistered
Дата 25.5.2004, 13:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











p0s0l, спасибо. С асмом у меня туговато.
  Вверх
p0s0l
Дата 25.5.2004, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
Непонятно. Что значит конструктор налету собирает массив? Какой массив?

Какой массив ? Вот такой: [1,6,4,7,3,4,a,b,c,d] - в квадратных скобках друг за другом перечислены элементы передаваемого массива...
Что значит "Налету собирает" ? Конструктор создает в стеке временный массив из перечисленных элементов, и передает указатель на него и длину (но это мы не видим), после завершения вызванной процедуры массива уже не будет... Конструктором можно пользоваться только для передачи параметров. И они не могут передаваться в качестве var-параметров (понятно почему)...
Вот два абсолютно эквивалентных примера (даже код в результате генерится одинаковый):
Код
procedure Proc1(m : array of integer);
begin
  ...
end;

var m : array [0..3] of integer;
begin
  m[0] := 0;
  m[1] := 1;
  m[2] := 2;
  m[3] := 3;
  Proc1(m);
end;

Код
procedure Proc1(m : array of integer);
begin
  ...
end;

begin
  Proc1([0,1,2,3]);
end;




--------------------
С уважением, г-н Посол.
PM   Вверх
Scrip
Дата 25.5.2004, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



Цитата
К примеру, я не смогу в Proc1 написать SetLength(m, 10);
Сколько выделил памяти под m, столько и могу использовать...

Если "Открытый массив - массив неизвестного размера", то под m память вообще не выделена. Так? Или ... нет... не так
Добавлено @ 14:23
Все, с конструктором разобрался!

Это сообщение отредактировал(а) Scrip - 25.5.2004, 14:23
PM MAIL   Вверх
p0s0l
Дата 25.5.2004, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
Если "Открытый массив - массив неизвестного размера", то под m память вообще не выделена. Так? Или ... нет... не так

Выделена. Процедура Proc1 на этапе компиляции не знает размер массива. При выполнении же программы она в качестве дополнительного параметра (которого мы не видим) получает размер массива...



--------------------
С уважением, г-н Посол.
PM   Вверх
Kesh
Дата 25.5.2004, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 4
Всего: 54



Цитата(p0s0l @ 25.5.2004, 15:24)
При выполнении же программы она в качестве дополнительного параметра (которого мы не видим) получает размер массива...

Разве?.. Мне казалось, что получив указатель (только его)... Она уже сама определяет размер массива... Я не отрицаю того, что этот размер хранится в программе, но по-моему в процедуру он в заголовке не передается...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
p0s0l
Дата 25.5.2004, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Kesh, если я тебе дам только указатель на ячейку памяти, как ты узнаешь сколько массив занимает ? Он может и 10 байт занимать, а может 10 мб...
Если я в var'е написал:
m : array [0..31] of byte;
То m займет ровно 32 байта. В памяти нигде не хранится размер этого массива...



--------------------
С уважением, г-н Посол.
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.