Delphi ошибка e2033 types of actual and formal var parameters must be identical

В Delphi XE2 Компилятор ругается на функции WriteProcessMemory и ReadProcessMemory, выдавая ошибку

error E2033: E2033 Types of actual and formal var parameters must be identical

В Delphi7 всё работает замечательно.
Кто-нибудь сталкивался?

angry's user avatar

angry

8,64717 золотых знаков73 серебряных знака180 бронзовых знаков

задан 31 янв 2012 в 11:26

Григорий Пономарёв's user avatar

Григорий ПономарёвГригорий Пономарёв

8151 золотой знак10 серебряных знаков25 бронзовых знаков

2

Сравним определение методов в 2010 (7ки под рукой нет) и XE2:

//Delphi 2010
function ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
  nSize: DWORD; var lpNumberOfBytesRead: DWORD): BOOL; stdcall;
function WriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
  nSize: DWORD; var lpNumberOfBytesWritten: DWORD): BOOL; stdcall;

//Delphi XE2
function ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer;
  lpBuffer: Pointer; nSize: SIZE_T; var lpNumberOfBytesRead: SIZE_T): BOOL; stdcall;
function WriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer;
  lpBuffer: Pointer; nSize: SIZE_T; var lpNumberOfBytesWritten: SIZE_T): BOOL; stdcall;

Т.е. все что нужно — это явно указать тип данных для переменной, передаваемой в качестве lpNumberOfBytesWritten, как SIZE_T.

SIZE_T, очевидно, появился с поддержкой 64-битных систем.

ответ дан 31 янв 2012 в 18:15

Nofate's user avatar

NofateNofate

34.3k15 золотых знаков65 серебряных знаков93 бронзовых знака

2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
TYPE
     MASSIV = ARRAY[1..52] OF REAL;
     MASSIV2 = ARRAY[1..52] OF integer;
     MASSIV1 = ARRAY[1..53] OF REAL;
var
k,P,H,N,i,j:integer;
x,WSPOM,Y:MASSIV;
m:MASSIV2;
 
a:MASSIV1;
Y1,Ynom,U,C,C1:real;
 
begin
{1. Vvod ishod dannih}
writeln('Vvedite chislo datch - k');
readln(k);
writeln('Vvedite nomera datchikov (kanalov oprosa) - M');
 
  for i:=1 to k do
    begin
     write('nomer ',i,'-');
     readln(m[i]);
   end;
 
writeln('Vvedite nomer kanala s upravl vozd - P');
readln(p);
writeln('Vvedite nomer chislo datch otklika obekta na uprav - H');
readln(h);
writeln('Vvedite nomin jelaem znach otklnomer - Ynom');
readln(Ynom);
writeln('Vvedite chislo taktov virabotki upravl vosdeyst - N');
readln(N);
 
writeln('Vvedite koeff zakona uprav - A');
 
  for i:=1 to k+1 do
    begin
     write('koef ',i-1,'-');
     readln(a[i-1]);
   end;
   {Vivod Ishod dannih}
 
writeln('Ishodnie dannie:');
writeln('Vvedite nomer kanala s upravl vozd - P=',p);
writeln('Vvedite nomer chislo datch otklika obekta na uprav - H=',H);
writeln('Vvedite nomin jelaem znach otklnomer - Ynom=',Ynom);
writeln('Vvedite chislo taktov virabotki upravl vosdeyst - N=',N);
 
writeln('koeff zakona uprav - A');
 
  for i:=1 to k+1 do
     writeln('koef ',i-1,'=',a[i-1]:6:2);
 
 
   C:=0;
for j:=2 to N do
  begin
 
{2. Opros kanalov i vivod izmer X}
  for i:=1 to k do
   OPROS(M[i],x[i],WSPOM);
 
writeln('Izmeren znachen X');
  for i:=1 to k do
   write('x[ ',i,']=',x[i]:6:2);
writeln;
 
{3. Rassch velichini upravliauchego znachen U po formule upravl}
i:=1;
U:=A[i-1];
for i:=1 to k do
  U:=U+A[i]*x[i];
writeln('Rassch velichini upravliauchego znachen U po formule upravl=',U:6:2);
 
{4. Ustanov v kanale P rasschitan znachenie upravl vozdey U}
UPRAV(P,U,WSPOM);
 
{5-6. Opros kanala H i zapomn izmeren znachen otklika Y1}
    OPROS(H,Y[H],WSPOM[H]);
writeln('Opros kanala H i zapomn izmeren znachen otklika Y1=',Y1:6:2);
    OPROS(H,Y[j],WSPOM[j]);    }
writeln('Opros kanala i zapomn izmeren znachen otklika Y[',j,']=',Y[j]:6:2);
{7. Raschet suumi C}
C:=C+sqr(Y[j]-Ynom);
end;
C:=C+sqr(Y1-Ynom);
{8. Vichis C1}
C1:=C/N;
writeln('C1=',C1:6:2);
readln;
end. 
 
Модуль:
 TYPE
     MASSIV = ARRAY[1..52] OF REAL;
 
PROCEDURE OPROS(KANAL:INTEGER; VAR XIZM:REAL; VAR WSPOM : MASSIV);
PROCEDURE UPRAV(KANAL:INTEGER; UPR :REAL; VAR WSPOM : MASSIV);
 
IMPLEMENTATION
 
PROCEDURE OPROS;
(* Имитатор об"екта исследования : KANAL - номер канала опроса;  *)
(* XIZM - результат измерения по каналу; WSPOM - вспомогательный *)
(* массив типа REAL  с 52 элементами. *)
 
var
   i,j,j1,j2 : integer ;
   t,jtim,r,r1,r2,r3,r4,delt,tau,dx : real;
   h,m,s,s100 : word;
 
 
PROCEDURE GAUSS ( R,S : REAL; VAR R1:REAL);
(* Генерация псевдослучайных нормальных чисел *)
 
var
  i:integer;
  r2:real;
 
begin
   r1:=0; for i:=1 to 12 do
   begin
     r2:=0.001*random(1000); r1:=r1+r2
   end; r1:=(r1-6)*s+r
end; (* GAUSS *)
 
PROCEDURE IZMER7( J : INTEGER);
(* Генерация независимых переменных *)
var
   r,rr : real;
 
 
begin
   GetTime:=formatdatetime('tt',time);
   {DecodeTime(GetTime,h,m,s,s100); rr:=s; r:=m;} rr:=+60*r; r:=h;
   rr:=strtofloat(copy(GetTime,7,2))+strtofloat(copy(GetTime,4,2))*60+3600*strtofloat(copy(GetTime,1,2));
   wspom[11]:=rr;  r:=0.001*random(1000);
 
   if j=1 then wspom[1]:=-20+50*r else
   if j=2 then wspom[2]:=740+30*r else
   if j=3 then wspom[3]:=50+50*r  else
   if j=4 then
   begin
      wspom[4]:=0; if r>0.5 then wspom[4]:=1
   end else
   if j=5 then
   begin
      wspom[5]:=2; if r<=0.33333 then wspom[5]:=1 else
      if r>=0.666667 then wspom[5]:=3
   end else
   if j=6 then
   begin
      wspom[6]:=0; if r>0.5 then wspom[6]:=1
   end
end; (* IZMER7 *)
 
begin
   (* Начало основной части процедуры OPROS *)
   randomize;
 
   if kanal>=1 then
   begin
 
      if kanal <=10 then
      begin
  (* Независимые переменные *)
         wspom[11]:=0; if kanal <= 6 then IZMER7(kanal);
         r:=wspom[kanal]
      end else if kanal <= 70 then
      begin
         r4:=0; r:=1; GAUSS(r4,r,r1);  ShowMessage('gauss='+floattostr(r1));
         if kanal <= 25 then
         begin
   (* Лин. регресс. модель - пассивный эксперимент *)
            j1:=kanal-11; j2:=kanal-18;
            r:=30+j1*5-(5-j2*0.14)*wspom[1]+(0.6-j1*0.014)*wspom[2]+
               (350-j1*10)*wspom[4]-(3-j2*0.07)*wspom[1]*wspom[4]+
               (0.05+j1*0.001)*wspom[1]*wspom[3]+0.01*wspom[3]*wspom[3];
            r1:=5*r1
         end else if kanal <= 40 then
         begin
   (* Лин. регресс. модель - активно-пассивный эксперимент *)
            j1:=kanal-26; j2:=kanal-33;
            r:=100+j1*20+(7+j1*0.5)*wspom[1]+(0.6+j2*0.01)*wspom[2]-
               (15+j1*2)*wspom[5]+(4+j2*0.1)*wspom[7]+
               (40+j1*2)*wspom[8]+(0.01+j2*0.0005)*wspom[1]*wspom[2]-
               (0.5+j2*0.01)*wspom[7]*wspom[8]+(0.7-j1*0.02)*wspom[5]*
               wspom[7]-(0.15-j1*0.01)*wspom[1]*wspom[1]+(30-j1*1.4)*
               wspom[8]*wspom[8] ;
            r1:=5*r1
         end else if kanal <= 55 then
         begin
   (* Нелин. модель - пассивный эксперимент *)
            r:=30+(kanal-41)*3+(10+(kanal-48)*0.5)*exp((0.055-
               (kanal-41)*0.001)*wspom[1])-(2+(kanal-50)*0.1)*
               exp(0.07*wspom[1]-(0.0001+(kanal-46)*0.00002)*wspom[2]+
               (1+(kanal-48)*0.06)*wspom[4]);
            r1:=1.5*r1
         end else if kanal <= 70 then
         begin
   (* Нелинейная модель - активно-пассивный эксперимент *)
            j1:=kanal-56; j2:=kanal-63;
            r:=60+(kanal-65)*3+(-5.5+j1*0.1)*exp((0.05+j1*0.001)*
               wspom[1]+(-0.1+j2*0.006)*wspom[9])+(9-j1*0.2)*
               exp((-0.55+j1*0.01)*wspom[10]+(0.7+j2*0.03)*wspom[5]);
            r1:=1.5*r1
         end;
         r:=r+r1
      end else if kanal <= 85 then
      begin
   (* Динамическая модель - инерционное звено *)
       GetTime:=formatdatetime('tt',time);
       jtim:=strtofloat(copy(GetTime,7,2))+strtofloat(copy(GetTime,4,2))*60+3600*strtofloat(copy(GetTime,1,2));
         {decodetime(GetTime,h,m,s,s100); jtim:=s; r4:=m; jtim:=jtim+60*r4;
         r4:=h; jtim:=jtim+3600*r4;} tau:=15-(kanal-71)*0.4;
         r:=0; r3:=0; for i:=20 downto 1 do
         begin
            r2:=jtim-wspom[i+12]; r2:=r2/tau;
            if r2<=50 then r:=r+(wspom[i+32]-r3)*(1-exp(-r2));
            r3:=wspom[i+32]
         end; r:=(20+(kanal-78)*2)*r;
 
      end else
      begin
         j1:=kanal-100; r1:=j1*0.1; r4:=1; GAUSS(r1,r4,r)
      end
   end ; xizm:=r; wspom[12]:=dx
end;
 
PROCEDURE UPRAV;
(* Имитация подачи управл. воздействия на об'ект *)
type
   mm = array[1..4] of real;
 
var
   i,i1,j1 : integer;
   t,jtim,r: real;
   umin,umax : mm;
   h,m,s,s100 : word;
 
begin
   umin[1]:=-70; umax[1]:=-umin[1];
   umin[2]:=-3;  umax[2]:=-umin[2];
   umin[3]:=-5;  umax[3]:=-umin[3];
   umin[4]:=-2.5;umax[4]:=-umin[4];
   if ((kanal < 7) or (kanal > 10)) then
   writeln(' ОШИБКА UPRAV : канал N',kanal:7,' упр.возд.=',upr:10:3)
   else
   begin
      j1:=kanal-6; if upr>umax[j1] then upr:=umax[j1]
      else if upr<umin[j1] then upr:=umin[j1];
      wspom[kanal]:=upr;
      if kanal=10 then if abs(wspom[33]-upr)>=0.01 then
      begin
GetTime:=formatdatetime('tt',time);
       jtim:=strtofloat(copy(GetTime,7,2))+strtofloat(copy(GetTime,4,2))*60+3600*strtofloat(copy(GetTime,1,2));
         {Decodetime(GetTime,h,m,s,s100); jtim:=s; r:=m; jtim:=jtim+60*r;
         r:=h; jtim:=jtim+3600*r;}
         for i:=2 to 20 do
         begin
            i1:=22-i; wspom[i1+32]:=wspom[i1+31];
            wspom[i1+12]:=wspom[i1+11]
         end;
         wspom[33]:=upr; wspom[13]:=jtim;
 
      end
   end
end;
END.


Помогите исправить ошибку при компиляции в Delphi.

От: Аноним

 
Дата:  20.01.11 01:39
Оценка:

При компиляции выдает несколько сотен ошибок такого рода:

1. Types of actual and formal var parameters must be identical
2. Record, object or class type required

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

procedure SomeProc(var Value: Cardinal);

То при таком раскладе:

var
i: Integer
begin
SomeProc(i) — будет орать: Types of actual and formal var parameters must be identical
end;

Есть ли какие то директивы компилятор, что бы исправить эту проблему??

На счет второй ошибки такая же фигня..

Заранее благодарю!


Re: Помогите исправить ошибку при компиляции в Delphi.

От:

LGB

Канада

 
Дата:  20.01.11 02:56
Оценка:

1 (1)
+1

Здравствуйте, Аноним, Вы писали:

А>При компиляции выдает несколько сотен ошибок такого рода:


А>1. Types of actual and formal var parameters must be identical

А>procedure SomeProc(var Value: Cardinal);
А>То при таком раскладе:

А>var

А> i: Integer
А>begin
А> SomeProc(i) — будет орать: Types of actual and formal var parameters must be identical
А>end;

А>Есть ли какие то директивы компилятор, что бы исправить эту проблему??

Нужно объявить i: Cardinal, a не Integer.
Или наоборот: SomeProc(var Value: Integer);
Delphi же говорит вам открытым текстом: типы должны быть одинаковыми, насяльника (must be identical). Так дайте ей, что она хочет!


Re[2]: Помогите исправить ошибку при компиляции в Delphi.

От:

irbis3003

 
Дата:  20.01.11 03:02
Оценка:

-1

Здравствуйте, LGB, Вы писали:

LGB>Нужно объявить i: Cardinal, a не Integer.

LGB>Или наоборот: SomeProc(var Value: Integer);
LGB>Delphi же говорит вам открытым текстом: типы должны быть одинаковыми, насяльника (must be identical). Так дайте ей, что она хочет!

Да уж, дэлфи как женщина — не всегда очевидно то, что она хочет, часто капризничает, но если просит — лучше дать..)


Re[3]: Помогите исправить ошибку при компиляции в Delphi.

От: Аноним

 
Дата:  20.01.11 03:09
Оценка:

Здравствуйте, irbis3003, Вы писали:

I>Здравствуйте, LGB, Вы писали:


LGB>>Нужно объявить i: Cardinal, a не Integer.

LGB>>Или наоборот: SomeProc(var Value: Integer);
LGB>>Delphi же говорит вам открытым текстом: типы должны быть одинаковыми, насяльника (must be identical). Так дайте ей, что она хочет!

I>Да уж, дэлфи как женщина — не всегда очевидно то, что она хочет, часто капризничает, но если просит — лучше дать..)

