Sie sind nicht angemeldet.

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

1

05.05.2003, 13:02

GDVI Vertiefungskurs myvector

Hallo!
Für den zweiten Übungszettel brauchen wir die Klasse myvector. Ich habe sie heruntergeladen und wollte sie auch in meinen Klassen benutzen:

Quellcode

1
myvector< int > var;

oder auch

Quellcode

1
myvector < int > var(n); 

So wie ich es gesehen habe hat diese Klasse den [] operator. Ich habe also versucht auf die elemente mit var zuzugreifen, doch der Compiler meldete mir einen Fehler, der in der Klasse myvector aufgetreten ist. Genauso, wenn ich versuche eine Variable von dieser Klasse auf einen Stream zu lenken, gibt es diesen Fehler. Eigentlich klar, da der Stream operator auf den [] operator zugreift, um die Elemente, die da drin stehen auf den Stream zu schreiben.
Wer hat welche Ideen, woran es liegt?
Übrigens, ich benutze noch MS VC++ Compiler.
mfg
MAX

PS: Fehlermeldung:

Quellcode

1
2
3
c:...myvector.h(23) : error C2668: '[]' : ambiguous call to overloaded function
c:...myvector.h(23) : while compiling class-template member function 'int &__thiscall myvector < int,class std::allocator < int > > ::operator [](u
nsigned int)' 

T2k

Erfahrener Schreiberling

  • »T2k« ist männlich

Beiträge: 339

Registrierungsdatum: 09.10.2002

Wohnort: da drüben, gleich dort.

Beruf: Warum? Hmm, weil ich sonst nix mit meiner Zeit anzufangen weiß :D

2

05.05.2003, 13:59

MSDN is manchmal sehr hilfreich (vorallem für diverse Fehlermeldungen):

Zitat

[Compiler Error C2668]

"Funktion": Mehrdeutiger Aufruf einer überladenen Funktion

Der angegebene Aufruf der überladenen Funktion lässt sich nicht auflösen. Sie können eine explizite Typumwandlung für einen oder mehrere der übergebenen Parameter durchführen.

Dieser Fehler kann auch durch die Verwendung von Vorlagen hervorgerufen werden. Wenn in einer Klasse eine reguläre Memberfunktion und eine aus einer Vorlage gebildete Memberfunktion mit derselben Signatur enthalten ist, muss letztere zuerst genannt werden. Diese Beschränkung gilt für die aktuelle Implementierung von Visual C++.

Weitere Informationen zur Bestellung einzelner Funktionsvorlagen finden Sie im Knowledge Base-Artikel Q240869 (nur auf Englisch verfügbar).

Informationen zum Erstellen eines ATL-Projekts mit einem COM-Objekt, das "ISupportErrorInfo" unterstützt, finden Sie im Knowledge Base-Artikel Q243298 (nur auf Englisch verfügbar).

Beispiel

// C2668.cpp
struct A {};
struct B : A {};
struct X {};
struct D : B, X {};

void func( X, X );
void func( A, B );
D d;
int main()
{
func( d, d ); // C2668, D has an A, B, and X
func( (X)d, (X)d ); // OK, uses func( X, X )
}
Quelle MSDN

also erstma schauen ob du nicht zuviel vererbst oder ggf ma in die headerdatei reinschauen um rauszufinden wie du die typen casten musst damit der compiler es versteht


T2k
Die zweithäufigste Todesursache eines Soldaten ist das Gewicht seines Rückentornisters ("http://olnigg.de/" Aug05/Nr120)

np

Junior Schreiberling

Beiträge: 155

Registrierungsdatum: 23.10.2002

3

05.05.2003, 14:24

t2k hat schon recht, das ganze liegt wahrscheinlich am Typcheck. Leider kann ich den Fehler hier unter Linux nicht reproduzieren, aber zumindest das Outstream-Problem kannst Du beheben, indem Du in myvector.h Zeile 73 (oder so) durch

typename myvector&lt;_Tp, _Alloc&gt;::size_type i;

statt int i;

ersetzt.
Ich forsche nochmal weiter...

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

4

05.05.2003, 20:16

nix da

