Länge von dynamischen Array bestimmen
-
hvgguser schrieb:
ich habs jetzt über eine Klasse gemacht, in der die Länge mit gespeichert wird
std::vector erledigt das und noch viel mehr für dich. Hast du Gründe dafür, warum du das alles selber machen willst?
hvgguser schrieb:
(10^20 Stellen und mehr)
Das dürfte speichertechnisch wohl schwierig werden.
Kann mir jemand einen Tipp geben, was der Fehler genau ist?
Deine Funktion
Add
will Zeiger auf Objekt der KlassecNumberN
, du übergibst aber keine Zeiger, sondern direkt die Objekte.Der Aufruf muss so aussehen:
meinObjekt1.Add(&meinObjekt1, &meinObjekt2, &meinObjekt3);
-
ah, danke.
Der Grund das ich das alles selber mache ist, das ich laut Aufgabenstellung alles selber machen soll. Da ich nicht weiß in wie weit ich eventuell Punktabzug bekomme wenn ich vector verwende, oder andere fertige Konstrukte, mach ich es lieber so.Klar, 10^20 wird bei herkömmlichen Speichern ein wenig schwierig, aber es geht einfach darum, dass es wenn ausreichend Speicher und Rechenleistung gegeben sind, beliebig große Zahlen verarbeitet werden können.
lg mo
-
deine funktion will zeiger, gib ihr zeiger:
meinObjekt1.Add( **&**meinObjekt1, **&**meinObjekt2, **&**meinObjekt3);
mfg
-
Es gibt die Bibliothek gmp. Auch kannst du dir ansehen, wie der Konsolenrechner bc das macht.
-
thx. werde ich mir mal anschauen.
Ist es eigentlich möglich, ein mit pVar = new int [länge] erzeugtes Array nachträglich verlängern, ohne dass die bereits im Array gespeicherten Zahlen verloren gehen? Oder muss man den Umweg gehen, dass man das Array in einem temporären Array zwischenspeichert, dann das ursprüngliche Array zerstört, mit der neuen Länge neu anlegt und dann die Werte aus dem temp.-Array dort wieder reinschreibt?lg mo
-
Das ist der Weg, wenn man mit Arrays arbeitet. Die allgemeine Strategie von std::vector ist, die Groesse zu verdoppeln. So muss nur selten ein neues Array angelegt und die Eintraege kopiert werden. Wenn du das aber oft brauchst, dann ist vielleicht eine Liste oder Heap/Set/Tree besser geeignet.
-
hvgguser, nimm GMP (GNU multiple precision library), falls Du keine Probleme mit der GPL-Lizenz hast. Es ist jedenfalls sine sehr praktischer C++ Header (gmpxx.h) dabei, der Sachen, wie große Ganzzahlen, Brüche schön als Klassenobjekt verpackt.
Wenn das allerdings eine Übung sein soll, die Dir verbietet, andere Bibliotheken zu nutzen...
hvgguser schrieb:
Ist es eigentlich möglich, ein mit pVar = new int [länge] erzeugtes Array nachträglich verlängern, ohne dass die bereits im Array gespeicherten Zahlen verloren gehen?
**
std::vector
**!hvgguser schrieb:
Oder muss man den Umweg gehen, dass man das Array in einem temporären Array zwischenspeichert, dann das ursprüngliche Array zerstört, mit der neuen Länge neu anlegt und dann die Werte aus dem temp.-Array dort wieder reinschreibt?
Das ist das, was der vector für Dich erledigt. Man kann das für PODs auch anders regeln, wenn man unbedingt will. Zu Deinem Schutz, verrate ich Dir aber nicht wie. Wenn es auf Performanz ankommt, nimm einfach GMP.
Gruß,
SP
-
Wie gesagt, ich kann leider keine fertige Lösung wie GMP nehmen, da ich die Aufgabenstellung bekommen habe, alles selbst zu schreiben, inkl. der Datenstrukturen die ich verwende. Deshalb wollte ich eigentlich nicht std::vector nehmen.
Ich habe es jetzt zwar erstmal mit vector gemacht, aber da vector im Prinzip ein Objekt ist befürchte ich nach wie vor, dass die Performance bei Rechenoperationen auf großen Zahlen in die Knie geht. Ich werde wenn ich es zeitlich schaffe auch einen Heap oder eine einfache Liste probieren.lg mo
-
hvgguser schrieb:
Einzige Befürchtung hierbei ist, dass der "Umweg" über Klassen in die Performance geht, was gerade bei Operationen mit großen Zahlen durchaus bemerkbar (10^20 Stellen und mehr) sein dürfte.
hvgguser schrieb:
Ich habe es jetzt zwar erstmal mit vector gemacht, aber da vector im Prinzip ein Objekt ist befürchte ich nach wie vor, dass die Performance bei Rechenoperationen auf großen Zahlen in die Knie geht.
Du solltest statt befürchten lieber messen und anschliessend sehen, ob es wirklich einen Unterschied gibt. Das, was du machst, nennt man Premature Optimization - durch unbestätigte Vermutungen einen Weg zu gehen, mit dem man langfristig schlechter fährt.
Die Ansicht, dass Klassen schon prinzipiell langsamer sein müssen als einfache Datentypen, ist in C++ einfach nur falsch. Was langsamer sein kann, sind Funktionen wie Konstruktoren, aber eigentlich nur, wenn die auch besonders viel tun. In den meisten Fällen sind Compiler in der Lage, durch Inlining kleine Funktionen wegzuoptimieren, wodurch man wieder keinen Overhead mehr hat.
hvgguser schrieb:
Ich werde wenn ich es zeitlich schaffe auch einen Heap oder eine einfache Liste probieren.
Dir geht es also doch nicht um Geschwindigkeit, oder wie ist das zu verstehen?
Ich rate dir, zuerst dein Problem sauber zu lösen und dir dann Überlegungen dieser Art zu machen. Und zwar mit Profiler oder Zeitmessungsfunktionen, und nicht nach Gefühl. Schon gar nicht sollte man sich durch kleine Optimierungen im Voraus verleiten lassen, seinen Code hässlich zu gestalten, um vermeintlich schneller zu sein. Das ist dann eben der erwähnte schlechtere Weg - am Schluss ist der Code schlecht wartbar, fehleranfällig und obendrein vielleicht sogar noch langsamer, weil man doch nicht ganz Recht hatte mit seinen Vermutungen.
-
Dir geht es also doch nicht um Geschwindigkeit, oder wie ist das zu verstehen?
Hat er doch geschrieben, dass er eigl. alles selbst machen soll:
Wie gesagt, ich kann leider keine fertige Lösung wie GMP nehmen, da ich die Aufgabenstellung bekommen habe, alles selbst zu schreiben, inkl. der Datenstrukturen die ich verwende.
-
Ich habe mit dem Satz eher darauf anspielen wollen, dass er mit Listen, Heaps etc. vielleicht um einiges langsamer ist als mit einem einfachen dynamischen Array wie bei
std::vector
(oder etwas Selbstgebasteltem). Das Anfordern vieler kleiner Elemente braucht seine Zeit, da machen die Reallokationen vielleicht weniger aus, wenn sie nicht dauernd vorkommen. Ausserdem kommt bei einer verketteten Liste ein Overhead von zwei Zeigern pro Element dazu. Und so wie ich hvgguser verstanden habe, möchte er viele Dezimalstellen speichern können...Aber allgemein sollte man wenn möglich seine Implementierung generisch halten, sodass man bei Bedarf Datenstrukturen mit relativ wenig Aufwand austauschen kann.
typedef
trägt hier seinen Teil bei.
-
Im Internet gibt es schon einfache vorgefertigte Klassen fuer grosse Zahlen. Die sind auch recht einfach zu verstehen und man kann sich einige Sachen abschauen. Einfach mal nach "big integer c++ class" suchen.