Autor Beitrag
Maweki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: Sa 12.03.05 20:39 
Hallo

ich habe eine Form mit einem StringGrid. Dort schreibe ich Zahlen rein. Und die sollen, so wie sie sind in einen array of array of single.
Die IsReal ueberpruefung mache ich per exception...

Jedenfalls beim Ausmachen kommt erstmal "Invalid Pointer operation", danach eine AccesViolation und ein RuntimeError...

Aber leider weiss ich nicht woran es liegt, da ich keine Elemente zum Freigeben habe...

Ich gebe euch einfach mal den Code:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
var
  Form1: TForm1;
  zahlen: array of array of Single;

implementation

{$R *.dfm}

function Uebertrag: Boolean;  // Uebertraegt daten von StringGrid nach dem zweidimensionalen Array "zahlen"
  function IsReal(nr: string): Boolean;  // unterfunktion, nur sichtbar in Uebertrag() - funktioniert ueber try&error (exception)
  // gibt true zurueck, wenn erfolgreich. False, wenn ein fehler passierte, die eingabe also keine Gleikommazahl ist
  begin
    result := true;  // rueckgabewert initialisieren
    try
      StrToFloat(nr);
    except
      result := false;  // wenn fehler, dann rueckgabewert auf false
    end;
  end;
// Uebertrag gibt true zurueck, wenn kein Fehler passiert ist..
var
  i1, i2: Byte;
begin
  result := true;                   // rueckgabewert initialisieren.
  SetLength(zahlen, Form1.StringGrid1.RowCount,       // Laenge des Arrays setzen (Speicher "beantragen")
    Form1.StringGrid1.ColCount - 1);
  for i1 := 0 to Form1.StringGrid1.RowCount - 1 do
    for i2 := 1 to Form1.StringGrid1.ColCount - 1 do    // start mit 1 da erste Zeile Bezeichner enthaellt...
      if IsReal(Form1.StringGrid1.Cells[i1, i2]) then
        zahlen[i1, i2] := StrToFloat(Form1.StringGrid1.Cells[i1, i2])
      else
        Result := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Uebertrag then
  begin
    ShowMessage('Sie haben eine falsche Eingabe betaetigt, sie *popo*');
    exit;
  end;
end;


Jedenfalls passiert waehrend der Prozedur kein Fehler, erst beim Ausmachen.
Woran liegt das? Bzw., welchen Speicher habe ich denn nun noch nicht freigegeben?
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Sa 12.03.05 20:51 
Du setzt zwar für die erste Dimension die Länge aber nicht für
die Elemente der jeweils zweiten Dimension des Arrays.

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Maweki Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: So 13.03.05 00:31 
Doch, eigentlich schon...

ausblenden Delphi-Quelltext
1:
2:
SetLength(zahlen, Form1.StringGrid1.RowCount,
  Form1.StringGrid1.ColCount - 1);

entspricht
ausblenden Delphi-Quelltext
1:
SetLength(zahlen, Form1.StringGrid1.RowCount, Form1.StringGrid1.ColCount - 1);					

und da ist erstmal zahlen als array-bezeichnung, und dann die Row-Counts als laengen...

Und da im Styleguide festgelegt ist, dass man nicht ueber 80 zeichen hinaus soll, habe ich dort getrennt. Das war die logischste trennung, von daher...

also das is es sicher nich...
ausserdem, das zuweisen scheint ja zu gehen, aber beim schliessen scheint er Probleme mit dem Freigeben des Speichers zu haben...
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: So 13.03.05 08:20 
ausblenden Delphi-Quelltext
1:
  SetLength(zahlen, F.SG.RowCount,F.SG.ColCount); // 1. Dim.: RowCount, 2. Dim.: ColCount!!!					
Maweki Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: So 13.03.05 09:26 
das ist soweit richtig, da die erste reihe fix ist...
Daher is das mit der y-dimension auch -1...

Die zwei Dimensionen entsprechen genau der anzahl der Werte. Wenn ich sie versuche zu fuellen kommt ja auch noch kein Zugriffsfehler. Erst beim schliessen...

Gruesse
Maweki
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: So 13.03.05 11:23 
Dann schau dir mal die Index-Werte an, mit denen du auf dein Array zugreifst. Beide for-Anweisungen enden doch bei den Werten Count - 1! Da kann nur eines von beiden richtig sein!!! SetLength führt immer zu Arrays, die mit 0 beginnen, ob du nun drauf zugreifst oder nicht, spielt dabei keine Rolle. Probier es also einfach mal aus.
Maweki Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: So 13.03.05 11:27 
Es war ein falscher zugriff. Sass jetzt ne Stunde mitm Debugger rum...
Aber es hat mich so irritiert, dass der Fehler erst beim Freigeben kommt...
Ich habe vorher schon auf nichtexistente Stellen zugegriffen (Row und ColCount verwechselt). Aber ich dachte, der Fehler haette viel eher kommen muessen...