Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

MAX

Senior Schreiberling

  • "MAX" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

1

Monday, May 5th 2003, 1:02pm

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:

Source code

1
myvector< int > var;

oder auch

Source code

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:

Source code

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" is male

Posts: 339

Date of registration: Oct 9th 2002

Location: da drüben, gleich dort.

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

2

Monday, May 5th 2003, 1:59pm

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

Quoted

[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

Posts: 155

Date of registration: Oct 23rd 2002

3

Monday, May 5th 2003, 2:24pm

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" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

4

Monday, May 5th 2003, 8:16pm

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" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

5

Monday, May 5th 2003, 9:38pm

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

Posts: 155

Date of registration: Oct 23rd 2002

6

Tuesday, May 6th 2003, 8:28am

Quoted

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.)

Quoted


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" is male

Posts: 39

Date of registration: Mar 24th 2002

Location: Hannover

7

Tuesday, May 6th 2003, 5:08pm

@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

Posts: 155

Date of registration: Oct 23rd 2002

8

Wednesday, May 7th 2003, 8:27am

Quoted

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" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

9

Wednesday, May 7th 2003, 10:41am

hmmm...

Quoted

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

Posts: 155

Date of registration: Oct 23rd 2002

10

Thursday, May 8th 2003, 8:27am

Quoted

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" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

11

Thursday, May 8th 2003, 10:05am

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" is male

Posts: 2,643

Date of registration: Dec 11th 2001

Occupation: Developer

12

Thursday, May 8th 2003, 10:20am

Quoted

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

Posts: 155

Date of registration: Oct 23rd 2002

13

Thursday, May 8th 2003, 4:36pm

Quoted

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.

Quoted

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.

Quoted


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" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

14

Thursday, May 8th 2003, 6:33pm

ok

Quoted

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" is male

Posts: 2,643

Date of registration: Dec 11th 2001

Occupation: Developer

15

Thursday, May 8th 2003, 8:29pm

Quoted

Original von np

Quoted

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" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

16

Thursday, May 8th 2003, 11:12pm

Quoted

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" is male

Posts: 39

Date of registration: Mar 24th 2002

Location: Hannover

17

Friday, May 9th 2003, 11:41am

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" is male

Posts: 2,643

Date of registration: Dec 11th 2001

Occupation: Developer

18

Friday, May 9th 2003, 12:54pm

Quoted

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" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

19

Sunday, May 18th 2003, 8:21pm

schon wieder myvector

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

MAX

Senior Schreiberling

  • "MAX" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

20

Wednesday, May 21st 2003, 11:48am

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