Указатель броска с практическими рекомендациями на универсальный тип параметра?

Когда вы запустите это, рано или поздно, вероятно, что 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); 

, вы повторяете вызов с другими значениями, поэтому рекурсия имеет шанс завершиться.

5
задан jpfollenius 4 February 2009 в 13:03
поделиться

2 ответа

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

PObject(@Value)^ := Ptr;

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

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

Кроме того, существует проблема с текущим Delphi 2 009 дженериков с созданием указателей для ввода типов параметра. Универсальные указатели не поддерживаются компилятором, но компилятор разрешает этот синтаксис в классах:

type
  C<T> = class
  type
    PT = ^T; // UNSUPPORTED!
  end;

Это может работать на определенные сценарии - и может быть полезно для Вашей определенной проблемы - но она только работает случайно и обычно не поддерживается. Используйте на Ваш собственный риск.

10
ответ дан 13 December 2019 в 22:18
поделиться

Попробуйте это:

Value := TObject (Ptr)

Никакая потребность бросить больше, как присвоение TObject к универсальному типу класса переменная действительна :)

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

0
ответ дан 13 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: