Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehler: Inkompatible Typen bei SetLength


Peter18 - Mo 17.10.11 18:18
Titel: Fehler: Inkompatible Typen bei SetLength
Ein freundliches Hallo an alle,

heute bin ich auf eine seltsame Fehlermeldung gestoßen, vielleicht hat ja jemand eine Erklärung dafür:

Ich verwende ein variables Array vom Type Record um Daten zu speichern. Die Daten sind unterschiedlicher Art, so dass der Record Typen wie String, Integer u.s.w. enthält. Das Array wird verlängert, wenn weitere Daten zu speichern sind. Hat so weit auch funktioniert!
Dann habe ich die Type-Deklaration in eine extra Unit gesteckt. Die bearbeitenden Routinen kamen in eine weitere Unit. Die Variable wird nach wie vor in der Haupt-Unit deklariert und den Bearbeitungsroutinen übergeben. Die Haupt-Unit und die mit den Bearbeitungsroutinen haben die Typdeklaration mit Uses erhalten. Der Typ wird in der Parameterliste nicht beanstandet. Dennoch kommt die Fehlermeldung "Inkompatible Typen", wenn ich "SetLength" in den Bearbeitungsroutinen aufrufe. Rufe ich jedoch "SetLength" in der Haupt-Unit vor dem Aufruf der Bearbeitungsroutine auf, kommt keine Fehlermeldung!

Hoffe jemand kann das erklären.

Danke euch allen und Grüße aus dem Norden

Peter


bummi - Mo 17.10.11 18:50

Heißt die Variable gegf. ungünstig ...


jaenicke - Mo 17.10.11 19:55

Auf die Idee ein wenig Quelltext mit zu zeigen, bist du wohl nicht gekommen... :roll:

Jedenfalls vermute ich einmal, dass das so ca. aussieht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TTest = record
  end;

procedure Test(var a: array of TTest);
begin
  SetLength(a, 6);
end;

var
  a: array of TTest;
begin
  Test(a);
Richtig wäre:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type
  TTest = record
  end;
  TTestArray = array of TTest;

procedure Test(var a: TTestArray);
begin
  SetLength(a, 6);
end;

var
  a: TTestArray;
begin
  Test(a);


Peter18 - Di 18.10.11 11:18

Hallo bummi,

danke für Deine Antwort. Ich glaube nicht das "LinkLst" und "T_Link" zu Problemen führen sollten.

Hallo jaenicke,

Dank auch Dir. Sicher bin ich auf die Idee gekommen, aber 3 Units wollte ich Euch ersparen. Ich glaube mit Deiner Annahme liegst Du richtig. Ich kann es aber erst übermorgen testen, weil ich Termine habe. Werde dann berichten.

Hast Du eine Erklärung, warum die Deklartion so aussehen muß? Ist "TTestArray = array of TTest;" nicht auch als "type" zu deklarieren?

Grüße von der Nordsee

Peter


jaenicke - Di 18.10.11 11:26

user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
Sicher bin ich auf die Idee gekommen, aber 3 Units wollte ich Euch ersparen.
Es reichen ja in so einem Fall die Teile des Codes, in dem der Fehler auftritt. Sprich hier die Typdeklaration und die Deklaration und der Aufruf der Funktion, bei der der Fehler auftritt. ;-)

user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
Hast Du eine Erklärung, warum die Deklartion so aussehen muß?
Was du benutzt hast, ist ein "open array parameter". Deklarierst du aber einen eigenen Typen, hast du ein "dynamic array" als Parameter (und dynamisch soll es ja sein, sprich du willst die Größe ändern). Das sind also zwei verschiedene Sachen, auch wenn sie ähnlich aussehen.

Mehr dazu findest du hier:
http://rvelthuis.de/articles/articles-openarr.html

user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
Ist "TTestArray = array of TTest;" nicht auch als "type" zu deklarieren?
Man muss nicht für jeden Typ ein erneutes type hinschreiben, das gilt bis die Sektion endet.


Peter18 - Do 20.10.11 13:30

Hallo jaenicke,

nochmals danke für Deine Antwort. Du hast recht und ich gelobe Besserung, dachte nur, da ich es sowiso beschreiben mußte könnte ich es mir auch sparen. Dafür hattest Du dann den Aufwand, auch dafür danke.

Dank auch für Deine Erklärung, C und VB sind da ja nicht so spitzfindig. Hab in diesem Sinne wieder ein neues Problem mit Pointern, dafür mache ich aber einen neuen Thred auf, wenn ich nichts finde.

Grüße von der Nordsee

Peter