Standardparameter

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Standardparameter

Beitrag von Mathias »

Ich habe folgende überladene proceduren:

Code: Alles auswählen

procedure TFace3D.RotateB(winkel: single);
begin
  RotateB(winkel, 0, Length(FFaceArray) - 1);
end;
 
procedure TFace3D.RotateB(winkel: single; Anfang, Ende: integer);
var
  l: integer;
  i, j: integer;
begin
  l := Length(FFaceArray) - 1;
  if Ende > l then begin
    Ende := l;
  end;
  if Anfang < 0 then begin
    Anfang := 0;
  end;
  for i := Anfang to Ende do begin
    for j := 0 to 2 do begin
      VertexModif.RotateB(FFaceArray[i, j], winkel);
    end;
  end;
end;  
Einfacher währe es so, aber dies schluckt der Compiler nicht.

Code: Alles auswählen

procedure TFace3D.RotateB(winkel: single; Anfang : integer = 0; Ende : integer = Length(FFaceArray));    
Muss ich dies bei overload sein lassen, oder gibt es doch etwas vereinfachtes ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Standardparameter

Beitrag von m.fuchs »

Du kannst nur konstante Werte als Default-Parameter übergeben. Deine Variante ist schon die richtige.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 5174
Registriert: Fr 8. Apr 2011, 09:01

Re: Standardparameter

Beitrag von wp_xyz »

Mit dem folgenden Code hast du beide Varianten in einer Prozedur:

Code: Alles auswählen

 
procedure TFace3D.RotateB(winkel: single; Anfang: Integer = 0; Ende: integer = -1);
var
  l: integer;
  i, j: integer;
begin
  if Ende = -1 then Ende := Length(FFaceArray); // << neu
 
  l := Length(FFaceArray) - 1;
  if Ende > l then begin
    Ende := l;
  end;
  if Anfang < 0 then begin
    Anfang := 0;
  end;
  for i := Anfang to Ende do begin
    for j := 0 to 2 do begin
      VertexModif.RotateB(FFaceArray[i, j], winkel);
    end;
  end;
end; 
 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Standardparameter

Beitrag von m.fuchs »

Hm, magische Konstanten wie die -1 sind keine schönen Lösungen und können zu Problemen führen. Was passiert, wenn wirklich mal -1 angegeben wird? Sofern das sinnvoll ist.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Standardparameter

Beitrag von Mathias »

Code: Alles auswählen

Hm, magische Konstanten wie die -1 sind keine schönen Lösungen und können zu Problemen führen. 
An sowas habe ich auch kurz gedacht, aber wie m.fuchs schreibt, nicht sinnvoll.

Ich habe noch was anderes probiert, ist aber auch irgendwie Müll.
Das beste wird wohl overload bleiben,

Code: Alles auswählen

procedure invert(var ia: Tia; pos: array of integer);
var
  a, e, i: integer;
begin
  case Length(pos) of
    0: begin
      a := 0;
      e := Length(ia) - 1;
    end;
    1: begin
      a := pos[0];
      e := Length(ia) - 1;
    end;
    2: begin
      a := pos[0];
      e := pos[1];
    end;
  end;
  for i := a to e do begin
    ia[i] := not ia[i];
  end;
end;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten