2014-10-15 2 views
1

С этим заголовком уже много вопросов; однако ни одна проблема не касается моей проблемы. Я на самом деле пытается пройти по ссылке, но я получаю ошибку E2033: Types of actual and formal var parameters must be indentical при попытке скомпилировать мой код. Я пытаюсь передать три (3) переменные, каждая из них - Integer, две по ссылке (Var), а другая нет.Delphi: Типы фактических и формальных параметров должны быть одинаковыми

Ниже я не понимаю проблему с моим кодом. Я включил декларацию, определение и вызов.

Декларация Рутинное:

private 
    updateDeviceStatus(Var aReturnCount, aNotFoundCount: Integer; aNumOfDevices: Integer); 

Я попытался не конденсируются декларацию аргументов и объявил Var для первых двух, явно», однако, это не сработало.

Вопрос 1: является ошибкой, потому что я смешиваю по ссылке и по значению (если я правильно помню, некоторые языки этого не допускают)?

Определение Рутинное:

procedure TfrmReturnMeterToMfg.UpdateDeviceStatus(Var aReturnCount, aNotFoundCount: Integer; aNumOfDevices : Integer); 
begin 
    // DO SOMETHING 
end; 

Действительно, код в теле подпрограммы тривиальна в отношении этой проблемы и не влияет на проблему (по крайней мере, это не должно быть причиной в этом случае).

Призыв к Routine:

Следующая содержится в теле другого рутинных по:

// local variables: 
var ReturnCount, NotFoundCount, NumOfDevices: Integer; 
begin 

// SOMETHING HAPPENS TO EACH OF THESE VALUES (THEY ARE INCREMENTED) 

UpdateDeviceStatus([ReturnCount], [NotFoundCount], NumOfDevices); 
end; 

Тогда я получаю сообщение об ошибке.

Вопрос 2: Это результат моего синтаксиса при вызове подпрограммы (попытка передать аргументы)?

EDIT

Таким образом, вы можете быть удивлены (вы можете быть более опытный Delphi программист), «Где это жаворонка подобрать [ и ] немного? Вот ресурс я консультировал (и понять, почему Я посмотрел на ту вещь, в комментариях ниже):. consulted resource

+0

Почему вы помещаете '[' скобки '' 'вокруг аргументов в вызове? Вы хотите передать их в виде массивов? Зачем?И почему вы вызываете 'UodateDeviceStatus', когда имя функции' UpdateDeviceStatus' с 'p'? – JensG

+0

@JensG Итак, исходя из вашего комментария, что скобки не нужны? Во-вторых, это была опечатка с моей стороны при вводе кода в SO. Благодарю. – Thomas

+1

Да. Я просто хотел подтвердить, какие ошибки - это просто опечатки, а какие нет. ;-) – JensG

ответ

4

Я предполагаю, что скобки проблема Этот код работает для меня.

program Project12; 

{$APPTYPE CONSOLE} 

type 
TfrmReturnMeterToMfg = class 
private 
    procedure UpdateDeviceStatus(Var aReturnCount, aNotFoundCount: Integer; aNumOfDevices : Integer); 
end; 


procedure TfrmReturnMeterToMfg.UpdateDeviceStatus(Var aReturnCount, aNotFoundCount: Integer; aNumOfDevices : Integer); 
begin 
    // DO SOMETHING 
end; 

var thing : TfrmReturnMeterToMfg; 
    ReturnCount, NotFoundCount, NumOfDevices: Integer; 
begin 
    ReturnCount := 4; 
    NotFoundCount := 2; 
    NumOfDevices := 42; 

    thing := TfrmReturnMeterToMfg.Create; 
    thing.UpdateDeviceStatus(ReturnCount, NotFoundCount, NumOfDevices); 
    thing.Free; 
end. 

Добавление скобок вокруг аргумента полностью изменяет смысл кода, они что-то означают. В этом конкретном случае, добавив скобки, вы инструктируете компилятор пройти

UpdateDeviceStatus( 
    [ ReturnCount ],  // array or set of integer (with one element) 
    [ NotFoundCount ], // same again here 
    NumOfDevices   // integer 
); 

Это что-то совсем другое.

+2

Это может быть и «set». –

+0

В этом контексте, в качестве аргументов вызова функции, скобки могут быть интерпретированы только как конструкторы открытого массива. Я думаю. Разумеется, тип параметра не может определить тип переданного выражения. –

+1

Ха! Я был неправ. '[...]', поскольку фактический arg может быть либо установленным, либо массивом в зависимости от контекста. И это весело, когда у вас есть перегрузки, которые принимают множество и массив. Угадайте, какой из них подходит? !! :-( –

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