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.

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

Beitragvon fpGUIcoder » 29. Okt 2015, 20:33 Error: Incompatible Type for arg no. 1: Got dynamic array o

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.
fpGUIcoder
 
Beiträge: 199
Registriert: 20. Okt 2015, 22:13

Beitragvon theo » 29. Okt 2015, 22:02 Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

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.
theo
 
Beiträge: 7886
Registriert: 11. Sep 2006, 18:01

Beitragvon fpGUIcoder » 30. Okt 2015, 15:20 Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

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 31. Okt 2015, 13:53, insgesamt 2-mal geändert.
Grund: richtiger Highlighter
fpGUIcoder
 
Beiträge: 199
Registriert: 20. Okt 2015, 22:13

Beitragvon Socke » 30. Okt 2015, 15:28 Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

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
Socke
 
Beiträge: 2393
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon theo » 30. Okt 2015, 15:52 Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

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;
theo
 
Beiträge: 7886
Registriert: 11. Sep 2006, 18:01

Beitragvon Warf » 30. Okt 2015, 16:39 Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

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);
...
Warf
 
Beiträge: 616
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon TBug » 30. Okt 2015, 16:45 Re: Error: Incompatible Type for arg no. 1: Got dynamic arr

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:


.
TBug
 
Beiträge: 116
Registriert: 2. Sep 2015, 10:09
OS, Lazarus, FPC: Lazaurus 1.4.2 | 
CPU-Target: Windows
Nach oben

• Themenende •

Zurück zu Programmierung



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried