2013-12-19 4 views
0

Например, у меня есть перечислениецелое число с перечисляемым типом как var?

const 
    MY_FIRST = 1; 
    MY_SECOND = 2; 
    MY_THIRD = 3; 
type 
    TMyEnum = MY_FIRST .. MY_THIRD; 

и у меня есть функция, как

procedure DoSomething(var _type: TMyEnum); 

, где я должен пройти integer в TMyEnum. Поступая

var 
    some_int_value: integer; 
begin 

DoSomething(TMyEnum(some_int_value)); 

У меня есть ошибка [DCC Error] : E2197 Constant object cannot be passed as var parameter. Как это решить?

+6

С риском звукового педантизма то, что вы объявили, на самом деле не является перечислением - это несколько констант и целочисленный тип субдиапазона. Объявление enum потеряло бы константы и заменило бы существующий 'TMyEnum' на' TMyEnum = (MY_FIRST, MY_SECOND, MY_THIRD); 'или более идиоматически:' TMyEnum = (meFirst, meSecond, meThird); '. –

+0

На самом деле это было перечисление, пока это был код C. Некоторые вещи, которые мы не можем перевести с C на Delphi 1x1. – user2091150

ответ

4

var параметр требует реальной переменной, например:

var 
    some_int_value: integer; 
    my_enum: TMyEnum; 
begin 
    my_enum := TMyEnum(some_int_value); 
    DoSomething(my_enum); 
    some_int_value := Ord(my_enum); 
4

TEnum С является поддиапазон Integer компилятор только использует наименьший возможный тип, который соответствует этому поддиапазон. В этом случае это Byte.

Так что если some_int_value были объявлены как Byte, ваш тип будет успешным. Но он на самом деле объявлен как Integer, поэтому typecast вводит временный Byte, чтобы сохранить результат приведения типа. Компилятор не заходит так далеко, чтобы написать какие-либо изменения этого временного байт обратно к источнику приведения типов. Вот почему вы получаете описанную ошибку.

Смежные вопросы