Variablen wie in C

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

Variablen wie in C

Beitrag von Mathias »

Kann man eine Dekleration, so ähnlich wie im Code machen ?

Code: Alles auswählen

type
  TVector = array[0..2] of GLfloat; 
 
function vec3(x, y, z: GLfloat): TVector;
begin
  Result[0] := x;
  Result[1] := y;
  Result[2] := z;
end;
 
var
  v : vec3;
 
begin
  v:= vec(1, 2, 3);
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Variablen wie in C

Beitrag von wp_xyz »

Fast richtig...

Code: Alles auswählen

 
    type
      TVector = array[0..2] of GLfloat; 
 
    function vec3(x, y, z: GLfloat): TVector;
    begin
      Result[0] := x;
      Result[1] := y;
      Result[2] := z;
    end;
 
    var
      v : TVector;  // hier steht der Typ, TVector
 
    begin
      v:= vec3(1, 2, 3)// Das ist die Funktion, die den Vektor erzeugt.
    end.
 

diogenes
Beiträge: 200
Registriert: So 11. Jul 2010, 18:39
OS, Lazarus, FPC: Linux
CPU-Target: 64 Bit
Wohnort: Wien
Kontaktdaten:

Re: Variablen wie in C

Beitrag von diogenes »

Und wenn man hinter den Fuinktionskopf auch noch das I-Tüpfelchen "inline;" hinzufügt, das den Funktion direkt an die Stelle fügt (wie ein Assembler-Makro), dann ist das noch ein wenig schneller, und Du hast den gewünschten Code :)
Ceterum censeo computatores per Pascal docendos esse.

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

Re: Variablen wie in C

Beitrag von Mathias »

Du hat mich falsch verstanden, ich meinte vec3 sollte die gleichen Eigenschaften haben, so wie in diesem C-Beispiel unten. Dies ist ein Ausschnitt aus einem Fragementshader von OpenGL, und diese sind in C geschrieben.

Code: Alles auswählen

#version 330
in vec4 Color; 
out vec4 outColor;
 
vec3 Farbe;
 
void main(void)
{
  Farbe = vec3(0.0, 1.0, 0.0);
  outColor = Color;
  outColor = vec4(vec3(1.0, 0.0, 0.0), 1.0);
  outColor = vec4(Farbe, 1.0);
}         
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Variablen wie in C

Beitrag von wp_xyz »

Bei Pascal sind Code und Deklarationsteil streng getrennt. Allerding kann man die Initialisierung des Vektors gleich bei der Deklaration vornehmen:

Code: Alles auswählen

 
var
  Farbe: TVector = (x:0.0; y:1.0; z:2.0);
 

aber das ist definitiv mehr Schreibarbeit und geht auch nur für Konstanten.

Was hast du gegen die oben verwendete Methode? Setze vielleicht noch "create_" vor das "v3", dann hast du auch den Datentyp mit in der Erzeugungsfunktion. Eine 1:1-Übernahme des C-Quelltextes nach Pascal ist ohnehin nicht möglich.

Code: Alles auswählen

 
type
    TVector = array[0..2] of GLfloat; 
 
    function create_vec3(x, y, z: GLfloat): TVector; inline;
    begin
      Result[0] := x;
      Result[1] := y;
      Result[2] := z;
    end;
 
    var
      v : TVector;
 
    begin
      v:= create_vec3(1, 2, 3);
    end.
 

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

Re: Variablen wie in C

Beitrag von Mathias »

Wieso kommt da diese Fehlermeldung: Error: Illegal symbol for property access, dies ist die Zeile mit write WriteVector.

Als Vorlag habe ich diese Seite genommen.http://www.delphi-treff.de/object-pasca ... d-objekte/

Code: Alles auswählen

  TMatrixModif = class
  private
    ReadVector: TVector;
    procedure WriteVector(x, y, z: GLfloat);
  public
    property vec3: TVector read ReadVector write WriteVector;
  end
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Variablen wie in C

Beitrag von wp_xyz »

Code: Alles auswählen

 
  TMatrixModif = class
  private
    FReadVector: TVector;
    procedure SetVector(x, y, z: GLfloat);
  public
    property vec3: TVector read FReadVector write SetVector;
  end;
 

Das ist mehr so, wie ich es kenne - deine Deklaration scheint einige reservierte Namen zu verwenden.

Falls dieses Posting im Zusammenhang mit den vorigen steht: Mit diesem Ansatz holst du dir das ganze Umfeld mit Klassenerzeugung und -zerstörung an Bord. Das wird garantiert komplizierter als die Funktionslösung.

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

Re: Variablen wie in C

Beitrag von Mathias »

Ich habe deine Vorlage kopiert, aber es kommt immer noch der gleiche Fehler.

Das wird garantiert komplizierter als die Funktionslösung.

Ich werde es nicht anwenden, aber es würde mich trotzdem interessieren wieso der Fehler kommt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Variablen wie in C

Beitrag von wp_xyz »

Seltsam, sollte stimmen. Du hast hoffentlich "type" vor die ganze Sache geschrieben und "SetVector" mit Code hinterlegt?

Code: Alles auswählen

 
type
  TMatrixModif = class
  private
    FReadVector: TVector;
    procedure SetVector(x, y, z: GLfloat);
  public
    property vec3: TVector read FReadVector write SetVector;
  end;
 
procedure TMatrixModif.SetVector(x,y,z: GLfloat);
begin
  FReadVector.x := x;
  FReadVector.y := y;
  FReadVector.z := z;
end:
 

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

Re: Variablen wie in C

Beitrag von Mathias »

SetVector sieht so aus, und Type habe ich auch.
wen ich die Fehlerhafte Zeile lösche, dann compiliert er ohne Fehler.


Code: Alles auswählen

procedure TMatrixModif.SetVector(x, y, z: GLfloat);
begin
  FReadVector[0]:=x;
  FReadVector[1]:=y;
  FReadVector[2]:=z;
end;     
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Variablen wie in C

Beitrag von theo »

Irgendwas habt ihr da nicht ganz verstanden.

Eine Property Setter Prozedur kann nicht beliebige Parameter haben, sondern nur den property Typ.

Code: Alles auswählen

Also
    function GetVector: TVector;
    procedure SetVector(AValue: TVector);
 
  public
    property vec3: TVector read GetVector write SetVector;

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

Re: Variablen wie in C

Beitrag von wp_xyz »

Natürlich

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

Re: Variablen wie in C

Beitrag von Mathias »

Jetzt geht es, danke.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Variablen wie in C

Beitrag von Mathias »

Ich habe eine uralten Post von mir angeguckt und das was ich in der ersten Frage gefragt habe, ist unterdessen fast möglich geworden.
Danke den neuen Array-Operationen.
Es braucht nicht mal den Umweg über eine Funktion.
So einfach ist es unterdessen geworden.

Code: Alles auswählen

type
  vec3 = array[0..2] of Single;
var
  v : vec3;
begin
  v:= [1, 2, 3];
end.   
Auch das Zeugs weiter unten, kann man dank typenhelper viel einfacher machen, es braucht keine Klasse dafür.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Variablen wie in C

Beitrag von fliegermichl »

Man kann es auch so machen:

Code: Alles auswählen

var v : array[0..2] of Single = (1, 2, 3);

Antworten