# [C++] 2 Fragen



## Jellysheep (29. August 2009)

Hi, 
mal zwei Fragen:
1. Kann man in C++ verschiedene Objekte (int / string / char-array) unter einem Objekt zusammenfassen, etwa so:

```
Object o = 45;
o = "hello";
```

2. Gibt es eine Klasse, die Zahlen bzw. Rechnungen mit Zahlen groesser als int oder long ermoeglicht?


----------



## Cromon (29. August 2009)

1. Grundsätzlich kannst du schon so eine Klasse entwickeln, welche eigentlich verschiedene Typen fassen kann.

2. Ja, es gibt zum Beispiel den Typ double der mindestens die doppelte Präzision des floats auf deiner Plattform hat. Oder für ganz grosse Sachen gibt es in openssl Funktionen für Bignumber.


----------



## Guillermo (29. August 2009)

Zur ersten Frage kann ich dir leider nichts sagen, ich weiss erlichgesagt auch nicht was du damit meinst.
Zu deiner zweiten Frage kann ich nur sagen dass du dir mal die Datentypen float und double anschaun solltest


----------



## Matthias Reitinger (29. August 2009)

Jellysheep hat gesagt.:


> 1. Kann man in C++ verschiedene Objekte (int / string / char-array) unter einem Objekt zusammenfassen, etwa so:
> 
> ```
> Object o = 45;
> ...


Was willst du damit bezwecken? Du kannst ein struct erstellen, falls das das ist, was du willst:

```
struct {
  int i;
  std::string str;
} Object;

Object o;
o.i = 45;
o.str = "hello";
```



Jellysheep hat gesagt.:


> 2. Gibt es eine Klasse, die Zahlen bzw. Rechnungen mit Zahlen groesser als int oder long ermoeglicht?


Ja, allerdings nicht in der Standardbibliothek. Einfach mal nach den Stichworten „bignum“, „big integer“, „arbitrary precision integer“ etc. suchen.

Grüße, Matthias


----------



## Jellysheep (29. August 2009)

Danke fuer eure schnellen Antworten , eure Links schaue ich mir an!




Matthias Reitinger hat gesagt.:


> Was willst du damit bezwecken?



Ein Array mit String-Zugriff und nicht festgelegtem Inhalt...


----------



## Online-Skater (29. August 2009)

Hi in der Boost-Bibliothek gibt es die Datenstruktur boost::any, hier ein  Beispiel 
Dann einfach ein std::vector mit dem Typ boost:any definieren und fertig ist dein untypisiertes Array.

mfg


----------



## devDevil (29. August 2009)

```
class Object
{
    std::string m_value;

public:
    // operator= für int, long usw.
};
```
 fertig


----------



## Jellysheep (2. September 2009)

@Mathias: 
Ohne den ".i" oder ".str" Zugriff waere das cool...

@Online-Skater:
Genau so etwas meine ich! Dankeschoen! 

@devDevil:
Wie kann ich dann den Wert eines Objektes bekommen?


----------



## Philipp9494 (3. September 2009)

Hi.. 

Zur Frage 2:
Versuch mal GMP (http://gmplib.org/)

MfG
Philipp9494


----------



## Jellysheep (18. September 2009)

So, jetzt habe ich wieder Zeit für Antworten, ich hatte die letzen Tage nur Internet in Internetcafes zur Verfügung...

Ich habe eine BigInt Klase gefunden, die ist super! Danke für den Tipp!

Die boost::any Klasse ist nicht ganz so gut:

```
boost::any a = 5;
cout<<a;
```
und

```
boost::any a = 5;
int b = a;
```
geht z.B nicht...
Wie kann man solche Fälle lösen?
Die Ausgabe könnte man ja mit

```
operator= (ostream o, any a){...}
```
lösen... aber das wäre schwierig...


----------



## Jellysheep (19. September 2009)

Ich habe schon etwas ähnliches wie das hier programmiert:

```
class any : int {
    ...
}

int main(){
    any a = 5;
    int b = a;
}
```
aber das geht nicht, weil int keine Klasse ist...
Hat noch jemand Lösungsvorschläge?


----------



## deepthroat (20. September 2009)

Jellysheep hat gesagt.:


> Die boost::any Klasse ist nicht ganz so gut


Du hast offenbar nicht ganz verstanden wozu boost::any gedacht ist.


Jellysheep hat gesagt.:


> ```
> boost::any a = 5;
> cout<<a;
> ```
> ...


Natürlich nicht. Du mußt boost::any_cast verwenden. rtfm: http://www.boost.org/doc/html/any.html)

Evtl. solltest du mal erläutern warum du das machen willst. C/C++ sind nicht umsonst typisierte Sprachen.

Gruß


----------



## Jellysheep (20. September 2009)

Achso... 
Kann man denn nicht eine Template-Klasse machen, die sich bei der ersten Zuweisung entsprechend anpasst?


----------



## deepthroat (20. September 2009)

Jellysheep hat gesagt.:


> Achso...
> Kann man denn nicht eine Template-Klasse machen, die sich bei der ersten Zuweisung entsprechend anpasst?


Boost.any passt sich doch bei den Zuweisungen an.

Aber natürlich kannst du nicht Boost.any anstatt anderer Ausdrücke an beliebigen Stellen einsetzen.

Dazu müßte Boost.any für jeden beliebigen Typ Konvertierungsoperatoren definiert haben, was natürlich nicht machbar ist (und bei Mehrdeutigkeiten nicht funktionieren würde).

Du könntest die Boost.any Klasse natürlich dahingehend anpassen. Ob das sinnvoll ist steht auf einem anderen Blatt.

Gruß


----------



## Jellysheep (2. Oktober 2009)

Hi, 

ich hab mal long double ausprobiert, aber ab einer bestimmten Zahl ist das nicht mehr genau... 
Welche Zahl ist das?
Gibt es einen Typ, der so groß ist wie long double aber exakt bis zu dieser Zahl ist und dann aufhört?


----------



## Matthias Reitinger (2. Oktober 2009)

Jellysheep hat gesagt.:


> ich hab mal long double ausprobiert, aber ab einer bestimmten Zahl ist das nicht mehr genau...
> Welche Zahl ist das?


42. Aber mal im Ernst: du musst schon sagen, was du unter „genau“ verstehst. Fließkommazahlen können strukturbedingt nicht jede beliebige Zahl genau darstellen. Siehe dazu auch den Artikel What Every Computer Scientist Should Know About Floating-Point Arithmetic.

Grüße, Matthias


----------



## Jellysheep (2. Oktober 2009)

Danke für die Zahl und den Link. 



			
				Matthias Reitinger hat gesagt.:
			
		

> Aber mal im Ernst: du musst schon sagen, was du unter „genau“ verstehst.



Ich meine das genau wie in diesem Satz:


> Fließkommazahlen können strukturbedingt nicht jede beliebige Zahl genau darstellen.



Kann man einen eigenen Typ erstellen, der mit den Bits des long double rechnet? 
Ist das dann schneller / langsamer als die BigInt Klassen?

//edit: Verstehe ich das richtig, dass bis zur Zahl 42 die Ungenauigkeit bei ±1 liegt?


----------



## Matthias Reitinger (2. Oktober 2009)

Jellysheep hat gesagt.:


> Kann man einen eigenen Typ erstellen, der mit den Bits des long double rechnet?


Sicher doch.



Jellysheep hat gesagt.:


> Ist das dann schneller / langsamer als die BigInt Klassen?


Das kommt auf die konkrete Implementierung an.



Jellysheep hat gesagt.:


> //edit: Verstehe ich das richtig, dass bis zur Zahl 42 die Ungenauigkeit bei ±1 liegt?


Nein. Das mit der 42 war ein Scherz (in Anspielung auf die universelle Antwort). Unter der Annahme, dass ein long double auf deinem System ein binary128 nach IEEE 754-2008 ist, sollte der Datentyp bis zur Zahl 2^113 - 1 = 10.384.593.717.069.655.257.060.992.658.440.191 eine Darstellungs-Ungenauigkeit von höchstens ±1 aufweisen. Für binary64 kannst du dir die Zahl entsprechend berechnen.

Aber kann es sein, dass du sowieso nur Ganzzahlen darstellen willst? Dann ist ein Fließkommatyp sowieso ungeeignet. Was genau passt dir denn an den BigInt-Klasen nicht?

Grüße,
Matthias


----------



## Jellysheep (2. Oktober 2009)

Das mit der 42 ist lustig! 

Genau, ich will mit großen Ganzzahlen rechnen, wollte aber Standardtypen verwenden, um nicht eine ganze Klasse zu importieren...


----------



## Matthias Reitinger (2. Oktober 2009)

Jellysheep hat gesagt.:


> Genau, ich will mit großen Ganzzahlen rechnen, wollte aber Standardtypen verwenden, um nicht eine ganze Klasse zu importieren...


Wenn dir der Wertebereich der fundamentalen Datentypen zu klein ist, wird dir aber nichts anderes übrig bleiben, als einen zusammengesetzten Datentyp zu verwenden.

Grüße,
Matthias


----------



## Jellysheep (2. Oktober 2009)

Ok... Dankeschön!


----------



## Jellysheep (4. November 2009)

Ich möchte jetzt gerne GMP verwenden, weil Maple ja drauf aufbaut und ich fasziniert bin, wie schnell Maple rechnet. 
Ich habe mir ein Paket heruntergeladen, was mache ich jetzt mit den ganzen .c-Dateien und wie binde ich sie in Projekte ein?


----------



## Matthias Reitinger (4. November 2009)

Jellysheep hat gesagt.:


> Ich möchte jetzt gerne GMP verwenden, weil Maple ja drauf aufbaut und ich fasziniert bin, wie schnell Maple rechnet.
> Ich habe mir ein Paket heruntergeladen, was mache ich jetzt mit den ganzen .c-Dateien und wie binde ich sie in Projekte ein?


Hast du dir die README schon durchgelesen?


----------



## Jellysheep (4. November 2009)

Habe ich mal gemacht, aber ich werde nicht schlau draus... 
Kann mir das jemand erklären?


----------



## Jellysheep (4. November 2009)

Habs doch noch hinbekommen!


----------



## Jellysheep (5. November 2009)

Ich möchte gerne die Funktionen von MPN nutzen, wie mache ich das?


----------



## vfl_freak (5. November 2009)

Moin,

was genau meinst Du denn mit MPN 
Wenn Du mal danach googlest, kommen die_* wildesten *_Möglichkeiten 

Gruß
Klaus


----------



## Jellysheep (5. November 2009)

Hab ich auch schon entdeckt... 

Zitat aus gmplib.org:


> 5.    Low-level positive-integer, hard-to-use, very low overhead functions are     found in the mpn category.  No memory management is performed; the caller     must ensure enough space is available for the results.  The set of     functions is not regular, nor is the calling interface.  These functions     accept input arguments in the form of pairs consisting of a pointer to the     least significant word, and an integral size telling how many limbs (=     words) there are in that argument.  The functions in the other categories     call mpn for almost all their calculations.


----------



## Jellysheep (5. November 2009)

Ich glaube, das ist mir doch zu kompliziert... 
Ich rechne jetzt nur noch mit mpz_t...


----------



## vfl_freak (5. November 2009)

Aha, also eine mathematische Library ....

Dann schau doch mal hier http://gmplib.org/#DOC rein, dort sollte doch die Schnittstelle für die von Dir gewünschten Funktionen beschrieben sein!

Gruß
Klaus


----------



## vfl_freak (5. November 2009)

Jellysheep hat gesagt.:


> Ich glaube, das ist mir doch zu kompliziert...
> Ich rechne jetzt nur noch mit mpz_t...



Aha ... dann google mal nach "mpz_t"!
Du findest jede Menge Links, die den Header "gmp.h" verwenden (und mithin auch mpz_t) !!

Bsp.:
http://www.mathematik.uni-erlangen.de/~ruppert/WS9899/dlgl.c

Gruß
Klaus


----------



## Jellysheep (5. November 2009)

Ja, habe ich schon, aber es sieht so aus, als wäre das sehr kompliziert... 

Ich vereinfache grade die mpz_t Klasse und schreibe eine neue BigInt, die die Funktionen der mpz_t verwendet. Jetzt wollte ich einen operator<< für ostreams schreiben, aber ich bekomme 25 Fehler:

```
class BigInt{
...
    friend ostream &operator<< (ostream &out, BigInt &bi);
..
}
```
und BigInt.cpp:

```
ostream& operator<< (ostream& s, BigInt bi) {
    gmp_printf("%Zd", bi.value);
    return o;
}
```
Meine Fehlermeldungen:

```
1>Kompilieren...
1>BigInt.cpp
1>C:\Dokumente und Einstellungen\Admin\Eigene Dateien\Downloads\gmp-dynamic-vc-4.1.2\gmp-dynamic\gmp.h(1565) : warning C4146: Einem vorzeichenlosen Typ wurde ein unärer Minus-Operator zugewiesen. Das Ergebnis ist weiterhin vorzeichenlos.
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2143: Syntaxfehler: Es fehlt ';' vor '&'
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2433: 'ostream': 'friend' bei der Deklaration von Daten nicht zulässig
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2061: Syntaxfehler: Bezeichner 'ostream'
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2805: Binärer Operator '<<' hat zu wenig Parameter
1>.\BigInt.cpp(4) : error C2143: Syntaxfehler: Es fehlt ';' vor '&'
1>.\BigInt.cpp(4) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>.\BigInt.cpp(4) : error C2086: 'int ostream': Neudefinition
1>        c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8): Siehe Deklaration von 'ostream'
1>.\BigInt.cpp(4) : error C2065: 's': nichtdeklarierter Bezeichner
1>.\BigInt.cpp(4) : error C2275: 'BigInt': Ungültige Verwendung dieses Typs als Ausdruck
1>        c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(7): Siehe Deklaration von 'BigInt'
1>.\BigInt.cpp(4) : error C2146: Syntaxfehler: Fehlendes ')' vor Bezeichner 'bi'
1>.\BigInt.cpp(4) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>.\BigInt.cpp(4) : error C2365: "operator <<": Erneute Definition; vorherige Definition war "Funktion".
1>.\BigInt.cpp(4) : error C2078: Zu viele Initialisierungen
1>.\BigInt.cpp(4) : error C2275: 'BigInt': Ungültige Verwendung dieses Typs als Ausdruck
1>        c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(7): Siehe Deklaration von 'BigInt'
1>.\BigInt.cpp(4) : error C2059: Syntaxfehler: ')'
1>.\BigInt.cpp(4) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
1>.\BigInt.cpp(4) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
1>Fibonacci.cpp
1>C:\Dokumente und Einstellungen\Admin\Eigene Dateien\Downloads\gmp-dynamic-vc-4.1.2\gmp-dynamic\gmp.h(1565) : warning C4146: Einem vorzeichenlosen Typ wurde ein unärer Minus-Operator zugewiesen. Das Ergebnis ist weiterhin vorzeichenlos.
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2143: Syntaxfehler: Es fehlt ';' vor '&'
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2433: 'ostream': 'friend' bei der Deklaration von Daten nicht zulässig
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2061: Syntaxfehler: Bezeichner 'ostream'
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2805: Binärer Operator '<<' hat zu wenig Parameter
```

*//Edit:* Mit der mpz_t komme ich schon zurecht


----------



## vfl_freak (5. November 2009)

Du hast bspw. unterschiedliche Signaturen 


```
class BigInt
{
    ostream &operator<< (ostream &out, BigInt &bi);
}

// BigInt.cpp:
    ostream &operator<< (ostream& s, BigInt bi)
```

Tipp: lies das, was in den Fehlermeldungen steht, dann kommst Du meist weiter (eventl. über die Hilfe)

Gruß
Klaus


----------



## Jellysheep (5. November 2009)

vfl_freak hat gesagt.:


> Du hast bspw. unterschiedliche Signaturen Tipp: lies das, was in den Fehlermeldungen steht, dann kommst Du meist weiter (eventl. über die Hilfe)


Die Signaturen habe ich ausgebessert, aber ich habe immer noch 21 Fehler 

```
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2143: Syntaxfehler: Es fehlt ';' vor '<<'
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2433: 'ostream': 'friend' bei der Deklaration von Daten nicht zulässig
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2061: Syntaxfehler: Bezeichner 'ostream'
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2805: Binärer Operator '<<' hat zu wenig Parameter
1>.\BigInt.cpp(4) : error C2143: Syntaxfehler: Es fehlt ';' vor '<<'
1>.\BigInt.cpp(4) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>.\BigInt.cpp(4) : error C2086: 'int ostream': Neudefinition
1>        c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8): Siehe Deklaration von 'ostream'
1>.\BigInt.cpp(4) : error C2065: 'out': nichtdeklarierter Bezeichner
1>.\BigInt.cpp(4) : error C2065: 'bi': nichtdeklarierter Bezeichner
1>.\BigInt.cpp(4) : error C2275: 'BigInt': Ungültige Verwendung dieses Typs als Ausdruck
1>        c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(7): Siehe Deklaration von 'BigInt'
1>.\BigInt.cpp(4) : error C2448: '<<': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein
1>Fibonacci.cpp
1>C:\Dokumente und Einstellungen\Admin\Eigene Dateien\Downloads\gmp-dynamic-vc-4.1.2\gmp-dynamic\gmp.h(1565) : warning C4146: Einem vorzeichenlosen Typ wurde ein unärer Minus-Operator zugewiesen. Das Ergebnis ist weiterhin vorzeichenlos.
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2143: Syntaxfehler: Es fehlt ';' vor '<<'
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2433: 'ostream': 'friend' bei der Deklaration von Daten nicht zulässig
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2061: Syntaxfehler: Bezeichner 'ostream'
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\fibonacci\fibonacci\BigInt.h(8) : error C2805: Binärer Operator '<<' hat zu wenig Parameter
```


----------



## deepthroat (5. November 2009)

Hi.

Nur so am Rande - bevor du ein weiteres Rad erfindest: es gibt bereits mehrere C++ Bibliotheken für GMP:

http://www.gnu.org/software/gmp/manual/html_node/Language-Bindings.html

Gruß


----------



## Jellysheep (5. November 2009)

Danke, aber das wollte ich schon machen, so zum Verständnis und um mich mit GMP zu beschäftigen...
Woher kommen denn die Fehlermeldungen?


----------



## Jellysheep (5. November 2009)

Ich habe ein 
	
	
	



```
using namespace std;
```
 hingehängt und jetzt geht es wieder!


----------

