Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Arraytypfehler (https://www.delphipraxis.net/110398-arraytypfehler.html)

Kytrix 17. Mär 2008 16:31


Arraytypfehler
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
unit mMain;

interface

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

type
  TMain = class(TForm)
    LaSpalten: TLabel;
    LaZeilen: TLabel;
    EdSpalten: TEdit;
    EdZeilen: TEdit;
    BtMatrix: TButton;
    ScrollBoxMatrix: TScrollBox;
    BtRechnen: TButton;
    LiBoxLoesungen: TListBox;
    procedure BtMatrixClick(Sender: TObject);
    procedure EdSpaltenChange(Sender: TObject);
    procedure EdZeilenChange(Sender: TObject);
    procedure FormCanResize(Sender: TObject; var NewWidth,
      NewHeight: Integer; var Resize: Boolean);
    procedure BtRechnenClick(Sender: TObject);
    procedure ShowRealErgebnis;
    function Rechnen: Boolean;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Main: TMain;
  M, N: Integer; //Matrix Variablen
  EditArray: array[1..200, 1..200] of TEdit;
  MatrixArray: array of array of Real;
  Ergebnisse: array of Real;

implementation

{$R *.dfm}

procedure TMain.BtMatrixClick(Sender: TObject);
Var GleichPanel: TPanel;
    Anzahl, Variablen: TLabel;
    I, J: Byte;
begin
  GleichPanel:=TPanel.Create(ScrollBoxMatrix);
  GleichPanel.Parent:=ScrollBoxMatrix;
  GleichPanel.Left:=(M*40)+50;
  GleichPanel.Top:=20;
  GleichPanel.Width:=2;
  GleichPanel.Height:=N*30;
  GleichPanel.Caption:='';
  for i:= 1 to N do
    begin
      for j:= 1 to M do
        begin
          EditArray[i,j]:= TEdit.Create(ScrollBoxMatrix);
          EditArray[i,j].Parent:=ScrollBoxMatrix;
          EditArray[i,j].Width:=35;
          EditArray[i,j].Height:=25;
          EditArray[i,j].Left:=J*40;
          EditArray[i,j].Top:=I*30;
        end;
      end;
  for I:=1 to N do
  begin
    EditArray[i,j]:= TEdit.Create(ScrollBoxMatrix);
    EditArray[i,j].Parent:=ScrollBoxMatrix;
    EditArray[i,j].Width:=35;
    EditArray[i,j].Height:=25;
    EditArray[i,j].Left:=(J*40)+30;
    EditArray[i,j].Top:=I*30;
    Anzahl:=TLabel.Create(ScrollBoxMatrix);
    Anzahl.Parent:=ScrollBoxMatrix;
    Anzahl.Left:=15;
    Anzahl.Top:=I*30;
    Anzahl.Font.Style:=[fsBold];
    Anzahl.Font.Size:=10;
    Anzahl.Caption:=IntToStr(I);
  end;
  for J:=1 to M do
  begin
    Variablen:=TLabel.Create(ScrollBoxMatrix);
    Variablen.Parent:=ScrollBoxMatrix;
    Variablen.Left:=J*40;
    Variablen.Top:=10;
    Variablen.Font.Style:=[fsBold];
    Variablen.Font.Size:=11;
    Variablen.Caption:='x'+IntToStr(J);
  end;
end;

procedure TMain.EdSpaltenChange(Sender: TObject);
begin
If EdSpalten.Text<>'' then
M:=StrToInt(EdSpalten.Text);
end;

procedure TMain.EdZeilenChange(Sender: TObject);
begin
If EdZeilen.Text<>'' then
N:=StrToInt(EdZeilen.Text);
end;

procedure TMain.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
ScrollBoxMatrix.Width:=Main.ClientWidth -18;
ScrollBoxMatrix.Height:=Main.ClientHeight -94;
LiBoxLoesungen.Width:=Main.ClientWidth -353;
end;

procedure TMain.BtRechnenClick(Sender: TObject);
var i, j: Byte;
begin
For i:=1 to N do
begin
  For j:= 1 to M do
  Begin
    [B]MatrixArray[i,j]:=StrToFloat(EditArray[i,j].Text);[/B] //****#######****// Hier Bekomme ich den Fehler gemeldet
  end;
end;
  LiBoxLoesungen.Items.BeginUpdate;    
  LiBoxLoesungen.MultiSelect := true;  
  LiBoxLoesungen.SelectAll;            
  LiBoxLoesungen.DeleteSelected;      
  LiBoxLoesungen.MultiSelect := false;
  LiBoxLoesungen.Items.EndUpdate;      
  if not Rechnen then    
  begin
    ShowMessage('Keine Loesung moeglich');
    exit;
  end;
  ShowRealErgebnis;
end;

procedure TMain.ShowRealErgebnis;
var
  i1: Byte;
begin
  LiBoxLoesungen.Items.BeginUpdate;
  for i1 := Low(ergebnisse) to High(ergebnisse) do
  begin
    LiBoxLoesungen.Items.Add(chr(97 + i1) + ' = ' + FloatToStr(Ergebnisse[i1]));
  end;
  LiBoxLoesungen.Items.EndUpdate;
  Beep;
  Beep;
  Beep;                          
end;

function TMain.Rechnen: Boolean;  

var
  i1, i2, i3, i4, i5: Byte;
begin
  result := true;          
  try

    for i3 := 0 to M do
    begin
      for i2 := i3 to M do
        for i1 := N downto 0 do
          Matrixarray[i1, i2] := Matrixarray[i1, i2] / Matrixarray[i3, i2];

      for i4 := i3 + 1 to M do
        for i5 := N downto 0 do
          Matrixarray[i5, i4] := Matrixarray[i5, i3] - Matrixarray[i5, i4];
    end;

    SetLength(ergebnisse, N);
    for i1 := High(ergebnisse) downto Low(ergebnisse) do
      ergebnisse[i1] := Matrixarray[N, i1];
    for i1 := High(ergebnisse) downto 1 do
      for i2 := i1 downto 1 do
        ergebnisse[i2 - 1] := ergebnisse[i2 - 1] - (ergebnisse[i1] * Matrixarray[i1, i2 - 1]);
  except
    result := false;
  end;
end;


end.
Ich verstehe nicht wo der Fehler liegt

mkinzler 17. Mär 2008 16:34

Re: Arraytypfehler
 
Hast du dein Programm schon mal debuggt um zu sehen, an welcher Stelle der fehler auftritt?

Kytrix 17. Mär 2008 16:40

Re: Arraytypfehler
 
hatte eigentlich die stelle markiert aber war wohl zu viel anderes mitmarkiert .... naja jetzt ist nur noch die stelle markiert (die fehlermeldung ist als anhang angefügt)

mkinzler 17. Mär 2008 16:43

Re: Arraytypfehler
 
Delphi-Quellcode:
For i:= 0 to N-1 do
begin
  For j:= 0 to M-1 do
?

DeddyH 17. Mär 2008 16:43

Re: Arraytypfehler
 
Entweder habe ich es übersehen, oder da fehlt ein SetLength()für das Matrixarray.

Klaus01 17. Mär 2008 16:45

Re: Arraytypfehler
 
Du hast MatrixArray als dynamisches Array deklariert.
Ich habe kein Setlength(MatrixArray,..) gefunden.

Grüße
Klaus

Kytrix 17. Mär 2008 16:52

Re: Arraytypfehler
 
check ich gerade nicht was ihr meint :oops:

Die Muhkuh 17. Mär 2008 16:55

Re: Arraytypfehler
 
Delphi-Quellcode:
SetLength(MatrixArray, <Größe 1>,<Größe 2>);
Machst am Besten beim Programmstart bzw. dann, wenn Du weißt, wie groß die Größen sein sollen.

DeddyH 17. Mär 2008 16:56

Re: Arraytypfehler
 
Du musst erst mit SetLength() Speicher für das dynamische Array MatrixArray reservieren, bevor Du es befüllen kannst, da dessen Größe ja nicht von vornherein bekannt ist.

Kytrix 17. Mär 2008 17:06

Re: Arraytypfehler
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
procedure TMain.BtRechnenClick(Sender: TObject);
var i, j: Byte;
begin
SetLength(MatrixArray, N, M);
For i:=1 to N do
begin
  For j:= 1 to M do
  Begin
    MatrixArray[i,j]:=StrToFloat(EditArray[i,j].Text);
  end;
end;
nun habe ich ne noch schlimmere fehlermeldung (siehe Anhang) .... ich bin am verzweifeln

Aber trotzdem DANKE euch =)

DeddyH 17. Mär 2008 17:10

Re: Arraytypfehler
 
Dynamische Arrays sind immer 0-indiziert.
Delphi-Quellcode:
procedure TMain.BtRechnenClick(Sender: TObject);
var i, j: Byte;
begin
SetLength(MatrixArray, N, M);
For i:= 0 to N - 1 do
begin
  For j:= 0 to M - 1 do
  Begin
    MatrixArray[i,j]:=StrToFloat(EditArray[i + 1,j + 1].Text);
  end;
end;
Ungetestet.

KLS 17. Mär 2008 17:11

Re: Arraytypfehler
 
Mal nen bisschen OT.

"EditArray: array[1..200, 1..200] of TEdit;"

Wofür brauchst du 40.000 Edits?

Kytrix 17. Mär 2008 17:31

Re: Arraytypfehler
 
Delphi-Quellcode:
...
    begin
      for i2 := i3 to M do
        for i1 := N downto 0 do
          Matrixarray[i1, i2] := Matrixarray[i1, i2] / Matrixarray[i3, i2];// HIER !!!!

      for i4 := i3 + 1 to M do
        for i5 := N downto 0 do
...

Nun bekomme ich als Fehlermeldung :"Projekt LGS_Rechner.exe raised exception class EInvalidOp with message'Invalid floating point Operation'.Process stopped."

(@ KLS weil ichs dynamisch nicht hinbekomme ....)

mkinzler 17. Mär 2008 17:41

Re: Arraytypfehler
 
Ersetze / durch DIV

DeddyH 17. Mär 2008 17:43

Re: Arraytypfehler
 
Delphi-Quellcode:
MatrixArray: array of array of Real;
Da wird div nicht gehen.

Kytrix 17. Mär 2008 17:51

Re: Arraytypfehler
 
genau es geht nicht mit div :?

Klaus01 17. Mär 2008 17:52

Re: Arraytypfehler
 
Ist es möglich, dass Matrixarray[i3, i2] zwischzeitlich mal den Wert 0 hat?

Grüße
Klaus

DeddyH 17. Mär 2008 17:56

Re: Arraytypfehler
 
Kommt dann nicht eine andere Exception (EDivByZero)?

Kytrix 17. Mär 2008 18:02

Re: Arraytypfehler
 
bei mir kommt keine "EDivByZero" Meldung.... es hängt jetzt nur noch an diesem "div" bzw " / " denn wenn ich dafür igendeine andere rechenoperation setze bekomme ich ergebnisse (die dann aber logischerweise falsch sind ) .... ka was ich da machen könnte

Klaus01 17. Mär 2008 18:41

Re: Arraytypfehler
 
Delphi-Quellcode:
 
  for i3 := 0 to M do
    begin
      for i2 := i3 to M do
        for i1 := N downto 0 do
          Matrixarray[i1, i2] := Matrixarray[i1, i2] / Matrixarray[i3, i2];
Sollten diese Schleifen nicht auch bis M -1 und von N-1 bis 0 laufen.

Denn wenn Du 10 Zeilen/Spalten definiert hast, läuft
Dein dynamisches Array von 0 -> 9.
Ich würde da aber einen anderen Fehler als EInvalidOp erwarten.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:00 Uhr.

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