generic Swap

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

generic Swap

Beitrag von Mathias »

Ist so etwas in dieser Art möglich ?

Code: Alles auswählen

program Project1;
 
  procedure generic Swap(var a, b:<T>);
  var
    d: T;
  begin
    d := a;
    a := b;
    b := d;
  end;
 
var
  a: integer = 1;
  b: integer = 2;
 
begin
  Swap(a, b);
  Writeln(a);
  Writeln(b);
  Readln;
end.       
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: generic Swap

Beitrag von theo »

Ich glaube so nicht. Das geht offenbar nur mit Klassen. Aber ich bin kein Experte für Generics.
http://www.freepascal.org/docs-html/ref ... -1110008.1

Mit Varianten geht sowas ähnliches:

Code: Alles auswählen

 
procedure VariantSwap(var a, b:Variant);
var
  d: Variant;
begin
  d := a;
  a := b;
  b := d;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var a,b:Variant;
begin
  a:='eins';
  b:='zwei';
  VariantSwap(a,b);
  Caption:=a;
end;   

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: generic Swap

Beitrag von mschnell »

Im Thread "Wieso immer Java" wurde doch nach Nachteilen von (fpc-) Pascal gegenüber anderen Programmiersprachen gesucht :D

in GNU C machst Du einfach

Code: Alles auswählen

#define VariantSwap(a,b) ({typeof(a) x=a; a=b; b=x;})
 
void myintswap(int *ai, int *bi) {
	VariantSwap(*ai, *bi);
}
 
void mycharswap(char *ac, char *bc) {
	VariantSwap(*ac, *bc);
}
"Generischer" geht nicht :D :D :D

-Michael
Zuletzt geändert von mschnell am Di 23. Dez 2014, 13:18, insgesamt 1-mal geändert.

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: generic Swap

Beitrag von m.fuchs »

mschnell hat geschrieben:"Generischer" geht nicht :D :D :D
Unleserlicher auch nicht. :wink:
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: generic Swap

Beitrag von mschnell »

m.fuchs hat geschrieben:Unleserlicher auch nicht. :wink:
Genau ! In Punkto Leserlichkeit ist Pascal ungeschlagen.

Vermutlich gibt es deshalb keine Generics außerhalb von Objekten.

-Michael

Socke
Lazarusforum e. V.
Beiträge: 3178
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: generic Swap

Beitrag von Socke »

mschnell hat geschrieben:Vermutlich gibt es deshalb keine Generics außerhalb von Objekten.
Außerhalb von Klassen gibt es Compiler Magic.

Man könnte auch einen Mechanismus in der Sprache einfügen um statische Klassen-Methoden ohne Klassennamen aufzurufen. So etwas gibt es in Java um Standardfunktionen (z.B. mathematische Funktionen) wie Methoden der aktuellen Klasse aufrufen zu können. Mit so einem Konstrukt könnte man auch in Pascal die Generics wie normale Funktionen verwenden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: generic Swap

Beitrag von Mathias »

Mit template kann man es in C++ auch lösen.

Code: Alles auswählen

#include <iostream>
 
template <typename T>
void Swap(T& a, T& b)
{
    T c = a;
    a = b;
    b = c;
}
 
int main()
{
    int i1 = 3;
    int i2 = 4;
    Swap(i1, i2);
    std::cout << i1 << ' ' << i2 << std::endl;
    float f1 = 3.3f;
    float f2 = 4.4f;
    Swap(f1, f2);
    std::cout << f1 << ' ' << f2 << std::endl;
}
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: generic Swap

Beitrag von mschnell »

Mathias hat geschrieben:Mit template kann man es in C++ auch lösen.
Mit nur 50 Zeichen und nur "typeof" als zusätzliche Syntax, um ein Generic zu ermöglichen bleibt das GNU #define Macro ungeschlagen :D :D :D :D :D (geht natürlich auch in GNU c++)
-Michael

Antworten