 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jens Müller Guest
|
|
| Back to top |
|
 |
Elcaro Nosille Guest
|
Posted: Sat Jan 20, 2007 1:36 am Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Stefan Ram schrieb:
| Quote: | Also vielleicht etwas mehr Gewicht auf Konzepte als auf die
Sprache, aber bitte doch anhand von C++.
Das englische Wort »concept« entspricht meist dem deutschen
Worte »Begriff«, während unser Wort »Konzept« eher »plan« or
»draft« wäre. Siehe
http://www.aifb.uni-karlsruhe.de/WBS/dob/docs/informatik.pdf
ab Seite 17 unten.
|
AAAAAAAAAAAAAAAAAAH! Das ist ja zum Schreien! Du solltest anderen
schon die Freiheit lassen sich nach belieben auszudrücken. So lange
das verstanden wird ist's völlig ok. |
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Sun Jan 21, 2007 12:09 am Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Stefan Reuther wrote:
| Quote: | Da wäre einmal das 'int'-Objekt. Sein natürlicher Lebensraum ist unter
anderem das Prozessor-Register, in dem er aufgrund seiner geringen
Komplexität (eben einfach nur eine Zahl) bequem Platz findet.
Konzeptionell wäre es nicht mal schwierig, darauf Methoden anzuwenden..
C++ gibt dir aber eben keine Möglichkeiten, welche zu definieren, so
dass du dich mit den vordefinierten Operatoren begnügen musst.
Dann wäre da noch das, was Java 'Integer' nennt. Das enthält neben der
Nutzinformation "Zahl" noch irgendwelche Typinformationen (üblicherweise
vtbl-Zeiger). Damit findet es z.B. nicht mehr in einem Prozessorregister
Platz, und ist damit gerade mal halb so effizient wie ein nackiger
'int'. So eine Klasse gibt es in Standard-C++ nicht vordefiniert, das
lässt sich aber in Nullkommanix nachholen.
|
Das muß man aber nicht so implementieren, wie Java das macht. Wenn die
Int-Klasse keine andere Funktionaltät hat als int mit den zugehörigen
Operatoren, dann muß der Kompiler eine Int-Klasse auch nicht anders
implementieren als ein int. Es wäre also eine Art Psyodonym für ein int,
könnte aber als Basis für Ableitungen genutzt werden, so daß ich eigene
Int-Variante deklarieren kann. Solange ich meinen eigenen Int-Varianten
keine eigenen Eigenschaften oder Methoden spendiere und auch keine
Operatoren überlade, bräuchte solange keine Polimorphie genutzt wird,
was der Compiler feststellen kann auch keine Typ-Information generiert
werden. Er könnte also alles, was ein Int von einem int unterscheidet
wegoptimieren. Erst wenn ich vom Int ableite und dabei Polimorphie nutze
oder irgend etwas ergänze oder abändere, muß er wirklich
unterschiedlichen Code generieren. Wenn ich keine Polimorphie nutze,
dann findet ja keine Typrüfung zur Laufzeit statt, sondern alles
passiert zur Compilezeit, d.h. es müßte nicht zwingend ein andere Code
herauskommen.
Aber sowas sieht C++ nicht vor. |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sun Jan 21, 2007 4:38 pm Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Georg Maaß wrote:
| Quote: | Stefan Reuther wrote:
Da wäre einmal das 'int'-Objekt. [...]
Dann wäre da noch das, was Java 'Integer' nennt. [...]
Das muß man aber nicht so implementieren, wie Java das macht. Wenn die
Int-Klasse keine andere Funktionaltät hat als int mit den zugehörigen
Operatoren, dann muß der Kompiler eine Int-Klasse auch nicht anders
implementieren als ein int.
|
Kannst du haben:
class Int {
int n;
public:
Int(int n) : n(n) { }
Int operator+(Int a, Int b) { return a.n + b.n; }
// ...
};
Hat nur eben aufgrund der fehlenden Polymorphie keinen Nährwert
gegenüber int.
| Quote: | Es wäre also eine Art Psyodonym für ein int,
könnte aber als Basis für Ableitungen genutzt werden, so daß ich eigene
Int-Variante deklarieren kann. Solange ich meinen eigenen Int-Varianten
keine eigenen Eigenschaften oder Methoden spendiere und auch keine
Operatoren überlade, bräuchte solange keine Polimorphie genutzt wird,
was der Compiler feststellen kann auch keine Typ-Information generiert
werden.
|
Damit du (sinnvoll) davon ableiten kannst, muss aber die Int-Klasse
bereits polymorph sein. Sonst würde eben bei
void increment(Int& i) { ++i; }
immer die Methode Int::operator++ aufgerufen, niemals deine eigene.
| Quote: | Er könnte also alles, was ein Int von einem int unterscheidet
wegoptimieren. Erst wenn ich vom Int ableite und dabei Polimorphie nutze
oder irgend etwas ergänze oder abändere, muß er wirklich
unterschiedlichen Code generieren.
|
Dazu muss er aber in dem Moment, wo er ein Int-Objekt sieht, wissen,
dass niemals im ganzen Programm ein DerivedFromInt-Objekt verwendet
wird. *Theoretisch* ist das vielleicht möglich (Programm einmal
übersetzen, feststellen, dass keine Ableitungen von Int existieren,
Programm nochmal übersetzen und bei Int die Polymorphie weglassen). Aber
auch das funktioniert nicht bei all den Ferkeleien, die in C++ so
möglich sind:
template<int n> class huhu { };
template<> class huhu<sizeof(int)> : public Int { ... };
huhu<sizeof(Int)> x;
++x;
Würde im ersten Anlauf 'x' z.B. den Typ huhu<8> geben, feststellen, dass
Int nicht polymorph ist, nochmal compilieren, und x den Typ huhu<4>
geben. Jetzt ist es aber auf einmal polymorph verwendet.
Stefan |
|
| Back to top |
|
 |
Hubert Schmid Guest
|
Posted: Tue Jan 23, 2007 6:22 pm Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Jürgen Herz <juergen (AT) jherz (DOT) redirectme.net> writes:
| Quote: | Allerdings versuche ich es jetzt nochmal etwas anders und frage nach
einem Buch zum praktischen Einsatz von C++. Also meine Kernfrage
etwas umformuliert: Wie arbeite ich mit C++ am Besten und wende das
was in C++ gegenüber C anders ist am Besten an? Das "Beste" ist
sicherlich eine strittige Frage, aber deshalb frage ich ja in einer
Usegroup und nicht nur einen einzelnen.
|
Ich empfehle Dir noch das folgende Buch:
C++ Coding Stadards
101 Rules, Guidelines, and Best Practices
Herb Sutter and Andrei Alexandrescu
Dieses Buch ist vergleichbar mit den Büchern von Scott Meyers, aber
meiner Meinung nach wesentlich moderner und besser.
--
Hubert Schmid - http://www.z42.de |
|
| Back to top |
|
 |
Tibor Pausz Guest
|
Posted: Tue Jan 23, 2007 8:40 pm Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Stefan Reuther schrieb:
| Quote: | Damit du (sinnvoll) davon ableiten kannst, muss aber die Int-Klasse
bereits polymorph sein. Sonst würde eben bei
void increment(Int& i) { ++i; }
immer die Methode Int::operator++ aufgerufen, niemals deine eigene.
|
Nein, das muß nicht der Fall sein. Es wäre vollkommen ausreichend, wenn
eine abstrakte Basisklasse für Ints gäbe und davon alle konkreten
Integer-Klassen abgeleitet werden.
Damit das funktioniert müßten lediglich alle Funktionen in der
abgeleiteten Klasse überladen werden. Das hätte den Vorteil, daß man so
Interfaces vererben könnte. Alternativ könnte man auch ein Konstrukt
Interfaces in die Sprache einführen.
Templates könnte man so umändern, daß man zukünftig eine bestimme Klasse
für den Parametertyp festlegt. Dann könnte nur diese Klasse oder davon
abgeleitete Klassen benutzt werden. Endlich lesbare Fehlermeldungen beim
Arbeiten mit Templates! |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Tue Jan 23, 2007 11:26 pm Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Tibor Pausz wrote:
| Quote: | Stefan Reuther schrieb:
Damit du (sinnvoll) davon ableiten kannst, muss aber die Int-Klasse
bereits polymorph sein. Sonst würde eben bei
void increment(Int& i) { ++i; }
immer die Methode Int::operator++ aufgerufen, niemals deine eigene.
Nein, das muß nicht der Fall sein. Es wäre vollkommen ausreichend, wenn
eine abstrakte Basisklasse für Ints gäbe und davon alle konkreten
Integer-Klassen abgeleitet werden.
|
Dann wiederum verlieren wir die Eigenschaft, mit Integern effizient
rechnen zu können, weil auf einmal alles über virtuelle Aufrufe geht.
Es geht halt nicht beides gleichzeitig: effiziente 'int's und ableitbare
Integer-Klasse in einem.
Stefan |
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Sat Jan 27, 2007 7:36 pm Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Stefan Reuther wrote:
| Quote: | Dann wiederum verlieren wir die Eigenschaft, mit Integern effizient
rechnen zu können, weil auf einmal alles über virtuelle Aufrufe geht.
|
Nein, denn eine Int-Klasse als eingebauter Typ und ihre unveränderten
Ableitungen könnte im Kompiler wie int kompiliert werden aber trotzdem
als unterschiedliche Typen hinsichtlich Typsicherheit darstellen, also
eine Art typedef, wobei aber bei Typprüfungen zur Kompilezeit anders als
bei typedef Typungleichheit herauskommen soll.
| Quote: | Es geht halt nicht beides gleichzeitig: effiziente 'int's und ableitbare
Integer-Klasse in einem.
|
Mit den derzeigen Sprachmitten nicht. Aber C++ kann weiterentwickelt werden. |
|
| Back to top |
|
 |
Tibor Pausz Guest
|
Posted: Sat Jan 27, 2007 11:45 pm Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Stefan Reuther schrieb:
| Quote: | Dann wiederum verlieren wir die Eigenschaft, mit Integern effizient
rechnen zu können, weil auf einmal alles über virtuelle Aufrufe geht.
|
Nein, nein, keine virtuellen Methoden! Ganz normale member functions
sollen es sein. Etwas Compilermagie wäre an der einen oder anderen
Stelle notwendig, aber in Prinzip wäre das möglich.
Der Vorteil wäre, daß man diese unsinnigen Header mit den
Implementationsgrenzen nicht mehr bräuchte. Wie will man effizient
generische Algorithmen schreiben, wenn man jedesmal spezialisieren muß,
nur damit man zum Beispiel herausbekommt wie groß die maximale Zahl
eines integralen Datentyps ist?
| Quote: | Es geht halt nicht beides gleichzeitig: effiziente 'int's und ableitbare
Integer-Klasse in einem.
|
Doch das ginge sehr wohl, Du denkst bloß einen Schritt zu weit. Du
willst gleich Zahlenklassen einführen, die Polymorphie unterstützen und
darauf kann man ohne Probleme verzichten. |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sun Jan 28, 2007 7:09 pm Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Tibor Pausz wrote:
| Quote: | Stefan Reuther schrieb:
Dann wiederum verlieren wir die Eigenschaft, mit Integern effizient
rechnen zu können, weil auf einmal alles über virtuelle Aufrufe geht.
Nein, nein, keine virtuellen Methoden! Ganz normale member functions
sollen es sein.
|
Du wolltest eine abstrakte Int-Klasse, von der die konkreten Zahlentypen
abgeleitet sind. Abstrakte Klasse impliziert bei mir virtuelle Methoden.
| Quote: | Der Vorteil wäre, daß man diese unsinnigen Header mit den
Implementationsgrenzen nicht mehr bräuchte. Wie will man effizient
generische Algorithmen schreiben, wenn man jedesmal spezialisieren muß,
nur damit man zum Beispiel herausbekommt wie groß die maximale Zahl
eines integralen Datentyps ist?
|
std::numeric_limits<T>::max() ?
| Quote: | Es geht halt nicht beides gleichzeitig: effiziente 'int's und ableitbare
Integer-Klasse in einem.
Doch das ginge sehr wohl, Du denkst bloß einen Schritt zu weit. Du
willst gleich Zahlenklassen einführen, die Polymorphie unterstützen und
darauf kann man ohne Probleme verzichten.
|
Was soll deine Int-Klasse dann bieten? Gib mal ein Beispiel.
Stefan |
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Sun Jan 28, 2007 8:35 pm Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Stefan Reuther wrote:
| Quote: | Tibor Pausz wrote:
Stefan Reuther schrieb:
Dann wiederum verlieren wir die Eigenschaft, mit Integern effizient
rechnen zu können, weil auf einmal alles über virtuelle Aufrufe geht.
Nein, nein, keine virtuellen Methoden! Ganz normale member functions
sollen es sein.
Du wolltest eine abstrakte Int-Klasse, von der die konkreten Zahlentypen
abgeleitet sind. Abstrakte Klasse impliziert bei mir virtuelle Methoden..
|
Das liegt daran, daß Worte benutzt wurden, die schon eine spezielle
Semantik haben. Compilermagie hat diese spezielle Semantik nicht, klärt
aber auch nichts.
Worum es geht, ist zur Compilezeit eine Typunterscheidung vornehmen zu
können, wo hinterher zur Laufzeit identischer Code steht.
Das Rechnen mit Äpfeln ist völlig identisch mit dem Rechnen mit Birnen,
was dadurch ausgedrückt wird, daß der Compiler für Äpfel und Birnen den
selben Code erzeugen soll. Compilermagie Nr. 1.
Äpfel sind keine Birnen. Gemischte Operationen von Äpfeln und Birnen
sind also Fehler, die der Compiler melden und nicht kompilieren soll.
Compilermagie Nr. 2.
Wie könnte dies als Code aussehen?
Es könnte eine neue Ableitungsart eingeführt werden, die ich hier mal
"like" nennen will.
Apfel like int
{
// Declare code differences between Apfel and int here.
// Every funtionality of Apfel not declared here is identical
// as in int.
};
Birne like int
{
operator int(){ return *this; };
};
Der Compiler wäre mit solch einer Spracherweiterung in der Lage einen
Fehler zu melden, wenn ich im Quelltext versuche, gemischte Operationen
von Äpfeln und Birnen durchzuführen. Er würde auch meckern, wenn ich
Äpfel und int mische, weil ein Apfel keine Zahl ist, auch wenn er dern
reinen Apfel als int implementiert. Ähnlich auch bei der Birne, nur dort
ist als Unterschied eine Cast-Operation zum int deklariert, so daß es
z.B. erlaubt ist, eine Birne einem int zuzuweisen, weil ja beschrieben
ist, wie man eine Birne in eine Zahl umwandelt. Daß diese Umwandlung
technisch identisch ist mit einer Zuweiung eines int an einen zweiten
int, ist Kompilermagie. Für den umgekehrten Fall wurde kein
Zuweiungsoperator deklariert, also ist die Zuweiung einer Zahl an eine
Birne nicht erlaubt, weil die Birne zwar technisch ein int ist, aber
semantisch kein int ist.
Wenn ich das selbe mit typedef mache, dann sind Äpfel und Birnen und int
nicht nur technisch identisch sondern auch semantisch identisch. Ein
Apfel ist eine Birne ist ein int.
Es geht bei dieser Abstraktion darum semantische Unterschiede ausdrücken
zu können, ohne technische Unterschiede im resultierenden Code zu benötigen.
Bei Strings habe ich ebenfalls oft das Problem, daß ich Strings mit
unterschiedlicher Semantik habe, die ich unter Aspekten der
Businesslogik nicht vermischen darf. Technisch gesehen besteht kein
Unterschied. Damit aber der Compiler Verstöße gegen die Businesslogik
ahnden kann, muß ich dann Wrapperklassen und ähnliches bauen. Das ist
nicht schön und zudem der Performance abträglich.
Je besser ich das Problem mit den Sprachmitteln beschreiben kann, desto
besser sind die Chancen des Compilers, eine gute Lösung für das Problem
zu finden.
Wenn ich dem Compiler sagen kann, ein Apfel ist ähnlich wie ein int und
eine Birne ist auch ähnlich wie ein int, dann hat er in Zusammenhang mit
meinem Prolem schon mal eine gute Vorstellung von Äpfeln und Birnen und
weiß auch, daß Äpfel keine Birnen sind, und weiß auch, wie man mit
Äpfeln bzw. Birnen umgeht, nämlich wie mit int. Alles, was anderes ist,
führe ich dann ausdrücklich als Unterschied auf wie z.B. oben bei der
Birne der Cast-Operator. |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Mon Jan 29, 2007 4:25 pm Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Georg Maaß wrote:
| Quote: | Stefan Reuther wrote:
Du wolltest eine abstrakte Int-Klasse, von der die konkreten Zahlentypen
abgeleitet sind. Abstrakte Klasse impliziert bei mir virtuelle Methoden.
Das liegt daran, daß Worte benutzt wurden, die schon eine spezielle
Semantik haben. Compilermagie hat diese spezielle Semantik nicht, klärt
aber auch nichts.
Worum es geht, ist zur Compilezeit eine Typunterscheidung vornehmen zu
können, wo hinterher zur Laufzeit identischer Code steht.
|
Das ist aber ein bisschen was anderes als abstrakte Klassen.
Insbesondere kann man dann nicht mehr eine Funktion schreiben, die int
will, und ihr Apfel oder Birne übergeben.
| Quote: | Äpfel sind keine Birnen. Gemischte Operationen von Äpfeln und Birnen
sind also Fehler, die der Compiler melden und nicht kompilieren soll.
Compilermagie Nr. 2.
|
Ganz so einfach ist das nicht. Kann man zwei Äpfel addieren? Ja. Kann
man zwei Meter addieren? Ja. Kann man Äpfel multiplizieren? Weiß nicht.
Kann man zwei Meter multiplizieren? Definitiv, kommt halt Quadratmeter
raus. Kann man zwei Audio-Samples multiplizieren? Ja, kommt aber
üblicherweise wieder ein Sample, kein Quadratsample, raus.
Kann man Äpfel und Birnen addieren? Nein. Multiplizieren? Weiß nicht
(aber ich könnte das Ergebnis durch Äpfel dividieren wollen, um Birnen
rauszubekommen, weil ich gerade ein Rezept für Apfelkompott auf Birnen-
kompott umrechnen will). Kann man Meter durch Sekunden dividieren? Ja,
ergibt eine Geschwindigkeit. Kann man Meter und Zoll addieren? Irgendwie
schon.
Kann man Äpfel shiften? Bitoperationen drauf anwenden?
| Quote: | Der Compiler wäre mit solch einer Spracherweiterung in der Lage einen
Fehler zu melden, wenn ich im Quelltext versuche, gemischte Operationen
von Äpfeln und Birnen durchzuführen. Er würde auch meckern, wenn ich
Äpfel und int mische, weil ein Apfel keine Zahl ist, auch wenn er dern
reinen Apfel als int implementiert.
|
Dazu brauchst du eben meiner Meinung nach wesentlich mehr als nur 'class
Apfel like int'. Du musst die Typsignaturen aller (bzw. der meisten)
Operatoren angeben. Und da ist eine Einsparung der Rümpfe der Operatoren
so minimal, dass du auch gleich eine Wrapperklasse schreiben kannst.
Als Hobby-Compilerbauer würde ich mich daher auf den Standpunkt stellen,
dass Compilermagie hier eher wenig bringt, und die Energie besser im
Optimierer angelegt ist, um die Wrapperklasse wegzuoptimieren :-)
Stefan |
|
| Back to top |
|
 |
Hubert Schmid Guest
|
Posted: Fri Feb 02, 2007 4:26 am Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Georg Maaß <georg (AT) bioshop (DOT) de> writes:
| Quote: | Worum es geht, ist zur Compilezeit eine Typunterscheidung vornehmen
zu können, wo hinterher zur Laufzeit identischer Code steht.
Das Rechnen mit Äpfeln ist völlig identisch mit dem Rechnen mit
Birnen, was dadurch ausgedrückt wird, daß der Compiler für Äpfel und
Birnen den selben Code erzeugen soll. Compilermagie Nr. 1.
Äpfel sind keine Birnen. Gemischte Operationen von Äpfeln und Birnen
sind also Fehler, die der Compiler melden und nicht kompilieren
soll. Compilermagie Nr. 2.
Wie könnte dies als Code aussehen?
|
Das kann man auch mit dem aktuellen C++ sehr einfach realisieren.
Zunächst definierst du eine Klassen-Template fuer integer-Datentypen,
das alle benötigten Operationen enthält:
#include "boost/operators.hpp"
template <typename d, typename t>
struct integer
: boost::totally_ordered<integer<d, t>,
boost::integer_arithmetic<integer<d, t>,
boost::unit_steppable<integer<d, t> > > >
{
typedef integer<d, t> super;
typedef t type;
private:
type v;
public:
explicit integer(type v = type()) : v(v) { }
bool operator<(integer r) const { return v < r.v; }
bool operator==(integer r) const { return v == r.v; }
integer& operator+=(integer r) { v += r.v; return *this; }
integer& operator-=(integer r) { v -= r.v; return *this; }
integer& operator*=(integer r) { v *= r.v; return *this; }
integer& operator/=(integer r) { v /= r.v; return *this; }
integer& operator%=(integer r) { v %= r.v; return *this; }
integer& operator++() { ++v; return *this; }
integer& operator--() { --v; return *this; }
};
Jetzt leitest du davon Klassen ab, die nichts miteinander zu tun
haben. Diese kannst du dann so wie oben beschrieben verwenden:
struct apple : integer<apple, int>
{
explicit apple(type v = type()) : super(v) { }
};
struct pear : integer<pear, int>
{
explicit pear(type v = type()) : super(v) { }
};
int main()
{
apple a(1);
pear p(2);
a + a; // okay
p + p; // okay
a + p; // error: no match for 'operator+' in 'a + p'
}
Ein guter Übersetzer erzeugt daraus fast den gleichen Code, wie wenn
direkt primitive Datentypen verwendet werden.
--
Hubert Schmid - http://www.z42.de |
|
| Back to top |
|
 |
