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

Вниз

Передача в качестве параметра динамичесского массива   Найти похожие ветки 

 
Sasha Shamray   (2004-01-17 23:24) [0]

Здравствуйте. Меня интересует один вопросс. В процедру передаеться динамичесский массив. Внутри он упорядочиваеться . После выхода из процедуры данный массив остаеться такой же как и до ее выполнения. Я предпологал что он после выхода будет упорядоченным. Что делать?
Вот такой приблизительно код:

var A:array of integer;
begin
setlength(a,100);
{тут присходит заполнение массива a}
sort(a);
{а тут массив не изменился}
end;

procedure sort(X:array of integer);
begin
{упорядочиваем массив}
{тут массив X упорядочен}
end;


 
Anatoly Podgoretsky   (2004-01-17 23:40) [1]

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


 
goga   (2004-01-17 23:54) [2]

А еще в объявлении процедуры сделать sort(var x:array of integer). var показывает, что ты передаешь в процедуру не копию данных массива, а указатель на массив. Соответственно только в этом случае и будет работать изменения процедурой данных


 
Sasha Shamray   (2004-01-18 00:19) [3]

Спасибо большое goga . Ваш ответ мне очень помог.


 
app   (2004-01-18 00:26) [4]

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

type
TIntArray = array of integer;
var
A: TIntArray;
...
procedure sort(X: TIntArray;);
...

А var как параметр если нужно менять значение переменной A


 
KSergey   (2004-01-18 06:43) [5]

> app © (18.01.04 00:26) [4]
> Правильнее тот путь который я указал

???!!!
Как это "я"? Раздвоение личности, или приоткрылась тайна, ранее мною незнаемая?


 
Думкин   (2004-01-18 07:13) [6]

> [5] KSergey © (18.01.04 06:43)

Тайны тут никакой - один ник для модерирования и приведения в чуйство, второй для общения с людьми. :))
Вот ведь - оффтоп.


 
KSergey   (2004-01-18 10:09) [7]

Ну видимо я один такой был - незнающий ;)


 
Тимохов   (2004-01-18 12:26) [8]

От себя хочу добавить.
app © (18.01.04 00:26) [4] прав в данном случае полностью. Т.е. если нужно изменять значения элементов динамического массива, но не нужно добавлять/удалять элементы.

Если нужно добавление/удаление, то нужно писать procedure sort(var X: TIntArray), иначе длинна массива не измениться.

Например,

type
tintarray = array of integer;

procedure func1(a: tintarray);
begin
a[0] := 2;
end;

procedure func2(a: tintarray);
begin
setlength(a, 2);
a[0] := 2;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
a: tintarray;
begin
setlength(a, 1);
a[0] := 1;
func1(a);
showmessage(inttostr(a[0])); // будет 2
a := nil;
setlength(a, 1);
a[0] := 1;
func2(a);
showmessage(inttostr(a[0])); // будет 1, а не 2
showmessage(inttostr(length(a))); // будет 1, а не 2
end;


Считаю, что это недоработка борланда.


 
Anatoly Podgoretsky   (2004-01-18 12:47) [9]

В чем недоработка?

KSergey © (18.01.04 06:43) [5]
Иногда скрипты барахлят, указывают совсем не то имя.


 
Тимохов   (2004-01-18 12:57) [10]

Anatoly Podgoretsky © (18.01.04 12:47) [9]
Недоработка - параметр переданный по значению, менять нельзя. При этом мой пример говорит о том, что иногда можно менять, а иногда нельзя - имхо это не очень хорошо. Дельфи же дает возможность менять значения. И потом, есть явное различие в работе со строками и с массивами - в аналогичной ситуации изменение строки не будет видно вызывающей стороне.


 
Anatoly Podgoretsky   (2004-01-18 12:59) [11]

Параметр изменить нельзя, он и не меняется, меняются данные на которые указывает указатель, это не одно и тоже. А сам параметр передается по значению.


 
Тимохов   (2004-01-18 13:01) [12]


> Anatoly Podgoretsky © (18.01.04 12:59) [11]
> Параметр изменить нельзя, он и не меняется, меняются данные
> на которые указывает указатель, это не одно и тоже. А сам
> параметр передается по значению.


А что со строкой по-другому? СТрока тоже указатель?


 
Тимохов   (2004-01-18 13:08) [13]

Я тут подумал - под "недаработкой" я понимаю, разное пеоведение (самантика, вроде как по научному) схожих структур - дин. массивов и ситрок.


 
Anatoly Podgoretsky   (2004-01-18 13:17) [14]

Тимохов © (18.01.04 13:01) [12]
Со строкой немного по другому, при присваении создается новая копия строки и меняются значения счетчиков, для массивов только значения счетчиков, это единственное различие. Связано с различиями в работе с массивами и строками, смущает обычно похожесть структур и методов доступа, но это если не знать и не задумываться. Но к передаче параметров это не относится, там все чисто.


 
Anatoly Podgoretsky   (2004-01-18 13:21) [15]

Да и прошу учесть один не маловажный факт, который обычно проходит мимо глаз. string в отличии от большинства других типов стоит особняком, это ключевое слово - то есть относится к языку, в отличии скажем от Integer и его обработка включена в язык на базовом уровне.
Вот например такой трюк нормальный


type
Integer = string;
var
I : Integer;
begin
I := "Test";


наоборот нет!


 
Тимохов   (2004-01-18 13:29) [16]

Anatoly Podgoretsky © (18.01.04 13:17) [14]
Методику работы со строками знаю: при копировании копируется указатель, но при первом изменении копии происходит раздвоение строк (возможно, при передаче в параметры, сразу создается копия - не помню), так, что изменения в копии не оказывают влияния на оригинал. Также знаю, что в массивах по-другому - сам всегда копируется указатель с изменением счетчика. Одним словом, почему так работает, знаю хорошо.

Вопрос в другом - в семантической целостности языка. Поясню. Думаю, что очень хорошо говорит о качестве языка возможность решить проблему одним заложенным разработчиками языка путем. Наверное, должны быть альтернативные способы - но основной поток деятельности должен быть один. Не удивляет ли Вас, почему по поводу дин. массивов часто возникают одни и те же вопросы? Меня, например, не удивляет. И не потому, что люди плохо читают маны, а потому, как борланд сам для себя не определил основной поток использования дин. массивов.

Данные мысли меня стали посещать особенно часто после прочтения некоторого кол-ва книг по проектированию. Возможно, это вредное влияние Буча, Румбаха и Якобсона... :(

Да... возможно, в "потрепаться" пора...


 
Anatoly Podgoretsky   (2004-01-18 13:44) [17]

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


 
Тимохов   (2004-01-18 13:50) [18]


> Может зря Борланд не документирует в справке устройство
> этих структур и особенностей работы при передачи параметров,
> а может и правильно, чтобы не лезли туда, где может произойти
> внутреннее изменение.


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

Думаю, что пока тему можно закрыть - она вечная... :)))



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

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

Наверх





Память: 0.49 MB
Время: 0.012 c
14-93665
mike_kanaev
2004-01-07 22:06
2004.01.29
d8


1-93485
INTAARI
2004-01-15 15:36
2004.01.29
TExcelWorksheet и TExcelApplication где взять хелп


14-93625
Карелин Артем
2004-01-08 15:32
2004.01.29
Басик-> Дельфи или Басик-> Си. Где найти прогу для перевода?


3-93398
Grihan
2003-12-30 12:13
2004.01.29
Как программно создать базу InterBase?


14-93691
Дремучий
2004-01-06 14:46
2004.01.29
Администрирование инет- кафе





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