Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Stress mit Record aber warum? (https://www.delphipraxis.net/90148-stress-mit-record-aber-warum.html)

Chilled86 12. Apr 2007 13:24


Stress mit Record aber warum?
 
Hi Leute ha irgend einen banalen Fehler, kann ihn aber ned finden :oops: Ich will was in ein Record speicher un bekomme immer ein EA
Hier mein Code.... soll ein Test sein, eigentlich will ich nen Rückgabewert drin speichern, aber selbst mit "test" funzt es ned:

Delphi-Quellcode:
type
  THistoryData = record
    FileName: string;
    OldSize, NewSize: int64;
  end;

var
  HistoryData: Array of THistoryData;

.
.
.

HistoryData[i].Filename := 'test';
Würde mich über Hilfe freuen :)

gsh 12. Apr 2007 13:26

Re: Stress mit Record aber warum?
 
hast du des array groß genug?
(arrays fangen beim index 0 an)

Chilled86 12. Apr 2007 13:28

Re: Stress mit Record aber warum?
 
ja dadran liegts nicht habs auch mal nur von 0-1 und von 1-2 zählen lassen, bringt alles nix :(

zecke 12. Apr 2007 13:32

Re: Stress mit Record aber warum?
 
:hi:

Welche Größe hat denn 'i'? Ist dort überhaupt ein Wert gespeichert, sprich <>nil?

Jelly 12. Apr 2007 13:32

Re: Stress mit Record aber warum?
 
Hast du mit SetLength denn überhaupt Speicher reserviert.

Chilled86 12. Apr 2007 13:40

Re: Stress mit Record aber warum?
 
Zitat:

Zitat von zecke
:hi:

Welche Größe hat denn 'i'? Ist dort überhaupt ein Wert gespeichert, sprich <>nil?

i ist variabel, aber in meinem Testfall ist i 20, habs auch einfach schonmal ohne for-Schleife versucht und i durch 0 und 1 ersetzt. -> funktioniert auch nicht


Zitat:

Zitat von Jelly
Hast du mit SetLength denn überhaupt Speicher reserviert.

Nein, muss ich das denn? Kann die Länge nicht variabel sein?

TeronG 12. Apr 2007 13:43

Re: Stress mit Record aber warum?
 
Zitat:

Zitat von Chilled86
Zitat:

Zitat von Jelly
Hast du mit SetLength denn überhaupt Speicher reserviert.

Nein, muss ich das denn? Kann die Länge nicht variabel sein?

Da mann die Länge jederzeit (mit SetLength) verändern kann ist si ja variable ^^


Delphi-Referenz durchsuchenDynamische Arrays
Zitat:

Zitat von OH
Ein Beispiel:

var MyFlexibleArray: array of Real;

Hier wird ein eindimensionales Array mit Elementen vom Typ Real deklariert. Diese Deklaration weist MyFlexibleArray keinen Speicherplatz zu. Um ein Array im Speicher anzulegen, rufen Sie SetLength auf. Nach der vorherigen Typdeklaration weist

SetLength(MyFlexibleArray, 20);

ein Array mit 20 reellen Zahlen und einem Index von 0 bis 19 zu. Dynamische Arrays haben immer einen Integer-Index, der bei 0 beginnt.


fwsp 12. Apr 2007 13:44

Re: Stress mit Record aber warum?
 
die länge ist variabel. allerdings musst immer noch speicher reservieren. und mit setlength sagst du wie viel.

Jelly 12. Apr 2007 13:44

Re: Stress mit Record aber warum?
 
Zitat:

Zitat von Chilled86
Nein, muss ich das denn? Kann die Länge nicht variabel sein?

Eben. Du deklarierst ja ein dynamisches Array. Also musst du zur Laufzeit dafür Sorgen, dass genügend Speicherplatz reserviert wird. Genau das mach Setlength.
Die Indizierung beginnt bei dynamischen Arrays überigens bei 0.

Chilled86 12. Apr 2007 13:51

Re: Stress mit Record aber warum?
 
ich hab jetzt vor der for-Schleife folgendes stehen:
Delphi-Quellcode:
setLength(HistoryData,20);
Jetzt bekomme ich die Meldung: "Im Projekt ... ist eine Exception der Klasse EInvalidPointer ... 'Ungültige Zeigeroperation' aufgetreten.!

Un nu?

fwsp 12. Apr 2007 13:58

Re: Stress mit Record aber warum?
 
Zitat:

Zitat von Chilled86
Un nu?

:wall:
greifst du irgendwo auf einen ungültigen bereich zu? alles was keinen index zwischen 0 und 19 hat weist ins nirvana und schmeißt nen fehler.

Chilled86 12. Apr 2007 14:01

Re: Stress mit Record aber warum?
 
Wie gesagt, ich mache nur das was oben steht. Wenn ich dann die Zeile auskommentiere, in der ich 'test' ins Array schreiben will, ist alles in Butter. :freak:

Matze 12. Apr 2007 14:02

Re: Stress mit Record aber warum?
 
Hast du überprüft, ob i auch wirklich nur Werte zwischen 0 und 19 annehmen kann?

ErazerZ 12. Apr 2007 14:04

Re: Stress mit Record aber warum?
 
Delphi-Quellcode:
type
  THistoryData = record
    FileName: string; // oder größe gleich reservieren mit filename: string[50]
    OldSize, NewSize: int64;
  end;
var
  HistoryData: array of THistoryData;
  i: Integer;
  s: string;
begin
  SetLength(HistoryData, 20);
  for i := 0 to Length(HistoryData) -1 do
    HistoryData[i].FileName := Format('Filename #%d', [i]);
  for i := 0 to Length(HistoryData) -1 do
    s := s + HistoryData[i].FileName + #13#10;
  ShowMessage(s);

Jelly 12. Apr 2007 14:08

Re: Stress mit Record aber warum?
 
Nicht
Delphi-Quellcode:
for i := 0 to Length(HistoryData) -1
sondern
Delphi-Quellcode:
for i := low(HistoryData) to High(HistoryData)

Klaus01 12. Apr 2007 14:11

Re: Stress mit Record aber warum?
 
Alternativ kannst Du acu anstelle des Array eine TList nehmen.
Die hat Methoden zum hinzufügen und löschen von Elementen.
Und auch eine Eigenschaft die die Größe der Liste beinhaltet.

Der Vollständigkeit halber ergänzt:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
   ....
  private
    { Private-Deklarationen } 
    type
      PHistory = ^THistory
      THistoryData = record
        FileName: string;
        OldSize, NewSize: int64;
      end;
    HistoryData : PHistory;
    HistoryList : TList;
  public
    { Public-Deklarationen } 
  end;
erstellen von Einträgen:
Delphi-Quellcode:
new(HistoryData);
HistoryData^.FileName:='...';
HistoryList.add(HistoryData);
Ausgabe von Einträgen:
Delphi-Quellcode:
for i:=0 to HistoryList.count -1 do
  begin
    HistoryData:=HistoryList.items[i]
    ShowMessage(HistoryData^.FileName);
  end;
Löschen der Liste:
Delphi-Quellcode:
While HistoryList.count > 0 do
  begin
    HistoryData:= HistoryList.items[0];
    Dispose(HistoryData);
    HistoryList.delete(0);
  end;
HistoryList.free;
Grüße
Klaus

Chilled86 12. Apr 2007 15:03

Re: Stress mit Record aber warum?
 
Zitat:

Zitat von Matze
Hast du überprüft, ob i auch wirklich nur Werte zwischen 0 und 19 annehmen kann?

Ja hab ich, hat damit aber absolut nix zu tun da der Fehler ja auch kommt, wenn ich das Array ohne for-Schleife beschreibe

Matze 12. Apr 2007 15:08

Re: Stress mit Record aber warum?
 
Das Beispiel von ErazerZ mit Jellys Änderungen funktioniert bei mir ohne Probleme (mal die komplette Unit):

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    type
      THistoryData = record
      FileName: string;
      OldSize, NewSize: int64;
    end;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  HistoryData: array of THistoryData;
  i: Integer;
  s: string;
begin
  SetLength(HistoryData, 20);

  // Array füllen
  for i := Low(HistoryData) to High(HistoryData) do
    HistoryData[i].FileName := 'Hallo';

  // Array ausgeben
  for i := Low(HistoryData) to High(HistoryData) do
    s := s + HistoryData[i].FileName + #13#10;
  ShowMessage(s);
end;

end.

Chilled86 12. Apr 2007 15:13

Re: Stress mit Record aber warum?
 
Thema erledigt. Danke Leute, dass ihr euch so viel Zeit für meine Unfähigkeit genommen habt :wall: :wiejetzt:

Hab obendrüber in ner Schleife "begin ... end" vergessen, dadurch ist dort was schief gelaufen und hat mir irgendwie alles möglich im Programm versäbelt :idea:


DANKE NOCHMAL AN ALLE!!! :cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 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