и количество туда где array of в качестве аргумента?
имею ввиду выполнение program project1; {$mode delphi}{$H+} uses gvector; type TTest2=TVector<integer>; TDummyArr=array[0..0]of integer; PTDummyArr=^TDummyArr; procedure WriteArgs(const Args:array of integer); var i:integer; begin for i:=low(args) to high(args) do writeln(args[i]); end; var arr:TTest2; begin arr:=TTest2.Create; arr.PushBack(1); arr.PushBack(2); arr.PushBack(3); arr.PushBack(4); WriteArgs(PTDummyArr(arr.Mutable[1])^[0..1]); readln; end. и подобного без "страшных" кастований
не ответ на вопрос, но просто.. вчера в какой-то статье читал, возможно у GunSmoker'а, что array of Type на самом деле неявно передаётся как два параметра: указатель и размер
А это вроде чисто FPC'шная фишка, такой [a..b] кусок передавать
да. удобно передавать куски без копирования. но там где физического доступа к массиву нет - приходится выкручиваться. неплохо бы получить законный способ
хз. у дельфистов надо интересоваться
Немного не так, там адрес буфера и индекс последнего элемента, но это CompilerMagic и руками такое провернуть будет сложновато
array of x в параметре и тип array of x это 2 разные вещи
Насколько я помню - да
да, мы в курсе))
Я вот до вчерашнего дня не был в курсе )
но сегодня ты уже был в курсе))
Ну а что Си++ думает по этому поводу? 😄 Есть чему тут повозмущаться? Типа что пишется одинаково, выглядит одинаково, но совершенно разное!
ничего, в плюсах тип не зависит от того в параметрах он или нет
нечему тут возмущаться. это отличная фича))
а это не тип. это синтаксис переменного числа аргументов
Ну, я не пробовал такое ни разу
https://www.freepascal.org/docs-html/rtl/system/slice.html
или нескопирует?
Смотрю по отладчику - копирования нету
program project1; {$mode delphi}{$H+} uses gvector; type TTest2=TVector<integer>; TDummyArr=array[0..0]of integer; PTDummyArr=^TDummyArr; procedure WriteArgs(const Args:array of integer); var i:integer; begin for i:=low(args) to high(args) do writeln(args[i]); end; var arr:TTest2; begin arr:=TTest2.Create; arr.PushBack(1); arr.PushBack(2); arr.PushBack(3); arr.PushBack(4); WriteArgs(PTDummyArr(arr.Mutable[1])^[0..1]); WriteArgs(slice(PTDummyArr(arr.Mutable[1])^,2));//так работает WriteArgs(slice(PInteger(arr.Mutable[1]),2));//а хочется так(( readln; end.
Идею понял, тут немного не то, но руками хоть не надо тип создавать: WriteArgs(slice(PIntegerArray(arr.Mutable[1])^,2));
В Generic интересно получится обернуть - универсальный массив создать?
Обсуждают сегодня