AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Zugriffsfverletzung - Aber warum

Zugriffsfverletzung - Aber warum

Ein Thema von Premaider · begonnen am 18. Okt 2012 · letzter Beitrag vom 18. Okt 2012
Antwort Antwort
Premaider

Registriert seit: 31. Mär 2012
160 Beiträge
 
#1

Zugriffsfverletzung - Aber warum

  Alt 18. Okt 2012, 22:48
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
l,k,m,n,o,AL1,AL2: Integer;
begin
//Kollision Spieler und Ziel
if IsCollision(Spieler.BoundsRect, Ziel.BoundsRect) then
  begin
  Punktzahl:=Punktzahl+1;
    If Sounds='EnabledThen
      begin
        SoundPlayer.FileName:=Pfad+'\Datein\Ziel.wav';
        SoundPlayer.Open;
        SoundPlayer.play;
      end;
    ItemCount:=ItemCount+1;
    Ziel.Top:=random(Spielflaeche.Height-Ziel.Height);
    Ziel.Left:=random(Spielflaeche.Width-Ziel.width);
    Memo2.lines.add(IntToStr(Ziel.Left)+';'+IntToStr(Ziel.top));
    // Gegner hinzufügen
      begin
       setLength(gegner,length(Gegner)+1);
       AL1 := length(Gegner)-1;
       Gegner[AL1]:= TGegner.Create(Self);
         With Gegner[AL1] do
          begin
            speed:=3;
            Parent := self;
            Cooldown := 1000;
            If RandomAusgabe(1)=1 Then
               begin
                  Width:=7;
                  Height:=40;
                  top:= 250;
                  Left := random( Spielflaeche.ClientWidth - Width );
                end;
            If RandomAusgabe(1)=0 Then
               begin
                  Width:=40;
                  Height:=7;
                  top:= random( Spielflaeche.clientheight - height );
                  Left := 450;
                end;
          end;
        end;
    //Item hinzufügen
      begin
        setLength(Item,length(Item)+1);
        AL2 := length(Item)-1;
        Item[AL2]:= TItem.Create(Self);
        With Item[AL2] do
          begin
            Parent:=Self;
            Height:=10;
            Width:=10;
            Top:=Random(Form1.ClientHeight-Height);
            Left:=Random(Form1.ClientWidth-Width);
            Brush.Color:=clblack;
            If RandomAusgabe(1)=1 then
              begin
                Pen.Color:=clgreen;
                Typ:=True;
              end;
            If RandomAusgabe(1)=0 then
              begin
                Pen.Color:=clred;
                Typ:=False;
              end;
          end;
  end;
...
//Kollision Spieler und Item
For n := low(item) to high(item) do
  begin
    If IsCollision(Spieler.BoundsRect,Item[n].BoundsRect) Then
      begin
        Spieler.Upgrade(n,Item[n].Typ);
      end;
  end;
end;
...
//Kollision Spieler und Gegner
For k:= low(gegner) to high(gegner) do
  begin
    if ((IsCollision(Gegner[k].BoundsRect, Spieler.BoundsRect))
    and (Gegner[k].Cooldown<=0)) then Verloren;
  end;
...
end;
Bei //Kollision Spieler und Item bekomme ich eine Zugriffsverletzung. Ich verstehe allerdings nicht warum. Genauso werden bei mir die Gegner behandelt und bei denen funktioniert es. Zudem die Gegner ja genauso erstellt werden.
Weiß jemand warum ?
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

AW: Zugriffsfverletzung - Aber warum

  Alt 18. Okt 2012, 23:01
Was ist Item, ein Array? Evtl. bist du drüber.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Zugriffsfverletzung - Aber warum

  Alt 18. Okt 2012, 23:05
was passiert hier?
Spieler.Upgrade(n,Item[n].Typ);
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Premaider

Registriert seit: 31. Mär 2012
160 Beiträge
 
#4

AW: Zugriffsfverletzung - Aber warum

  Alt 18. Okt 2012, 23:09
Was ist Item, ein Array? Evtl. bist du drüber.
Ja ist ein Array. Ich dürfte eigendlich nicht drüber sein. Hat immer die selben Werte wie der Gegner Array

was passiert hier?
Spieler.Upgrade(n,Item[n].Typ);
Delphi-Quellcode:
procedure TSpieler.Upgrade(n: Integer; ItemTyp: Boolean);
var
i,Zufall: Integer;
begin
Zufall:=Randomausgabe(5);
If ItemTyp=True Then
  begin
    //Gutes Item
    If Zufall=1 Then
      begin
        Item[n].Free;
        If Spieler.Speed>=1 Then Spieler.Speed:=Spieler.Speed+1;
        AuswirkungAnzeigen('Spieler speed up');;
      end;
    If Zufall=2 Then
      begin
        Item[n].free;
        //For i:= 0 to high(gegner)-1 do
          //begin
           //If Gegner[i].Speed>=2 Then Gegner[i].Speed:=Gegner[i].Speed-1;
          //end;
        AuswirkungAnzeigen('Gegner speed down');
      end;
    If Zufall=3 Then
      begin
        Item[n].Free;
        AuswirkungAnzeigen('Nichts1');
      end;
    If Zufall=4 Then
      begin
        Item[n].Free;
        AuswirkungAnzeigen('Nichts2');
      end;
    If Zufall=5 Then
      begin
        Item[n].Free;
        AuswirkungAnzeigen('Nichts3');
      end;
  end;
If ItemTyp=false Then
  begin
    //schlechtes Item
    If Zufall=1 Then
      begin
        Item[n].Free
      end;
    If Zufall=2 Then
      begin
        Item[n].Free
      end;
    If Zufall=3 Then
      begin
        Item[n].Free
      end;
    If Zufall=4 Then
      begin
        Item[n].Free
      end;
    If Zufall=5 Then
      begin
        Item[n].Free
      end;
  end;
end;

procedure AuswirkungAnzeigen(Auswirkung: String);
begin
Form1.ItemAnzeige.Caption:=Auswirkung;;
Form1.Timer2.Enabled:=true;
end;

function RandomAusgabe(max: Integer): Integer;
begin
Randomize;
Result:=Random(max+1);
end;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.141 Beiträge
 
Delphi 12 Athens
 
#5

AW: Zugriffsfverletzung - Aber warum

  Alt 18. Okt 2012, 23:25
Item[n].Free gibt das Item frei. Jeder nachfolgende Zugriff darauf führt zu einer Zugriffsverletzung. Da das Array aber nicht verändert wird, ist das Item noch da (obwohl keine gültige Objekt-Instanz dahinter liegt) und wird beim nächsten Schleifendurchlauf wieder angesprochen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Premaider

Registriert seit: 31. Mär 2012
160 Beiträge
 
#6

AW: Zugriffsfverletzung - Aber warum

  Alt 18. Okt 2012, 23:31
Das heißt visible auf false setzen und noch eine Enabled eigenschaft einbauen ?
Edit: Ich werde jetzt erstmal schlafen gehen. Aber das mit visible auf False und enabled sollte dann ja funktionieren. Danke für eure Hilfe ;D

Geändert von Premaider (18. Okt 2012 um 23:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Zugriffsfverletzung - Aber warum

  Alt 18. Okt 2012, 23:43
Das zu beurteilen wage ich ob des mangelnden Verständnisses um die gewünschte Funktion nicht.
gegf. ist es erwünscht Item freizugeben dann muss allerdings sichergestellt werden daß bei
Item[n].Free; Item[n] überhaupt noch existiert (gegf. FreeAndNil,TObjectlist(oder verwaltete TList) statt Array) ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz