Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 17.10.11 18:18 
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


Zuletzt bearbeitet von Peter18 am Di 18.10.11 11:22, insgesamt 1-mal bearbeitet
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 17.10.11 18:50 
Heißt die Variable gegf. ungünstig ...

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
rvelthuis.de/article...rticles-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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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