Хеххх.. Это я на примере привел одну функцию…))) А в реале компилятор выдает несколько сотен таких ошибок.. И как и все исправлять..


Re[4]: Помогите исправить ошибку при компиляции в Delphi.

От:

wellwell

Австралия

https://www.softperfect.com
Дата:  20.01.11 03:19
Оценка:

» Аноним 943 » <0@users.rsdn.ru> wrote in message news:4123492@news.rsdn.ru…
> Хеххх.. Это я на примере привел одну функцию…))) А в реале компилятор выдает несколько сотен таких ошибок.. И как и все исправлять..

Ручками. Видимо там текст на FreePascal или еще каком-то диалекте, где так было делать можно.

Posted via RSDN NNTP Server 2.1 beta


Re[4]: Помогите исправить ошибку при компиляции в Delphi.

От:

irbis3003

 
Дата:  20.01.11 03:29
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Хеххх.. Это я на примере привел одну функцию…))) А в реале компилятор выдает несколько сотен таких ошибок.. И как и все исправлять..

Код чужой чтоли под себя перебираешь?
Или компилишь по завершению набора текста в тысячу строк — откуда столько ошибок?))


Re[4]: Помогите исправить ошибку при компиляции в Delphi.

От:

A.V

 
Дата:  20.01.11 19:18
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, irbis3003, Вы писали:


I>>Здравствуйте, LGB, Вы писали:


LGB>>>Нужно объявить i: Cardinal, a не Integer.

LGB>>>Или наоборот: SomeProc(var Value: Integer);
LGB>>>Delphi же говорит вам открытым текстом: типы должны быть одинаковыми, насяльника (must be identical). Так дайте ей, что она хочет!

А>Хеххх.. Это я на примере привел одну функцию…))) А в реале компилятор выдает несколько сотен таких ошибок.. И как и все исправлять..

Ну можно еще объявить в этом модуле type Сardinal = Integer, но это правда уже из серии ‘#define true (random()>0.5)’


Re[5]: Помогите исправить ошибку при компиляции в Delphi.

От:

LGB

Канада

 
Дата:  20.01.11 21:59
Оценка:

Здравствуйте, A.V, Вы писали:

A.V>Ну можно еще объявить в этом модуле type Сardinal = Integer, но это правда уже из серии ‘#define true (random()>0.5)’

Месье знает толк в извращениях!


Re[4]: Помогите исправить ошибку при компиляции в Delphi.

От:

Mr.Delphist

 
Дата:  21.01.11 17:36
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, irbis3003, Вы писали:


А>Хеххх.. Это я на примере привел одну функцию…))) А в реале компилятор выдает несколько сотен таких ошибок.. И как и все исправлять..

Именно что указывать правильные типы — так и исправлять. Потому как Cardinal — это беззнаковый тип, Integer — знаковый. И хотя разрядность по расходу памяти у них одинакова (по 4 байта на брата), взаимозаменяемыми эти типы НЕ являются.

Вообще, смешение знаковой и беззнаковой арифметики — серьезная бомба, отлаживать наплачетесь. Например, тривиальные циклы вида «while (i >= 0)» начинают вести себя причудливым образом

Подождите ...

Wait...

  • Переместить
  • Удалить
  • Выделить ветку

Пока на собственное сообщение не было ответов, его можно удалить.

Delphi Compiler Error

E2033 Types of actual and formal var parameters must be identical

Reason for the Error & Solution

For a variable parameter, the actual argument must be of the exact type of the formal parameter.

program Produce;

procedure SwapBytes(var B1, B2 Byte);
var
  Temp: Byte;
begin
  Temp := B1; B1 := B2; B2 := Temp;
end;

var
  C1, C2 0..255;     (*Similar to a byte, but NOT identical*)
begin
  SwapBytes(C1,C2);   (*<-- Error message here*)
end.

Arguments C1 and C2 are not acceptable to SwapBytes, although they have the exact memory representation and range that a Byte has.

program Solve;

procedure SwapBytes(var B1, B2 Byte);
var
  Temp: Byte;
begin
  Temp := B1; B1 := B2; B2 := Temp;
end;

var
  C1, C2 Byte;
begin
  SwapBytes(C1,C2);   (*<-- No error message here*)
end.

So you actually have to declare C1 and C2 as Bytes to make this example compile.

Solution 1

You just need to remove the var in the Control parameter and make it a value parameter. Because Delphi objects are actually implemented as reference types, you can call methods on them, change member fields etc. even if you pass them to a procedure as a value or const parameter.

Solution 2

Just remove var — you don’t need it to change Control’s properties:

procedure Change_prop(Control: TControl;height:integer;width:integer);
begin
......
end;

Solution 3

As David said, the problem’s in the var. That doesn’t mean that you can modify the members of the TControl, it means you can replace the TControl with another, completely different TControl, because objects are reference types.

If you’re passing an object to a var parameter, the variable you pass has to be declared as exactly the same type as the parameter in order to preserve type safety. Otherwise, you could do this:

procedure TForm1.VarControl(var control: TControl);
begin
  control := TButton.Create;
end;

procedure TForm1.Mistake;
begin
  VarControl(self.Memo1); //defined as TMemo
  Memo1.Lines.Text := 'Undefined behavior here...';
end;

Comments

  • I am trying to write a procedure in delphi.
    This procedure gets the name of TControl descendent element and then try to change some properties.
    But when i try to do it, Delphi gives an error like:

    E2033 Types of actual and formal var
    parameters must be identical

    Procedure:

    procedure Change_prop(var Control: TControl;height:integer;width:integer);
    begin
    //......
    end;
    

    Usage Example : Change_prop(Label1, 50,200);
    What can be the solution of that error..Thanks.

  • There is no such thing as undefined behaviour in Object Pascal, it is only available to C users. TTrouble(Pointer(Random(MaxInt))).AskFor(EXPLICIT)

  • @user205376 what are you going on about?!!

  • @David: I think it was a joke.

  • Clearly I need to get out more and stop SO rep-hunting!!

  • @User, although Delphi has no formal concept of undefined behavior the way C and C++ do, it’s still a useful term. The Delphi language doesn’t say what will happen in the situation Mason demonstrated. If you’re lucky, your program will crash immediately, but you might have data corruption, stack corruption, or even no errors at all. It’s futile to attempt to reason any further about the expected behavior of the program; all sorts of things could happen, and they may depend on outside factors, including the OS, compiler, and library versions.

  • What about when for example I want to call OnKeyDown event, where the «Key» parameter has «var» written…? Is there any way to call it directly like OnKeyDown(Self, VK_RETURN, ssNone) (which throws the error in the title), or do we need to create subprocedure to be called from within OnKeyDown event, and can as such be used elsewhere….?

  • @Just You should not call event handlers. Let the framework do that. If you need to share code, put it in a method that you call from the event handler.

  • I actually used the Perform method, using WM_KEYDOWN as sender, and it seems to work just fine. Thanks!

  • @Just Not the best way to do it

  • THe same goes for output parameters, out or var will give this problem.

Recents

Related

  • Delphi как убрать сообщение об ошибке
  • Delphi webbrowser ошибка сценария
  • Delphi try except код ошибки
  • Delphi try except вывести ошибку
  • Delphi getlasterror текст ошибки