Zuweisung von Array-Typen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Zuweisung von Array-Typen

Beitrag von u-boot »

Hallo ich hab ein Problem mit der folgenden Struktur. Ich weiss der Code ist relativ lang habs aber nicht viel kürzer hinbekommen mit 2 Klassen, und steht auch nur elementares drin.
Fehlermeldung ist SIGSEGV. Vermutlich ein sehr grundlegender Denkfehler. Könnte es sein dass der Code nicht funktioniert weil T3Arr nur typ und keine Klasse ist ?

Code: Alles auswählen

unit Unit1; 
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;
type
 
  T3DArr=Array of Array of Array of Double;
 
  { TCla1 }
  TCla1 = class(TCustomControl)
  private
    FArr1:T3DArr;
    function GetArr: T3DArr;
    procedure SetArr(const AValue: T3DArr);
    { private declarations }
  public
    { public declarations }
    property Arr1:T3DArr read GetArr Write SetArr;
  end; 
 
  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    FArr:T3DArr;
    function GetArr: T3DArr;
    procedure SetArr(const AValue: T3DArr);
    { private declarations }
  public
    { public declarations }
    property Arr:T3DArr read GetArr Write SetArr;
  end;
 
var
  Form1: TForm1;
  C1:TCla1;
  C2:TCla1;
 
implementation
 
{ TCla1 }
function TCla1.GetArr: T3DArr;
begin
  result:=FArr1;
end;
 
procedure TCla1.SetArr(const AValue: T3DArr);
begin
    FArr1:=AValue;
end;
 
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var i,j,k:integer;
begin
//Array wird gefüllt
 SetLength(FArr, 2,2,2);
 i:=0; j:=0; k:=0;
 while (i<Length(Farr)) do begin
   while (j<Length(Farr)) do begin
     while (j<Length(Farr)) do begin
       FArr[i,j,k]:=2*i+j-3*k;
       inc(i);    inc(j);     inc(k);
     end;
   end;
 end;
//Übergabeversuch
 C1.Arr1:=self.Arr;
 C2.Arr1:=C1.Arr1;
end;
 
function TForm1.GetArr: T3DArr;
begin
  Result:=FArr;
end;
 
procedure TForm1.SetArr(const AValue: T3DArr);
begin
   FArr:=AValue;
end;
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

martin_frb
Beiträge: 586
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Zuweisung von Array-Typen

Beitrag von martin_frb »

also erstens => deine schleife

Code: Alles auswählen

while (i<Length(Farr)) do begin
   while (j<Length(Farr)) do begin
     while (j<Length(Farr)) do begin
In der dritten Zeile auch "j" => k wird nie geprueft....

Besser wäre:

Code: Alles auswählen

while (i<Length(Farr)) do begin
   while (j<Length(Farr[i])) do begin
     while (k<Length(Farr[i,j])) do begin

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Zuweisung von Array-Typen

Beitrag von u-boot »

oh stimmt ... unachtsamkeit ... aber funktioniert trotzdem an anderer stelle nicht.... also bei der übergabe an das andere objekt
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Zuweisung von Array-Typen

Beitrag von Hitman »

So wie du die Schleifen da machst - und vor allem so wie du die Zähler erhöhst (und nicht wieder zurücksetzt) - muss das schief gehen. Du solltest der Einfachheit wegen vielleicht lieber auf For-Schleifen setzen:

Code: Alles auswählen

for i := Low(FArr) to High(FArr) do
  for j := Low(FArr[i]) to High(FArr[i]) do
    for k := Low(FArr[i][j]) to High(FArr[i][j]) do
       FArr[i,j,k]:=2*i+j-3*k;

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Zuweisung von Array-Typen

Beitrag von Euklid »

Sollte die Speicherzugriffsverletzung noch auftreten, kannst Du ja mal die heaptrc einspannen und dessen Ausgabe hier posten. Mit ihr findet man solche Fehler in der Regel schneller.

Viele Grüße, Euklid

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Zuweisung von Array-Typen

Beitrag von Scotty »

Hitman hat schon die Schleifen bemängelt - wenn du while bevorzugst, sollten j und k "innen" genullt werden.
Sigsev dürfte das aber nicht auslösen. Eher schon, dass dein Objekt nicht initialisiert wurde (ich sehe keinen constructor). Eigenartig ist auch, dass TCla1 definiert wird, TForm1 aber eigene Variablen und Methoden (mit dem gleichen Namen) bekommt. Vermutlich hast du zu viel Code weggelassen, so dass nur debuggen als Empfehlung bleibt :-)

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Zuweisung von Array-Typen

Beitrag von Hitman »

Scotty hat geschrieben:Sigsev dürfte das aber nicht auslösen.
Aber hallo - er schreibt sonst meilenweit über die Array Grenzen hinaus, und dabei wird mit Sicherheit irgendwo entweder relevanter Speicher überschrieben oder es wird bereits beim Versuch die SIGSEGV ausgelöst. Allein beim vierten Schleifendurchlauf greift er ja schon auf [3,3,3] zu ... und das ganze geht bis [26,26,26] ... das is soweit über die Grenzen hinaus, da würde schon sehr viel Glück dazu gehören, dass das nich crasht.

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Zuweisung von Array-Typen

Beitrag von u-boot »

oh man ... ich sollte mir solche Aussetzer echt mal abgewöhnen.

Erst nen Konstruktor löschen, weil das Fenster nervt, dann paar Wochen später sich wundern warums nicht mehr funktioniert und im dazu erstellten Testprojekt dann den Konstruktor vergessen.

Das lag bestimmt an Löw obwohl ich ihm und seiner Truppe nicht mal zugeschaut hab....

Hm so nun sollt ich noch rausfinden wo steht dass ein bestimmtes Fenster angezeigt werden soll (wohl grund warum es mich genervt hatte). Aber dazu habt ihr wohl zu wenig Infos von mir bekommen.

Antworten