Entwickler-Ecke

Multimedia / Grafik - Wie lösche ich daten aus einem array?


mimi - Di 20.07.04 18:46
Titel: Wie lösche ich daten aus einem array?
Hallo,
ich schreibe im moment ein pacman clone und habe ein array mit "kis" und nun möchte ich einen level editor schreiben und bin jetzt bei der löschen funktion angelangt.
Jetzt möchte ich einfach die richtige ki löschen.dazu muss ich erstmal ermittelen welche ki die richtige ist und die lösche ich dann einfach:
KI:index merken
kis in einen neuen array zu weisen und den auslasen der den index hat und fertig.
naja so habe ich mir es gedacht aber leider geht es nicht.....
er setzt index flasch. mein code dazu ist:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
   for i:=0 to HIGH(ki) do begin
        if (ki[i].x = x div mapX) and (ki[i].y = y div mapY) then begin
          index:=i;
          break;
        end;
      end;
      ShowMessage(IntToStr(I));

      for i:=0 to HIGH(KI) do begin
        if i <> index then begin
          SetLength(k,high(k)+2);
          k[HIGH(K)]:=ki[i];
        end;
      end;

      SetLength(ki,0);
      SetLength(ki,high(k));

      for i:=0 to HIGH(KI) do begin
        ki[i]:=k[i];
      end;


Keldorn - Di 20.07.04 18:53

Hallo

warum 2 arrays?
du hast deinen zu löschenden index, und kopierst einfach die Elemente, die dahinter liegen um eins nach vorne, in etwa so:

Delphi-Quelltext
1:
for i:=zu_löschender_Index to länge_des_array-1 do Array[i]:=array[i+1];                    

anschließend noch das array um eins verringern.

Oder du nimmst eine Tlist oder Objectlist, die haben das löschen von elementen schon drin und sind in dieser beziehung einfacher zu handhaben.

Mfg Frank


mimi - Di 20.07.04 21:17

mein problem ist irngendwie schon das der index nicht stimmt :(
könnte ich mal versuchen deinen tipp, danke !!!!


mimi - Do 29.07.04 12:15

ich habe es mal so gemacht wie du es gesagt hast:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TBO.DeleteBall(Index:Integer);
var
  i:Integer;
begin
  for i:=Index to HIGH(BALL)-1 do begin
    BALL[i]:=BALL[i+1];
  end;

  if HIGH(BALL)-1 >= 0 then
    SetLength(BALL,high(ball)-1);

  if HIGH(BALL) < 0 then
  ShowmEssage('OK');

end;

nur jetzt bekomme ich folgendes fehlermeldung:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt BreakOut.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00418867 in Modul 'BreakOut.exe'. Lesen von Adresse 00069B98'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------

warum ?


BenBE - Do 29.07.04 23:04

Zeile 10 muss heißen:

Delphi-Quelltext
1:
SetLength(HBALL, Length(HBALL)-1);                    


Dann sollte es funzen.


mimi - Fr 30.07.04 08:44

ich hätte nicht gedacht das es an lenght liegen würde, habe in der hilfe zwar geschaut, naja, jetzt gehts so wie gewütnscht !!!