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

Поиск:

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


Новичок



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

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



p0s0l, а сколько выделена? Намерняка мы этого опять незнаем sad.gif
Размер массива процедуры Proc1 равен фактичекому параметру, заменившему формальный параметр процедуры proc1. Если понял что я сказал ответь пожалста. smile.gif cool.gif

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


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


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

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



Ну вроди типа того... smile.gif


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


Эксперт
****


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

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



p0s0l Ну дал ты мне указатель m: array of integer; Ну и что мне мешает сделать так
Код
Size := (High(m)+1)*SizeOf(Integer);



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


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


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

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



Kesh, ну и как же по-твоему прога узнает значение High(m) ?
Из космоса бог пошлет что ли ? Как раз этот самый High(m) и передается в качестве неявного невидимого параметра...



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


Эксперт
****


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

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



А ты уверен, что он передается, а не хранится в программе?..


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


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


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

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



Kesh, такое ощущение, что ты надо мной издеваешься... smile.gif
В самом начале было сказано, что у открытого массива длина на этапе компиляции неизвестна. Как тогда High(m) может быть известен компилятору, если процедуре могут передать как массив из 10 элементов, так и массив из 1000 элементов ? Где этот High(m) по-твоему может хранится ? Это раз.
Во-вторых, тоже, почти в начале же выявил с помощью псевдо-функции неявный параметр, который как раз является High(m)...



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


Эксперт
****


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

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



p0s0l Ничего я над тобой не издеваюсь... Мне в самом деле непонятно...
Цитата
В самом начале было сказано, что у открытого массива длина на этапе компиляции неизвестна.
Не согласен, 4байта - на указатель + ???(ну не знаю я) байт на описание типа.
Цитата
Как тогда High(m) может быть известен компилятору, если процедуре могут передать как массив из 10 элементов, так и массив из 1000 элементов ? Где этот High(m) по-твоему может хранится ? Это раз.
А по-моему он хранится в самой программе, так сказать в ее глобальной части... Ну как глобальные переменные, а вовсе не передается как скрытый параметр при вызове процедуры... ИМХО передается только ссылка, а по этой ссылке уже идет обращение к программе (к глобальному модулю), откуда и берется описание...
Цитата
Во-вторых, тоже, почти в начале же выявил с помощью псевдо-функции неявный параметр, который как раз является High(m)...
А это действительно так... Есть у меня проблема... Не верю я на слово... То, что ты написал - действительно иллюстрирует работу со статикой и динамикой... но, ИМХО, не более... Где это запостулировано, что исполняется программа именно так?..

P.S. Мне действительно интересно...


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


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


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

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



Цитата
Не согласен, 4байта - на указатель + ???(ну не знаю я) байт на описание типа.
Это вообще про что ? Размер указателя и размер массива - разные вещи. Откуда взялось 4 байта ? И что за описание типа ? Теперь уже мне ничего не понятно... butbut.gif
Цитата
А по-моему он хранится в самой программе, так сказать в ее глобальной части... Ну как глобальные переменные, а вовсе не передается как скрытый параметр при вызове процедуры... ИМХО передается только ссылка, а по этой ссылке уже идет обращение к программе (к глобальному модулю), откуда и берется описание...

Гм... Пример:
Код

procedure Proc1(var m : array of integer);
begin
...
end;

var
 a : array [1..10] of integer;
 b : array [1..20] of integer absolute a;

begin
 Proc1(a);
 Proc1(b);
end;

Два массива разной длины начинаются с одного и того же адреса (накладываются друг на друга).
В обоих вызовах Proc1 мы передаём указатель на одну и ту же ячейку памяти... И как процедура Proc1 определит, длину какого массива ей использовать: a и b ? Ведь по твоей гипотезе ей передается только указатель... Так что тут облом будет...
Цитата
А это действительно так... Есть у меня проблема... Не верю я на слово... То, что ты написал - действительно иллюстрирует работу со статикой и динамикой... но, ИМХО, не более... Где это запостулировано, что исполняется программа именно так?...
Не понял. Тебе надо цитату из справки Delphi привести ? Да наверное, там такого нет. Не будут они углубляться в хелпе во всякие подробности ненужные...
Ну если не веришь - проверь сам. Набери чуть выше приведенный пример. В дебаггере глянь на вызовы Proc1:
Код
lea eax, [ebp-$28]
mov edx, 9
call Proc1

lea eax, [ebp-$28]
mov edx, 19
call Proc1

lea eax, [ebp-$28] в обоих вызовах загружает в eax один и тот же адрес - начало массива a (или массива b, т.к. они наложены друг на друга).
Далее в edx засовывается макс. элемент массива (тот самый High(m)).
Далее идет вызов Proc1...


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


Эксперт
****


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

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



Цитата
Откуда взялось 4 байта ?
Я думал, что именно столько занимает указатель...
Цитата
В обоих вызовах Proc1 мы передаём указатель на одну и ту же ячейку памяти... И как процедура Proc1 определит, длину какого массива ей использовать: a и b ? Ведь по твоей гипотезе ей передается только указатель... Так что тут облом будет...
Ну здесь ты вообще передаешь статические массивы... Я спрашивал про динамические... Тут вот что выдает...
Код
var
a : array of integer;
b : array of integer absolute a;

procedure Proc1(var m : array of integer);
begin
 m[0] := m[0];
end;

begin
Proc1(a);
Proc1(b);
end.

Код
Proc1(a);
mov eax, [a]
call @DynArrayHigh
mov edx, eax
mov eax, [a]
call Proc1
............
Proc1(b);
mov ebx, [a]
mov eax, ebx
call @DynArrayHigh
mov edx, eax
mov eax, ebx
call Proc1


И что по-твоему означает call @DynArrayHigh
Добавлено @ 23:36
Оно же засовывает High(m) в edx... a в Proc1 передается eax... Мне вот интересно... Ведь Proc1 берет значение из edx сама... Этот самый High берется из программы...


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


Лентяй 2
***


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

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



Как не напиши:
procedure Proc1(var m : array of integer);
или
procedure Proc1(m : array of integer);

в Proc1 - передается указатель на массив и не явно максимальный номер массима.

Если напишим:

var XXX: array [1..2] of ..
begin
...
Proc1(xxx);
...
end;
то в Proc1 - длина массива без проблемм опредилится.

А если напишим:

Type
TXXXP:array of ...
var XXX: array of ..
XXXP:^TXXXP;
n:array of ..
T:TList;
begin
SetLength(XXX,...)
...
Proc1(xxx);
...
n:=xxx;
SetLength(n,...)
...
Proc1(n);
...
T:=TList.Create;
New(XXXP);
XXXP^:=n;
T.ADD(XXXP);
...
XXX:=T.Items[...];
...
Proc1(xxx);
...
end;

то в Proc1 - при определении длины массива случаются осечки.

По этому лудше всегда дополнительно указывать явно максимальное значение массива, т.е:
procedure Proc1(var m : array of integer;IMax:integer);


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 28.5.2004, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Kesh, ты хоть представляешь о чем речь идёт ? Я тебе об одном, а ты оказывается совсем о другом...
Я сказал, что при передаче массива в качестве отрытого массива процедуре Proc1 передаётся:
1) Адрес начала данных
2) № макс. элемента массива (High(m)) (неявно)
И далее дискуссия шла именно об этом.
Я тебе привел пример со статическим массивом. А ты - с динамическим:
Цитата
mov ebx, [a]
mov eax, ebx
call @DynArrayHigh
mov edx, eax

mov eax, ebx
call Proc1

Как видишь, DynArrayHigh вызывается перед вызовом Proc1, а не в самой Proc1. Далее идёт:
Цитата
но же засовывает High(m) в edx... a в Proc1 передается eax...

А edx КУДА передаётся ??? Он идёт туда же в Proc1, и если в процедуре Proc1 встретится High(m), то будет использоваться значение edx.
Как ни крути, но ты сам щас доказал, что передается адрес массива (eax) и длина массива (edx)...

Я так понял, ты пытаешься доказать, что длина динамического массива хранится где-то в ОП. Зачем мне это доказывать ? Я и так с тобой бы согласился... Но длина статического массива всё же нигде не хранится...

Girder, если вместо
Код
XXX:=T.Items[...];
...
Proc1(xxx);
поставить:
Код
 XXXp:=T.Items[0];
 Proc1(xxxp);

то всё ок будет, т.к. ты пытался сделать что-то не очень понятное (указатель присвоить массиву, в итоге компилятор решил вообще ничего не делать с xxx). Или же так:
Код
type txxxpp = ^txxxp;
...
XXX:=txxxpp(T[0])^;
Proc(xxx);



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


Лентяй 2
***


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

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



Код
XXXp:=T.Items[0];
Proc1(xxxp);

Это и имелось в виду! Просто ошибся.

И я не спорю с тобой, а стараюсь разъяснить.

Когда то я тоже писал вот-так:
-procedure Proc1(var m : array of ...);
или(кто как хочет пускай и пишит)
-procedure Proc1(m : array of ...);

Но в один прекрасный момент сталкнулся с проблеммой
не правильного определения размера массива в
exclamation.gif вызываемой exclamation.gif процедуре.
Не спорю - это могло произойти только на моем компьютере,
в данном версии компилятора, в это утро, при этом расположении планет и т.п. хрень - но это произошло(а за много лет программирования в Delphi не первый раз сталкнулся с этой проблеммой)

Это сообщение отредактировал(а) Girder - 28.5.2004, 03:11


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 28.5.2004, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата
не правильного определения размера массива в
вызываемой  процедуре.

Странно это. Тем более что было сказано, что не в вызываемой процедуре определяется размер массива, а в вызывающей...
Всё равно, интересно было бы взгянуть на это, но это, как понимаю, единственный случай, и его теперь не воссоздать.
Но суть не в этом. Эта проблема не открытого массива, а твоя проблема. Или проблема TList'а, или чего там использовал.
Ведь в твоем примере, если сделать так:
Код
XXX:=T.Items[...];
// Proc1(xxx); уберем вызов этой функции, чтобы не отвлекала
for i := 0 to High(X) do XXX[i] := i;

И тут бы всплыла точно та же проблема у тебя. Без всяких передач массива в другую процедуру. Потому что ошибка определения длины происходит тут, а не там (в вызываемой процедуре).
(В данном случае вообще ошибки не происходит, просто делается не то что хотелось...)


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


Лентяй 2
***


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

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



Код
XXX:=T.Items[...];
// Proc1(xxx); уберем вызов этой функции, чтобы не отвлекала
for i := 0 to High(X) do XXX[i] := i;

О... с этим я сталкнулся еще раньше.

Цитата
Странно это

Ни чё, зато заставляет быть более предусмотрительным при написании
программы.

Цитата
Всё равно, интересно было бы взгянуть на это, но это, как понимаю, единственный случай, и его теперь не воссоздать.

Не единственный, но ты прав сейчас не воссоздам. А эксперементировать лень, да и некогда(хотя по моему это одно и тоже). Но если вдруг(обещенного три года ждут) - вышлю.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 28.5.2004, 03:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата
Ни чё, зато заставляет быть более предусмотрительным при написании
программы.

Я говорил, что странно то, что у тебя размер неправильно определялся в вызываемой процедуре. Хотя определяется-то он в вызывающей... Ну да ладно... Всё равно без багов никуда. Хотя многие баги при ближайшем рассмотрении оказываются и не багами...



--------------------
С уважением, г-н Посол.
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.1215 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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