Autor Beitrag
Xearox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Sa 14.02.15 07:19 
Guten Morgen Zusammen,

ich versuche mich, wohl schon x-ten mal, an einem Kleinen Spiel :D

Nun bekomme ich beim Compilieren folgende Fehlermeldung: [DCC Fehler] game.pas(115): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

Was ich aber leider nicht ganz verstehe, ist mir irgendwie zu hoch, da ich functionen bisher immer verwendet habe und damit noch keinerlei Probleme hatte.

Hier einmal meine Function selbst

ausblenden Delphi-Quelltext
1:
2:
3:
4:
function TGameTickThread.NeuerRessStand(var AktuellerStand, GebAnzahl, RessMuliplikator : integer):integer;
begin
  result := AktuellerStand + (GebAnzahl * RessMuliplikator);
end;


Die Function ist in der Klasse TGameTickThread angesiedelt. Welche so ausschaut.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TGameTickThread = class(TThread)
    procedure Execute; override;
    procedure Ausgabe;
  private
    { Private-Deklarationen }
    function NeuerRessStand(var AktuellerStand, GebAnzahl, RessMuliplikator : integer):integer;
  public
    { Public-Deklarationen }
  end;


Nun rufe ich innerhalb von Execute die function auf.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TGameTickThread.Execute;
var
  I: Integer;
begin
  try
    while not Terminated do
    begin
      Synchronize(Ausgabe);
      CompleteTicks := CompleteTicks + 1;
      for I := 0 to High(SpielerArray) - 1 do
      begin
        SpielerArray[i].HolzStand     := NeuerRessStand(SpielerArray[i].HolzStand,2,50); //Die 2 anderen Werte sind frei gewählte Werte, also 2 und 50
        SpielerArray[i].EisenStand    := NeuerRessStand(SpielerArray[i].EisenStand,3,50);
        SpielerArray[i].NahrungStand  := NeuerRessStand(SpielerArray[i].NahrungStand,4,50);
        SpielerArray[i].GoldStand     := NeuerRessStand(SpielerArray[i].GoldStand,5,50);
      end;
      Sleep(1000); //GameTick 1000 = 1 Sekunde
    end;
  except
    on e: Exception do ShowMessage('Fehler aufgetreten');
  end;
end;


Und aber hier funktioniert es nicht mehr, dort erhalte ich wie oben geschrieben, immer wieder die selber Fehlermeldung.

Rufe ich die Function nun selber auf, also einfach nur RessourcenStand := NeuerRessStand(5000,20,200)

Kommt wieder die selbe Fehlermeldung, obwohl ich nur Integer Werte an die function übergebe. Mache ich da irgendwas falsch? Liegt das eventuell daran, das ich die function innerhalb eines Threads aufrufe?
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Sa 14.02.15 10:29 
Da der Compiler eine Fehlermeldung rauswirft, hast du natürlich was falsch gemacht. Und die Fehlermeldung zeigt auch deutlich, wo der Fehler liegt.

Die Deklaration von NeuerRessStand deklariert alle drei Parameter als var-Parameter. Also müssen auch drei variablen angegeben werden, wenn die Routine aufgerufen wird. die Zahlen 2,3,4,5 und 50 sind aber keine Variablen.

Ändere also die Deklaration von NeuerRessStand entsprechend ab oder übergebe Variablen. Da ich die nächste Frage schon kenne:

ausblenden Delphi-Quelltext
1:
function NeuerRessStand(var AktuellerStand: integer; GebAnzahl, RessMuliplikator : integer):integer;					


In der alten Form sind die Variablen alle hintereinander weg (durch das Komma), ergo alle var. In der neuen Form wird diese Kette unterbrochen (durch das Semikolon).

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Sa 14.02.15 10:59 
user profile iconOlafSt hat folgendes geschrieben Zum zitierten Posting springen:
Da der Compiler eine Fehlermeldung rauswirft, hast du natürlich was falsch gemacht. Und die Fehlermeldung zeigt auch deutlich, wo der Fehler liegt.

Die Deklaration von NeuerRessStand deklariert alle drei Parameter als var-Parameter. Also müssen auch drei variablen angegeben werden, wenn die Routine aufgerufen wird. die Zahlen 2,3,4,5 und 50 sind aber keine Variablen.

Ändere also die Deklaration von NeuerRessStand entsprechend ab oder übergebe Variablen. Da ich die nächste Frage schon kenne:

ausblenden Delphi-Quelltext
1:
function NeuerRessStand(var AktuellerStand: integer; GebAnzahl, RessMuliplikator : integer):integer;					


In der alten Form sind die Variablen alle hintereinander weg (durch das Komma), ergo alle var. In der neuen Form wird diese Kette unterbrochen (durch das Semikolon).


Das sehe ich ja jetzt erst ... Jetzt wo du mich drauf hingewiesen hast...da ist mir ein VAR zwischen gerutscht ...

Alle anderen functionen hab ich so gemacht

ausblenden Delphi-Quelltext
1:
function TGameTickThread.NeuerRessStand(AktuellerStand, GebAnzahl, RessMuliplikator : integer):integer; //Richtige Version, ohne VAR					


Danke für deine Hilfe =)
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Sa 14.02.15 19:23 
So ist das manchmal mit dem Wald und den Bäumen ;)

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.