Elcaro Nosille Guest
|
Posted: Sun Mar 04, 2007 4:45 pm Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Stefan Ram schrieb:
| Quote: | Das Buch adressiert eigentlich die Anwendung von
Pattern, alle Beispiel sind aber in C++.
Im Englischen sagt man »The book addresses ...«,
auf deutsch »Das Buch behandelt ...«.
|
Das ist doch völlig egal. Das ist doch keine Sprachwissenschafts-NG.
Freu dich, dass Du es _für_dich_ richtig weißt. |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sun Mar 04, 2007 6:37 pm Post subject: Re: Buchempfehlung zur C++-Nutzung gesucht |
|
|
Elcaro Nosille wrote:
| Quote: | Stefan Ram schrieb:
Im Englischen sagt man »The book addresses ...«, auf deutsch »Das Buch
behandelt ...«.
Das ist doch völlig egal. Das ist doch keine Sprachwissenschafts-NG.
Freu dich, dass Du es _für_dich_ richtig weißt.
|
Bitte tragt in Zukunft solche Diskussionen per Mail oder in einer
Sprachwissenschafts-NG aus. Insbesondere wenn es um 7 Wochen alte
Threads geht.
Stefan (f'up2p) |
|
| Back to top |
|
 |
Powered by phpBB © 2001, 2006 phpBB Group
|