Wie gesagt, der Fehler liegt nicht im output stream operator, sondern im [] operator. Der Stream operator benutzt ja auch [] operator. Und was da man casten soll, weiß ich auch nicht. ___In ___dem ______Codewirrrwar, _was ____da ____steht, blickt man ____nur sehr __schwer durch___!!!
mfg
MAX

Nachtrag:
Habe jetzt einfach die Beiden Methoden
reference operator[](size_type __n) {..}
const_reference operator[](size_type __n) const {..}
auskomentiert und plötzlich geht alles. So wie es scheint, haben sich diese Methoden mit den Methoden der Klasse vector nicht vertragen. Ich verstehe auch nicht, warum sie überladen werden, denn es steht im Rumpf der Methode sowieso der Aufruf des [] operators der Klasse vector. Natürlich nicht ganz, davor steht noch irgendein _M_range_check(size_type __n); was das sein soll, weiß ich auch nicht. Vielleicht werde ich hier aufgeklärt!
mfg
MAX

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

5

05.05.2003, 21:38

Zu Aufgabe 2.2

Bei dieser Aufgabe habe ich die read und write Methoden für die Klassen Triangle und Solid(nur write) ohne Probleme implementiert, aber was ist mit der read Routine der Klassen Solid und Scene? Da weiß man doch gar nicht, wieviele Objekte am Anfang eingelesen werden. Ok, bei einer Datei, könnte man sie noch zählen, bzw. mit add Methoden bis EOF hinzufügen können. ABER geht es nicht etwas allgemeiner? Z.B. will ich das ganze von der Konsole eingeben. Wie sieht es damit aus? (Bin schon etwas müde, habe keine Ideen mehr, schlafen gehen? hmm zu früh?)
mfg
MAX

np

Junior Schreiberling

Beiträge: 155

Registrierungsdatum: 23.10.2002

6

06.05.2003, 08:28

Zitat

Original von MAX
Wie gesagt, der Fehler liegt nicht im output stream operator, sondern im [] operator. Der Stream operator benutzt ja auch [] operator. Und was da man casten soll, weiß ich auch nicht. ___In


Hast Du die Zeile ersetzt, die ich vorgeschlagen habe? Das entfernt den Fehler im outstream! Das Problem liegt nicht im Operator, sondern in VC++, der sich hier nicht ganz standard-konform verhält. Wie gesagt, kein Windows -> daher kann ich den Fehler hier nicht nachvollziehen. Evtl. hilft es, den Übergabeparameter auf den korrekten Typ zu casten:

var[(unsigned long int)i] statt var

(Kann sein, dass VC++ einen anderen Typ als unsigned long int verlangt.)

Zitat


Habe jetzt einfach die Beiden Methoden
reference operator[](size_type __n) {..}
const_reference operator[](size_type __n) const {..}
auskomentiert und plötzlich geht alles. So wie es scheint, haben sich diese Methoden mit den Methoden der Klasse vector nicht vertragen. Ich verstehe auch nicht, warum sie überladen werden, denn es steht im Rumpf der Methode sowieso der Aufruf des [] operators der Klasse vector. Natürlich nicht ganz, davor steht noch irgendein _M_range_check(size_type __n); was das sein soll, weiß ich auch nicht. Vielleicht werde ich hier aufgeklärt!


Aber gerne. Studierende neigen dazu, etwas wenig Zeit in ihre Programmkonzepte zu investieren (was durchaus verständlich ist), und produzieren daher in ihren Abgaben oft Bereichsüberschreitungen in Listentypen (z.B. Buffer-Overflows). Aus Effizienzgründen werden diese vom Standard vector nicht abgefangen, was dazu führt, dass sie erst in der Abnahme auffallen ("Aber bei mir zuhause hat es noch funktioniert!") Deshalb hat myvector einen Range-Check, damit Ihr die Fehler *vor* der Abnahme findet. Warum sich das mit VC++ beißt ist mir allerdings ein Rätsel, für Hinweise bin ich dankbar.

Grüße,

Niklas

Irishman

Trainee

  • »Irishman« ist männlich

Beiträge: 39

Registrierungsdatum: 24.03.2002

Wohnort: Hannover

7

06.05.2003, 17:08

@np: Wie ist das jetzt eigentlich mit der Grupenstärke beim Vertiefungskurs? Sind 3 Mann pro Gruppe erlaubt? Ich habe Herrn Reuter auch schon mal diesbezüglich gefragt, aber der wollte erstmal mit Herrn Wolter Rücksprache halten.

