Autor Beitrag
reptile
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Mo 06.04.09 16:51 
folgendes problem:

ich habe in meinem programm zwei klassen A und B. die klasse A besitzt als variable ein "array[0..5] of B"

nun will ich eine funktion schreiben, die als rückgabewert ein objekt der klasse A liefert. nur scheint es mir leider nicht möglich zu sein, in dieser funktion die felder in dem "array[0..5] of B" zu ändern, bzw überhaupt festzulegen. sobald ich das versuche erscheint eine fehlermeldung. alle anderen variablen von A lassen sich problemlos festlegen in der funktion, nur das array lässt sich nicht ansprechen. geht sowas etwa gar nicht ?

das sind die klassen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  TMovement = class(TObject)
    ID : integer;
    counter : integer;
    factor1, factor2, degree : real;
  end;
  TEnemy = class(TObject)
    x,z : real;
    movementlist : array[0..5of TMovement;
    time, hp, move : integer;
  end;


das ist die funktion:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function create_weak_fighter(hp, time : integer; x,z : real) : TEnemy;
begin
create_weak_fighter := TEnemy.Create;
create_weak_fighter.x := x;
create_weak_fighter.z := -15;
create_weak_fighter.time := time;
create_weak_fighter.hp := hp;
create_weak_fighter.move := 0;
create_weak_fighter.movementlist[0].ID := 2;               << hier erscheint der fehler
create_weak_fighter.movementlist[0].counter := 50;
create_weak_fighter.movementlist[1].ID := 1;
end;


über die bedeutung der variablen braucht ihr euch keine gedanken zu machen..


Zuletzt bearbeitet von reptile am Mo 06.04.09 17:34, insgesamt 2-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 06.04.09 16:59 
Moin!

user profile iconreptile hat folgendes geschrieben Zum zitierten Posting springen:
falls gewünscht kann ich auch noch den entsprechenden code posten
Es wäre sicher sinnvoll, mal die Deklatation deiner Klassen zu sehen. :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 06.04.09 17:26 
Ich weiß nicht, wie dein Konstruktor von TEnemy aussieht, aber wenn du ihn nicht verändert hast, fehlt die Speicherreservierung für TMovement:create_weak_fighter.movementlist[0] := TMovement.Create;
Das kannst du aber im Konstruktor von TEnemy erledigen, wenn du sowieso alle 5 TMovements brauchst, oder aber im setter von Movementlist:
ausblenden volle Höhe Delphi-Quelltext
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:
  TEnemy = class(TObject)
    x,z : real;
    movementlist : array[0..5of TMovement;
    time, hp, move : integer;
  public {?}
    constructor Create;  
  end;


constructor TEnemy.Create;
var
  i : Integer;
begin
  inherited Create;
  for i := 0 to 5 do
    movementlist[i] := TMovement.Create; //bin mir jetzt grad nicht ganz sicher, ob ich das hier korrekt anspreche...
end;

{oder (so ähnlich ... >_> )}

TMovementList = array[0 .. 5of TMovement;

TEnemy = class(TObject)
    x,z : real;
    time, hp, move : integer;
  private {?}
    FMovementlist : TMovementList;
    procedure SetMovement(X: Integer; Value: TMovement);
  public {?}
    property Movementlist[X : Integer] : TMovementList read FMovementlist write SetMovement;
  end;

procedure TEnemy.SetMovement(X: Integer; Value: TMovement);
begin
  if not Assigned(FMovementlist[X]) then
    FMovementlist[X] := TMovement.Create;

  FMovementlist[X].Assign(Value); //Assign musst du dir für TMovement noch selbst schreiben.
  //Assign soll die Werte von Value in das Movementobjekt kopieren. NICHT sowas schreiben:
  //FMovementlist[X] := Value;
  //Hier würde nämlich der Pointer von Value kopiert werden und das könnte unter Umständen Probleme geben.
end;

Mit der zweiten Methode hab ich keinerlei Erfahrung, das hab ich jetzt alles aus den bereits in Delphi vorliegenden Klassen entnommen (Siehe z.B. TCanvas.Pixels und dessen Setter/Getter oder TPicture.SetGraphic). Die erste ist sicher einfacher zu implementieren.
Oder du nimmst halt einfach das, was ich zu allererst gesagt hab ;)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
reptile Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Mo 06.04.09 17:34 
vielen dank, das hat geholfen (die erste methode)

jetzt im nachhinein ist mir das komplett klar weshalb das nicht funktionieren konnte, aber ich hab mal wieder den wald vor lauter bäumen nicht gesehen..