Когда вы запустите это, рано или поздно, вероятно, что left
будет на единицу меньше, чем right
- например, может быть left = 3
и right = 4
.
В этом случае (left - right) / 2
и (right - left) / 2
оба оцениваются как 0
, поскольку целочисленное деление округляется до нуля. Итак, если у вас есть
int mid = (left - right)/2 + right;
sort(array, helper, left, mid);
в вашем вызове на sort(array, helper, left, right)
, то вы повторяете вызов с точно такими же значениями. Это вызывает бесконечную рекурсию - StackOverflowError
.
Но когда у вас есть
int mid = left + (right - left)/2;
sort(array, helper, left, mid);
, вы повторяете вызов с другими значениями, поэтому рекурсия имеет шанс завершиться.
Необходимо взять адрес местоположения универсального типа параметра типа, затем преобразовать тип этого адреса к указателю на желаемый тип, и затем разыменовать этот указатель и присвоиться в получающееся местоположение. Например:
PObject(@Value)^ := Ptr;
Причина Вы не можете только преобразовать тип значения типа T, где T неограничен, состоит в том, что компилятор не знает размера T; обычно, нечисловые преобразования типа могут только преобразовать значения в типы, которые имеют тот же размер.
К сожалению, компилятор не достаточно умен, чтобы выяснить, что ограничение типа класса означает, что T, как гарантируют, будет тем же размером как указатель.
Кроме того, существует проблема с текущим Delphi 2 009 дженериков с созданием указателей для ввода типов параметра. Универсальные указатели не поддерживаются компилятором, но компилятор разрешает этот синтаксис в классах:
type
C<T> = class
type
PT = ^T; // UNSUPPORTED!
end;
Это может работать на определенные сценарии - и может быть полезно для Вашей определенной проблемы - но она только работает случайно и обычно не поддерживается. Используйте на Ваш собственный риск.
Попробуйте это:
Value := TObject (Ptr)
Никакая потребность бросить больше, как присвоение TObject
к универсальному типу класса переменная действительна :)
Но я не знаю причину, почему Вы не можете использовать T
для кастинга во-первых...