Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Werte aus dynamischen array löschen (https://www.delphipraxis.net/175412-werte-aus-dynamischen-array-loeschen.html)

Bummi 20. Jun 2013 08:56

AW: Werte aus dynamischen array löschen
 
:wall::wall: Danke ... mein Verständnis von condition war der Anlass für den Hänger ...

jupiter4065139 20. Jun 2013 09:38

AW: Werte aus dynamischen array löschen
 
ich hab das mal probiert nach
http://www.delphi-treff.de/tipps/obj...ecke-entsteht/


Delphi-Quellcode:
If (median[FS.Position].Zeit > 0.1 and median[FS.Position].Zeit < 0.2) then
             
begin

move(median[fs.position+1], median[fs.position], sizeOf(median[0])*(Length(median) - fs.position - 1));
                setlength(median, length(median)-1);

end;
Da werden aber in den Bereich nur "0" geschrieben. Das Problem liegt IMHO daran das fs.position als byte deklariert sind, oder? Die Daten aus der Datei werden als smallint ausgelesen, d.h. wenn ich mir fs.position anzeigen lasse wird immer um 2 byte erhöht.

Wenn ich jetzt fs.position als Index nehme geht das denk ich nich. Wie mach ich denn das dann am besten?

baumina 20. Jun 2013 10:04

AW: Werte aus dynamischen array löschen
 
Deswegen kam dieser Hinweis:

Zitat:

Zitat von Uwe Raabe (Beitrag 1219104)
Tip: Wenn du über eine for-Schleife Elemente aus einem Array löscht, dann lass die Schleife rückwärts laufen.

Mit Byte oder SmallInt hat das meiner Meinung nach nichts zu tun.

jupiter4065139 20. Jun 2013 10:44

AW: Werte aus dynamischen array löschen
 
Delphi-Quellcode:
If median[FS.Position].Zeit < 0.2) and (median[FS.Position].Zeit > 0.1 then


meinst du so? Da ändert sich aber nichts. kommen trotzdem nur "0".

Uwe Raabe 20. Jun 2013 10:54

AW: Werte aus dynamischen array löschen
 
Zitat:

Zitat von jupiter4065139 (Beitrag 1219169)
Delphi-Quellcode:
If median[FS.Position].Zeit < 0.2) and (median[FS.Position].Zeit > 0.1 then


meinst du so? Da ändert sich aber nichts. kommen trotzdem nur "0".

Das ist doch nur die Bedingung und nicht die Schleife. Warum lässt du denn das ganze Drumherum weg?

baumina 20. Jun 2013 10:58

AW: Werte aus dynamischen array löschen
 
Deine If-Abfrage befindet sich sicherlich innerhalb irgendeiner Schleife (while/repeat/for), diese solltest du Rückwärts laufen lassen.

jupiter4065139 20. Jun 2013 11:08

AW: Werte aus dynamischen array löschen
 
sorry, ich bin noch blutiger Anfänger (war etwas daneben)

Delphi-Quellcode:
while Stream.Position < Stream.Size do begin
            Stream.ReadBuffer(Digit, SizeOf(Digit));
            Inc(byte);
 time:= time+ 1/250;
setlength(arr,stream.size);
arr[stream.position].zeit:= time;
arr[stream.position].wert:=Digit;

If (arr[stream.Position].Zeit > 0.1 and arr[stream.Position].Zeit < 0.2) then

begin

move(arr[stream.position+1], arr[stream.position], sizeOf(arr[0])*(Length(arrn) - stream.position - 1));
                setlength(arr, length(arr)-1);

end;

end;
sowas dann ungefähr

Delphi-Quellcode:
while Stream.Position < Stream.Size do begin
            Stream.ReadBuffer(Digit, SizeOf(Digit));
            dec(byte);
wie mach ich denn dann das, ich müsste ja die stream.position an das ende setzen

baumina 20. Jun 2013 12:24

AW: Werte aus dynamischen array löschen
 
Vielleicht solltest du nicht darüber nachdenken überflüssige Einträge aus dem Array heraus zu löschen, sondern lieber unerwünschte Einträge in das Array erst gar nicht hinein zu schreiben. Ungefähr so:

Delphi-Quellcode:
setlength(arr,0);

while Stream.Position < Stream.Size do
begin
  Stream.ReadBuffer(Digit, SizeOf(Digit));
  Inc(byte);
  time:= time+ 1/250;
  If (time <= 0.1) or (time >= 0.2) then
  begin
    setlength(arr,Length(arr) + 1);
    arr[Length(arr)].zeit:= time;
    arr[Length(arr)].wert:= Digit;
  end;
end;
ungetestet

Uwe Raabe 20. Jun 2013 13:37

AW: Werte aus dynamischen array löschen
 
Da ist schon mal ein grundsätzlicher Fehler: du indizierst das Array nach der Stream.Position. Die ist aber immer Byte-orientiert und würde nur dann Sinn machen, wenn Digit auch als Byte deklariert ist. Sollte das aber der Fall sein, dann ist in jedem Fall des SetSize innerhalb der while-Schleife falsch und effizienter würde man das Array in einem Rutsch aus dem Stream füllen und danach weiter bearbeiten.

Also zeig doch bitte mal noch mehr von deinem Code.

Übrigens: Byte ist ein vordefinierter Datentyp. Delphi lässt zwar die Deklaration einer Variablen dieses Namens zu und behandelt das i.A. auch korrekt, es ist aber kein guter Stil solche Namen zu vergeben.

jupiter4065139 20. Jun 2013 14:32

AW: Werte aus dynamischen array löschen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1219195)
Da ist schon mal ein grundsätzlicher Fehler: du indizierst das Array nach der Stream.Position. Die ist aber immer Byte-orientiert und würde nur dann Sinn machen, wenn Digit auch als Byte deklariert ist.

Genau das ist ja mein Problem. Wie müsste ich denn den stream einlesen, damit der mit einer integer Variablen indiziiert ist. Ich hab das bisher mit der .position gemacht, weil das erst mal funktionierte. Wenn ich dort jetzt aber eine schleife reinsetze kriege ich probleme.

Delphi-Quellcode:
type
    TDatensatz = record
        Zeit:Extended;
        U:Extended;      
        end;
    TDatenarray = array of TDatensatz ;

 
arr:TDatenarray;
 var j:byte;
 x, bis:integer;
 digit:smallint;
Stream,Stream2:TFilestream;
time, spannung:extended;
Listen:String;
begin
try
          j := 0;
          time:=0;
         
          while stream.Position < stream.Size do begin
            stream.ReadBuffer(Digit, SizeOf(Digit));
            inc(j);
              Spannung:= 10 * digit / 32768;
              time:=time+1/250;
                   setlength(arr, fs.size);
                      arr[stream.Position].Zeit:=time;
                      arr[stream.position].U:=Spannung;
     
            for x:= 0 to bis DO //bis wird über inputbox gelesen
               Begin
               if arr[stream.position].zeit > 0.1*x and arr[stream.position].zeit < 0.2*x then  //die Bedingung sieht eigentlich anders aus, aber so in der art
                  begin
                     // den Bereich wollte ich jetzt löschen
                        move(arr[stream.position+1], arr[stream.position], sizeof(arr[0])*(length(arr) -stream.position-1));
                        setlength(arr, length(arr)+1);        
                  end;
              end;
//ab hier in einen 2.stream speichern
             Listen := floattostr(arr[stream.position].zeit) + #9 + FloatToStr(arr[stream.position].U) + #9 + #13#10;  //AK
              Stream2.WriteBuffer(Listen[1], Listen(string));
             Listen := '';
              j   := 0;

            end;
            end;
finally
          stream.Free;
          stream2.Free;
        end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz