AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi erstes Element aus dynamischem Array löschen

erstes Element aus dynamischem Array löschen

Ein Thema von TheAn00bis · begonnen am 3. Sep 2005 · letzter Beitrag vom 4. Sep 2005
Antwort Antwort
Seite 1 von 2  1 2   
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#1

erstes Element aus dynamischem Array löschen

  Alt 3. Sep 2005, 15:46
Hi, ich habe schon die suche benutzt und auch den Eintrag in der Code-Libary gefunden, allerdings habe ich keine Ahnung von Pointern und Assembler, von daher wollte ich lieber meine eigene Procedur schreiben.

Allerdings scheint die follgende immer eine "Invalid Pointer Message" oder eine AV zu erzeugen. Könnte jemand mal drüber schauen?

Achja, es kommt auf die Reihenfolge an, ich will nur das erste Element löschen und den Rest nachrücken lassen und es soll keine allgemeine Procedure sein, sondern nur auf das dyn Array "Zeiten" zugreifen

Delphi-Quellcode:
procedure TMain.loesche;
var n,t,y:integer;
begin
for n:=length(zeiten) downto 0 do begin
 if n<>0
    then begin
         t:=zeiten[n];
         zeiten[n-1]:=t;
    end;
 end;

y:=length(zeiten);
setlength(zeiten,y-1)
end;
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#2

Re: erstes Element aus dynamischem Array löschen

  Alt 3. Sep 2005, 15:53
Ich würde es glaueb ich so machen:
Delphi-Quellcode:
procedure TMain.loesche;
var i,l: Integer;
begin
for i := 0 to length(zeiten) do
  zeiten [i] := zeiten[i +1];

l:=length(zeiten);
setlength(zeiten,l-1);
end;
... ungetestet ...
Jan
  Mit Zitat antworten Zitat
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#3

Re: erstes Element aus dynamischem Array löschen

  Alt 3. Sep 2005, 15:58
Danke, hast Recht, ist um einiges unkomplizierter. Hab es getestet und scheint keinen Unterschied zu machen.

Und du bist sicher, dass man einfach die Länge ändern darf? Also obwohl das letzte Element dann irgendwo verschwindet? Oder muss man erst den Speicher freigeben oder so?
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#4

Re: erstes Element aus dynamischem Array löschen

  Alt 3. Sep 2005, 16:10
Also sicher bin ich mir da nicht. Aber spontan würde ich sagen der Speicher des letzen Elementes wird damit wieder freigegeben bzw. nicht mehr reserviert. Und von daher sollte das doch in Ordnung sein, oder?

P.S.: Klappts denn wenigstens?
Jan
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
810 Beiträge
 
#5

Re: erstes Element aus dynamischem Array löschen

  Alt 3. Sep 2005, 16:12
Mr_G muss auch noch nen -1 hin sonst greift man auf ein element zu weit zu
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.262 Beiträge
 
Delphi 2006 Professional
 
#6

Re: erstes Element aus dynamischem Array löschen

  Alt 3. Sep 2005, 16:14
Moin Zusammen,

statt

for i := 0 to length(zeiten) do muss es aber

Delphi-Quellcode:
for i := 0 to length(zeiten)-1 do
// oder
for i := 0 to high(zeiten) do
heissen, da ansonsten

zeiten [i] := zeiten[i +1]; beim letzten Element schiefgeht.

Was ist denn in zeiten gespeichert?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#7

Re: erstes Element aus dynamischem Array löschen

  Alt 3. Sep 2005, 16:18
Zitat von brechi:
Mr_G muss auch noch nen -1 hin sonst greift man auf ein element zu weit zu
Da will man mal einmal helfen... sry aber er hat natürlich Recht!
War ein Flüchtigkeitsfehler.
Jan
  Mit Zitat antworten Zitat
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#8

Re: erstes Element aus dynamischem Array löschen

  Alt 3. Sep 2005, 16:34
Danke!

Kommen zwar immer noch ständig die besagten Fehlermeldungen, aber das wird dann wohl woanders dran liegen.

Ich kann das Programm ja mal kurz erklären:

20Ampeln (können auch nur 2 sein, je nach belieben) sind auf dem Bildschrim, die alle zufalls geschaltet sind und die schalten endlos vor sich hin (also rot, grün, gelb).

Immer wenn eine Ampel grün ist, muss der Benutzer auf einen Knopf im der Main-Form klicken und dann wird die Reaktionszeit in eine Listbox geschrieben.

Was das Programm macht sollte geklärt sein, jetzt das Wie?:

Jede Ampel ist vollkommen selbstständig und sendet nur einen Befehl and die Main-Form, damit sich diese die Zeit merkt. Und dies tut sie, in dem sie das Array "Zeiten" um 1vergrößert und in das letzte Element den aktuellen gettickcount schreibt.

Klickt der Benutzer dann auf den Knopf, so wird immer das erste Element aus dem Arry vom aktuellen gettickcount subtrahiert. Das Ergebnis kommt in die Listbox.

Ich habe das ganze gerade mit nur einer Ampel ausprobiert, manchmal klappt alles einwandfrei, dann lasse ich die Ampel 5mal durchlaufen und klicke immer bei grün auf den Button und die Zeiten werden eingetragen, doch dann irgendwann kommt "Exception EInvalidPointer in module...". Es tritt immer vollkommen zufällig auf. Selbst bei nur einer Ampel. Ich hab keine Ahnung was das sein kann.

Hier mal die wichtigsten Proceduren:

Delphi-Quellcode:
procedure TMain.loesche;
var i,l: Integer;
begin
for i := 0 to high(zeiten) do
  zeiten [i] := zeiten[i +1];

l:=length(zeiten);
setlength(zeiten,l-1);
end;

procedure TMain.Button1Click(Sender: TObject); //Button der die Ampeln erstellt
begin
inc(i);
Ampel:= TAmpel.Create(Main,('Ampel'+inttostr(i)),i);
TAmpel(FindComponent('Ampel'+inttostr(i))).ein;
end;

procedure TMain.istGruen; //wird von den Ampeln aufgerufen, sobald sie grün sind
var s:integer;
begin
s:=length(zeiten);
setlength(zeiten,s+1);
zeiten[s+1]:=gettickcount;
gruen:=true;
end;

procedure TMain.Button2Click(Sender: TObject); {muss vom User geklickt werden, wenn eine Ampel auf grün schaltet}
var zeit:integer;
begin
if gruen then begin
zeit:=(gettickcount-zeiten[1]);
Listbox1.items.Add(inttostr(zeit)+'ms');
loesche;
gruen:=false;
end;
Wäre toll, wenn sich das jemand anschauen könnte.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: erstes Element aus dynamischem Array löschen

  Alt 3. Sep 2005, 16:51
entweder
for i := 0 to length(zeiten) - 2 do oder
for i := 0 to High(zeiten) - 1 do einfach ein bischen mitdenken!! Denn wenn du auf zeiten[i + 1] zugreifst darf i natürlich High nie überschreiten und auch nicht (length(zeiten) - 1)

Wenn man jetzt davon ausgeht das auch bei einem dynamichen Array alle werte im Speicher hintereinander stehen kann man natürlich auch den gesammten speicherblock mit move verschieben.
Beispiel würde ich gern posten aber ich find nirgends von welchem Typ das dynamische Array ist (oder ich übersehe es einfach)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: erstes Element aus dynamischem Array löschen

  Alt 3. Sep 2005, 16:56
Hi,

ein paar kleine Änderungen - ohne dass ich dein Projekt ganz verstanden habe:

Delphi-Quellcode:
procedure TMain.loesche;
var
  i: Integer;
begin
  for i := 1 to high(zeiten) do
    zeiten [i - 1] := zeiten[i];
  setlength(zeiten, high(zeiten));
end;

procedure TMain.Button1Click(Sender: TObject);
//Button der die Ampeln erstellt
begin
  inc(i); // i als globale Variable ist nicht sehr glücklich
  Ampel:= TAmpel.Create(Main,('Ampel' + IntToStr(i)), i);
  TAmpel(FindComponent('Ampel'+inttostr(i))).ein;
end;

procedure TMain.istGruen;
//wird von den Ampeln aufgerufen, sobald sie grün sind
begin
  setlength(zeiten, Length(zeiten) + 1);
  zeiten[High(zeiten)] := gettickcount;
  gruen := true;
end;

procedure TMain.Button2Click(Sender: TObject);
{muss vom User geklickt werden, wenn eine Ampel auf grün schaltet}
var
  zeit: integer;
begin
  if gruen then begin
    zeit := (gettickcount - zeiten[0]);
    Listbox1.items.Add(inttostr(zeit) + ' ms');
    loesche;
    gruen := false;
  end;
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 16:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf