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

Вниз

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

 
SergP ©   (2016-07-28 17:03) [0]

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

будет ли такое правильно работать, если написать так:
function Recurse(MyArray:TMyArray...): ...

?

или такое придется реализовывать другими способами?


 
iop ©   (2016-07-28 17:14) [1]

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

и зачем по значению (что бы это ни значило для массива)?
чтобы по возвращению из рекурсии получить неизмененный старенький массив?


 
Sha ©   (2016-07-28 17:28) [2]

> включая изменение его размера

SetLength и так создает уникальную копию строки/массива


 
Sha ©   (2016-07-28 17:34) [3]

а, вообще, для развернутого ответа требуется развернутый вопрос )


 
iop ©   (2016-07-28 17:36) [4]

динамический массив по значению

имею массив трех длинных строк. динамический.
"мама", "мыла", "раму"

хочу передать его по значению
какое значение у этого массива?

"мама устала" или "рама чистая" ?


 
SergP ©   (2016-07-28 17:38) [5]


> и передавать его далее рекурсивно самой себе.
>
> и зачем по значению (что бы это ни значило для массива)?
>
> чтобы по возвращению из рекурсии получить неизмененный старенький
> массив?


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


 
iop ©   (2016-07-28 17:41) [6]

по значению это один фик никогда не передается.


 
SergP ©   (2016-07-28 17:53) [7]


> iop ©   (28.07.16 17:36) [4]
>
> динамический массив по значению
>
> имею массив трех длинных строк. динамический.
> "мама", "мыла", "раму"
>
> хочу передать его по значению
> какое значение у этого массива?
>
> "мама устала" или "рама чистая" ?


Забыл сказать: У меня динамический массив, элементами которого являются статические структуры.

Да и уже я прикинул что передавать массив в принципе можно и по ссылке, а в самой функции делать его копию, которую и передавать далее...


 
iop ©   (2016-07-28 17:55) [8]

цель-то какая?

откусить побольше памяти или чего  полезного хочется сделать?


 
Sha ©   (2016-07-28 18:07) [9]

DELPHI>type
 TIntegerArray= array of integer;

procedure proc(const a: TIntegerArray; var sum: integer);
var
 b: TIntegerArray;
 len: integer;
begin;
 if a<>nil then begin;
   len:=Length(a)-1; b:=a; SetLength(b, len);
   sum:=sum+a[len];
   proc(b, sum);
   end;
 end;

procedure TForm1.Button2Click(Sender: TObject);
var
 a: TIntegerArray;
 i, sum: integer;
begin;
 SetLength(a,5);
 for i:=0 to Length(a)-1 do a[i]:=i;
 sum:=0;
 proc(a, sum);
 Memo1.Lines.Add(IntToStr(sum));
 end;


 
Sha ©   (2016-07-28 18:14) [10]

> а в самой функции делать его копию, которую и передавать далее

Часто бывает (например в играх),
что один шаг рекурсии не очень сильно портит исходные данные.

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


 
SergP ©   (2016-07-28 18:56) [11]


> iop ©   (28.07.16 17:55) [8]
>
> цель-то какая?
>
> откусить побольше памяти
>


Ну почему сразу такие мысли?

Цель - произвести некоторые вычисления вероятностей. Так скажем, смесь математических методов с небольшим брутфорсом.
массив небольшой, максимальный размер исходного массива оценивается на уровне 35 элементов по 24 байта. Вложенность рекурсии на глаз в среднем должна быть порядка 10 а то и меньше, но даже в крайнем случае она не может превышать размерности массива.

Так что этим памяти я много не откушу.


 
iop ©   (2016-07-28 19:33) [12]

то есть желание передать по значению - это для того, чтобы
если текущий шаг рекурсии поработал с массивом, но "не в ту строну",
то ныряем в следующую итерацию, которой нужен массив неизмененный с начала
предыдущего шага?

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

в конце к тому же будет наглядно видно как и куда шли и как работает алгоритм.


 
Sha ©   (2016-07-28 19:53) [13]

> iop ©   (28.07.16 19:33) [12]

а мне почему-то сразу вспомнились шпингалеты )


 
SergP ©   (2016-07-29 09:53) [14]

В принципе лучше будет создавать в самой функции копию массива.
Тут суть такова:

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



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

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

Наверх





Память: 0.48 MB
Время: 0.001 c
15-1472570154
sniknik
2016-08-30 18:15
2018.09.02
Чудо? :)


2-1469714607
SergP
2016-07-28 17:03
2018.09.02
Передача функции динамического массива по значению


2-1469695491
vegarulez
2016-07-28 11:44
2018.09.02
[TWebbrowser+JS] Как проверить переменную js?


2-1470210735
p
2016-08-03 10:52
2018.09.02
Как получить выравнивание текста колонки


2-1468753424
Антонов Саша
2016-07-17 14:03
2018.09.02
Delphi 10 Seattle, преобразование типов





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