В Delphi нет такого типа пустоты. То, на что вы ссылаетесь, называется нетипизированный параметр .
Нетипизированный параметр - это всегда фактическая вещь , а не указатель на то, что вы должны использовать. Следовательно, правильный способ использования CopyMemory
с таким параметром - применить к нему оператор @
, например:
CopyMemory(@MyVar, @Arr[0], size);
Обратите внимание, я также изменил способ передачи второго параметра. Лучше, если вы не полагаетесь на тот факт, что динамический массив действительно является указателем на первый элемент. Если вам нужен указатель на первый элемент, просто скажите об этом явно, как я сделал здесь.
Ваша путаница связана с проведенным вами тестом, в котором параметр использовался, как если бы он был указателем, и этот тест, похоже, работал. Однако я сомневаюсь в правильности этого теста. Когда вы сказали Pointer(MyString)^
, то, что у вас было, было первым символом строки. Когда вы тогда сказали Pointer(MyVar)
внутри функции, вы приводили этот тип в указатель, который был недопустимым. Если ваша программа оказалась работоспособной, то это было только случайно; Ваш код был неправильным.
Лучший совет, который я могу дать, это не набирать вещи, если только вам это не нужно. И когда вы это сделаете, пожалуйста, будьте уверены, что вещь, которую вы печатаете, действительно имеет этот тип. В вашем случае вам не нужно ничего приводить к типу, прежде чем передать его как нетипизированный параметр. Вы можете позвонить Method1
так:
Method1(MyString[1], Length(MyString) * Sizeof(Char));
(я умножаю на SizeOf(Char)
, поскольку не знаю, есть ли у вас Delphi 2009 или нет.)
Кроме того, избегайте нетипизированных параметров. Одна из замечательных вещей, которую может сделать компилятор для обеспечения правильности программы, - обеспечить безопасность типов, но когда вы убираете типы, компилятор больше не может вам помочь.