np

Junior Schreiberling

Beiträge: 155

Registrierungsdatum: 23.10.2002

8

07.05.2003, 08:27

Zitat

Original von Irishman
@np: Wie ist das jetzt eigentlich mit der Grupenstärke beim Vertiefungskurs? Sind 3 Mann pro Gruppe erlaubt? Ich habe Herrn Reuter auch schon mal diesbezüglich gefragt, aber der wollte erstmal mit Herrn Wolter Rücksprache halten.

Das hat er getan; soweit ich weiß, sollen die Gruppen auf 2 Leute beschränkt bleiben (wie es ja auch schon auf dem ersten Zettel stand).

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

9

07.05.2003, 10:41

hmmm...

Zitat

Zu Aufgabe 2.2

Bei dieser Aufgabe habe ich die read und write Methoden für die Klassen Triangle und Solid(nur write) ohne Probleme implementiert, aber was ist mit der read Routine der Klassen Solid und Scene? Da weiß man doch gar nicht, wieviele Objekte am Anfang eingelesen werden. Ok, bei einer Datei, könnte man sie noch zählen, bzw. mit add Methoden bis EOF hinzufügen können. ABER geht es nicht etwas allgemeiner? Z.B. will ich das ganze von der Konsole eingeben. Wie sieht es damit aus? (Bin schon etwas müde, habe keine Ideen mehr, schlafen gehen? hmm zu früh?)
mfg
MAX


Eine Idee???
mfg
MAX

np

Junior Schreiberling

Beiträge: 155

Registrierungsdatum: 23.10.2002

10

08.05.2003, 08:27

Zitat

Original von MAX
Eine Idee???
mfg
MAX

Ich verstehe das Problem nicht so ganz: Die Dateisyntax legt doch eindeutig fest, wann ein Solid zuende ist; und da dynamische Arrays (vector) verwendet werden, muss man die Länge nicht vorher wissen.

Oder ist die Syntax noch unklar?

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

11

08.05.2003, 10:05

hmm...

Ich meine aber nicht die Dateisyntax, sondern wenn man ein Solid über die Konsole eingeben soll. Oder ist das gar nicht gewünscht???
mfg
MAX

migu

free rider

  • »migu« ist männlich

Beiträge: 2 643

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

Beruf: Developer

12

08.05.2003, 10:20

Zitat

Original von MAX
Ich meine aber nicht die Dateisyntax, sondern wenn man ein Solid über die Konsole eingeben soll. Oder ist das gar nicht gewünscht???


Ach so. Reicht es nicht, wenn als Ende-Zeichen "}" oder "<END>" eingelesen wird? Dann weiß die Einleseroutine ja, was los ist. Und den Vector kann man ja immer um 10 oder mehr Elemente vergrößern, wenn seine Kapazität nicht mehr ausreicht.
tar: Anlegen eines leeren Archivs wird feige verweigert.

np

Junior Schreiberling

Beiträge: 155

Registrierungsdatum: 23.10.2002

13

08.05.2003, 16:36

Zitat

Original von MAX
Ich meine aber nicht die Dateisyntax, sondern wenn man ein Solid über die Konsole eingeben soll. Oder ist das gar nicht gewünscht???


Wo ist denn der Unterschied, ob man aus der Datei oder von der Konsole liest? Wenn Du in der Konsole ein EOF erzeugen willst, drückst Du einfach CTRL-D, damit sind beide Methoden äquivalent. Ist aber egal, weil lesen aus Dateien reicht.

Zitat

Original von migu
Ach so. Reicht es nicht, wenn als Ende-Zeichen "}" oder "<END>" eingelesen wird? Dann weiß die Einleseroutine ja, was los ist. Und

Ja.

Zitat


den Vector kann man ja immer um 10 oder mehr Elemente vergrößern, wenn seine Kapazität nicht mehr ausreicht.

Nein. Das muss man gar nicht, weil sich der vector (und auch der myvector) ja mit jedem push_back von selbst um ein Element vergrößert. Wie er das genau macht, kann (und muss) uns dabei egal sein.

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

14

08.05.2003, 18:33

ok

Zitat

Wo ist denn der Unterschied, ob man aus der Datei oder von der Konsole liest? Wenn Du in der Konsole ein EOF erzeugen willst, drückst Du einfach CTRL-D, damit sind beide Methoden äquivalent. Ist aber egal, weil lesen aus Dateien reicht.

Genau das wusste ich nicht, dass bei der Konsoleneingabe das EOF mittels strg + D erzeugt wird.
Danke für die Info!
mfg
MAX

migu

free rider

  • »migu« ist männlich

Beiträge: 2 643

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

Beruf: Developer

15

08.05.2003, 20:29

Zitat

Original von np

Zitat

Original von migu
den Vector kann man ja immer um 10 oder mehr Elemente vergrößern, wenn seine Kapazität nicht mehr ausreicht.

Nein. Das muss man gar nicht, weil sich der vector (und auch der myvector) ja mit jedem push_back von selbst um ein Element vergrößert. Wie er das genau macht, kann (und muss) uns dabei egal sein.


Das ist nur bedingt richtig. Sicherlich alloziert ein Vektor-Objekt automatisch neuen Speicher, doch birgt das Performance-Risiken.
In der STL-Dokumentation steht unter vector:
"[3] When it is necessary to increase capacity(), vector usually increases it by a factor of two. It is crucial that the amount of growth is proportional to the current capacity(), rather than a fixed constant: in the former case inserting a series of elements into a vector is a linear time operation, and in the latter case it is quadratic.
[4] Reserve() causes a reallocation manually. The main reason for using reserve() is efficiency: if you know the capacity to which your vector must eventually grow, then it is usually more efficient to allocate that memory all at once rather than relying on the automatic reallocation scheme. The other reason for using reserve() is so that you can control the invalidation of iterators."

Deshalb meine Idee.

Eine Frage hat sich mir gestellt:
Wozu sollen wir die Klasse myvector verwenden? Welchen konkreten Vorteil bietet sie gegenüber std::vector?
tar: Anlegen eines leeren Archivs wird feige verweigert.

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

16

08.05.2003, 23:12

Zitat

Wozu sollen wir die Klasse myvector verwenden? Welchen konkreten Vorteil bietet sie gegenüber std::vector?

Sie hat z.B. sehr angenehme stream Routinen. Man braucht bei den einigen fast nichts zu machen, nur sie richtig verwenden. Und natürlich der _M_range_check.(Obwohl das bei mir der [] operator nicht funktioniert, also nützt mir nicht viel)
Weitere Vorteile konnte ich auch nicht erkennen.
mfg
MAX

Irishman

Trainee

  • »Irishman« ist männlich

Beiträge: 39

Registrierungsdatum: 24.03.2002

Wohnort: Hannover

17

09.05.2003, 11:41

Eine Bereichsüberprüfung bietet der std::vector aber auch, wenn man für den Zugriff auf Vectorelemente die at()-Methode verwendet. Wird ein Index bzw. Iterator übergeben wird, der ausserhalb des Wertebereichs liegt, wird eine Exception geworfen.

migu

free rider

  • »migu« ist männlich

Beiträge: 2 643

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

Beruf: Developer

18

09.05.2003, 12:54

Zitat

Original von Irishman
Eine Bereichsüberprüfung bietet der std::vector aber auch, wenn man für den Zugriff auf Vectorelemente die at()-Methode verwendet. Wird ein Index bzw. Iterator übergeben wird, der ausserhalb des Wertebereichs liegt, wird eine Exception geworfen.


Na, das reicht mir doch schon völlig. :) Den Zugriff über operator[] kann ich mir notfalls auch sparen. Ich bevorzuge in der Regel Standardklassen, es sei denn, ich habe mir die Erweiterungen selbst geschrieben. (Wenn myvector sehr nützlich wäre, würde ich ihn natürlich benutzen.)

Mein Problem sind im Moment vor allem die vielen Linkerfehler. ?(
tar: Anlegen eines leeren Archivs wird feige verweigert.

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

19

18.05.2003, 20:21

schon wieder myvector

Schwachsinn von mir! Hat sich jetzt alles erledigt!
mfg
MAX

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

20

21.05.2003, 11:48

Frage zum String

Wie kann man einen string oder ein istream auf alle möglichen Sonderzeichen wie
etc. trimmen, sprich diese Zeichen rausschmeissen???
mfg
MAX