Error: Incompatible Type for arg no. 1: Got dynamic array o

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
fpGUIcoder
Beiträge: 199
Registriert: Di 20. Okt 2015, 23:13

Error: Incompatible Type for arg no. 1: Got dynamic array o

Beitrag von fpGUIcoder »

Hallo,

ich kämpfe gerade mit der Übergabe von Daten eines Arrays:

Code: Alles auswählen

 
procedure PaintCross(Canvas: TfpgCanvas; XLeft, YUp, XRight, YLow, CrossX1, CrossX2, CrossY1, CrossY2: integer);
var
  P: array[0..12] of TPoint;
begin
  SetLength(P, 13); //Diese Zeile habe ich ergänzt, nachdem ich das Array P in ein dynamisches Array array of TPoint geändert habe!
  P[0].x  := XLeft;     P[0].y  := CrossY1;
  P[1].x  := CrossX1;   P[1].y  := P[0].y;
  P[2].x  := P[1].x;    P[2].y  := YUp;
  P[3].x  := CrossX2;   P[3].y  := P[2].y;
  P[4].x  := P[3].x;    P[4].y  := CrossY1;
  P[5].x  := XRight;    P[5].y  := P[4].y;
  P[6].x  := P[5].x;    P[6].y  := CrossY2;
  P[7].x  := CrossX2;   P[7].y  := P[6].y;
  P[8].x  := P[7].x;    P[8].y  := YLow;
  P[9].x  := CrossX1;   P[9].y  := P[8].y;
  P[10].x := P[9].x;    P[10].y := CrossY2;
  P[11].x := XLeft;     P[11].y := P[10].y;
  P[12].x := P[11].x;   P[12].y := CrossY1;
  Canvas.DrawPolygon(P);
end;
 


Canvas.DrawPolygon hatte diese Deklaration:

Code: Alles auswählen

 
procedure   DoDrawPolygon(Points: PPoint; NumPts: Integer; Winding: boolean = False); override;               
 


Dabei erhalte ich einn Compilerfehler Inkompatible Typen GOT array of TPoint expected Open Array of TPoint

Nun habe ich die Deklaration geändert in:

Code: Alles auswählen

 
procedure   DoDrawPolygon(Points: array of TPoint; NumPts: Integer; Winding: boolean = False); override;               
 


und das Array in der PaintCross Prozedur von

Code: Alles auswählen

 
var P: array[0..12] of TPoint;
 


Code: Alles auswählen

 
var P: array of TPoint;
 


und im Code der Prozedur PaintCross SetLength(P, 13) als erste Zeile hinzugefügt.

Dennoch erhalte ich den Compilerfehler im Strangtitel.

Was kann ich hier machen, damit ich den Code übersetzen kann?

Die Compilerdirektive {$mode objfpc} ist gesetzt.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

Beitrag von theo »

Ich verstehe deine Frage nicht wirklich.
Also das compiliert.

Code: Alles auswählen

 
procedure Test(Points: array of TPoint);
begin
  //
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var A:Array of TPoint;
begin
  Test(A);
end;   


Was du da für Prozeduren "overridest" und warum erschliesst sich mir nicht.

fpGUIcoder
Beiträge: 199
Registriert: Di 20. Okt 2015, 23:13

Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

Beitrag von fpGUIcoder »

Und wenn in einer großen Quellcodesammlung, eine Bibliotheksfunktion Test so hier vorgegeben wäre:,

Code: Alles auswählen

 
procedure Test(Points: PPoint);
begin
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var A:Array[0..max] of TPoint;
begin
  Test(A);
end;   
 


die im Quelltext an vielen Stellen aufgerufen wird?

So daß eine Lösung für den Aufruf einer Änderung des Quellcodes vozuziehen wäre, weil die Funktion im Code viel zu oft aufgerufen wird.

Leider finde ich keine besser Erklärung für das Problem.

Mit Test(@A) klappt es auch nicht mit dem Compilieren. Ich verstehe nicht, warum. sonst wäre diese Frage nicht hier gelandet.

Ich such ja gerade für dieses Problem eine Lösung.


Irgendein Workaround der erst mal übersetzt wird tut es auch.
Zuletzt geändert von Lori am Sa 31. Okt 2015, 13:53, insgesamt 2-mal geändert.
Grund: richtiger Highlighter

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

Beitrag von Socke »

Inkompatible Typen GOT array of TPoint expected Open Array of TPoint

Siehe: http://www.freepascal.org/docs-html/ref ... 460003.3.1 und http://www.freepascal.org/docs-html/ref ... 700014.4.5
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

Beitrag von theo »

Also für mich sieht das aus, als hättest du dich verirrt. Normalerweise musst du wohl nicht mit PPoint hantieren.
Es ginge aber so:

Code: Alles auswählen

 
uses GraphMath;       
...
procedure Test(Points: PPoint);
begin
  ShowMessage(IntToStr(Points^.X));
  Inc(Points);
  ShowMessage(IntToStr(Points^.X));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var A: array of TPoint;
begin
  SetLength(A, 2);
  A[0] := Point(2, 3);
  A[1] := Point(4, 5);
  Test(@A[0]);
end;

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

Beitrag von Warf »

Dein Problem ist dass es unterschiede Zwischen statischen, dynamischen und offenen Arrays gibt:

Code: Alles auswählen

var arr1: array[Start..Ende] of Typ; // Statisches array
  arr2: array of Typ; //Dynamisches Array
procedure Foo(arr3: array of Typ); // offenes array

Definierst du als Parametertyp array of Typ in einer Funktion/Methode ist das ein offenes Array und kein Statisches oder Dynamisches.

Nutze bei so etwas immer einen eigenen typen:

Code: Alles auswählen

Type
  TMyArr = Array of Typ; // Dynamisch oder Statisch
 
procedure Foo(arr: TMyArr);
...

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

Beitrag von TBug »

Das sind ja zwei unterschiedliche Dinge. In Post 1 geht es um die Übergabe eines Arrays und danach um die Übergabe eines Zeiger auf ein TPoint.

Zu 2 steht es ja schon im Post von theo.

Zu 1 kannst du Folgendes machen:

Code: Alles auswählen

 
type
  TArrayOfTPoint = Array of TPoint;
 


Code: Alles auswählen

 
procedure   DoDrawPolygon(Points: TArrayOfTPoint; NumPts: Integer; Winding: boolean = False); override;
 


Code: Alles auswählen

 
 
procedure PaintCross(Canvas: TfpgCanvas; XLeft, YUp, XRight, YLow, CrossX1, CrossX2, CrossY1, CrossY2: integer);
var
  P: TArrayOfTPoint ;
begin
  SetLength(P, 13);
 
  ...
 
  Canvas.DrawPolygon(P);
end;
 


[EDIT]: zu langsam :oops:


.

Antworten