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
Peter18 hat folgendes geschrieben : |
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. ;-)
Peter18 hat folgendes geschrieben : |
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
Peter18 hat folgendes geschrieben : |
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!