Funktion liefert komische int-Werte zurück
-
Hallo,
ich muss ein Template schreiben, welches jenachdem, ob es ein C-String oder ein C++-String bekommt, die Länge berechnet.
Ich hab folgende zwei Dateien:
// 1a.hpp template <typename T> struct C{ static int len(T str){ int l = str.size(); return l; } }; template < > struct C <const char*>{ static int len(const char* str){ int l = strlen(str); return l; } }; template <typename T> int length(T str){ C<T>::len(str); };und die Quelldatei:
#include <iostream> #include <string> #include <cstring> #include "1a.hpp" using namespace std; int main(){ string s1 = "Gandalf"; // STL char s2[] = "Gandalf"; // C-Style int len1 = length<string>(s1); cout << "STL: " << len1 << endl; int len2 = length<const char*>(s2); cout << "C-Style: " << len2 << endl; return 0; }Ich bekomme aber immer folgende Ausgabe:
STL: 4471568
C-Style: 7Was hab ich denn falsch gemacht? Ich sehe meinen Fehler nicht...
-
Du hast uns üblen Käse geschickt.
Bei mir kommt 2x 7 als Ergebnis, vorausgesetzt ich schreibe da "return" hin, wo ein Compiler-Fehler kommt.
Bist du dir sicher, dass du uns da nicht etwas verschweigst in dem du den Code händisch hierher überschrieben hast?
BTW: Metaprogrammierung statt einer einfachen Überladung? Ist es in C++ schon soweit gekommen?
MfG SideWinder
-
lil_pingu schrieb:
Hallo,
ich muss ein Template schreiben, welches jenachdem, ob es ein C-String oder ein C++-String bekommt, die Länge berechnet.Der da http://www.c-plusplus.net/forum/viewtopic-var-t-is-264347.html auch.
-
SideWinder schrieb:
BTW: Metaprogrammierung statt einer einfachen Überladung? Ist es in C++ schon soweit gekommen?
Nein.
a) Schreiben Sie Funktionen length(str) und charAt(str, i), mit denen man die
Länge bzw. das i-te Zeichen eines Strings str ermitteln kann, und zwar sowohl
für Strings der Standard-Bibliothek (basic_string) als auch für 0-terminierte char arrays ("c-style Strings").b) Schreiben Sie ein einzelnes Funktions-Template printRev(str), das unter
Verwendung von length(str) und charAt(str, i) einen String str rückwärts
ausgibt.Wenn icjh richtig lese, soll die a) ganz schlicht mit Überladung gemacht werden und die b) gibt eine Template-Funktion.
Keine Klassen und so. Ich nehme an, der Prof hat gegen Ende der Vorlesung so ein kompliziertes Beispiel gezeigt, daß die Studenten jetzt total verwirrt sind.
-
SideWinder schrieb:
Du hast uns üblen Käse geschickt.
Bei mir kommt 2x 7 als Ergebnis, vorausgesetzt ich schreibe da "return" hin, wo ein Compiler-Fehler kommt.
Bist du dir sicher, dass du uns da nicht etwas verschweigst in dem du den Code händisch hierher überschrieben hast?
MfG SideWinder
Was soll ich denn bitte verschweigen? Ich hab den Code so gepostet, wie er in meinem Editor steht.
Aber falls du abschreiben oder sonstwas meinst: Ich bin zufällig mit dem Poster in einem Kurs, der die gleiche Aufgabe hier im Forum gelöst hat. Da ich nicht genau weiß, auf was du dich mit verschweigen und händisch usw meinst, kannst du dir eine Antwort aussuchen.
Was ist also genau mein Fehler? Ich bekomme nicht 2x7 raus. Und ich krieg auch keine Fehlermeldungen.
-
Händisch:
Per Hand, nicht mit Copy&Paste.Verschweigen:
Hier ist versehentliches Weglassen des return gemeint.Der Programmierfehler:
template <typename T> int length(T str){ return C<T>::len(str);//dieses return fehlte };Und noch zwei Vermutungen von mir.
Deine Entwicklungsumgebung:
Microsoft Vistal C++ Express EditionDer Klickfehler:
Als ein Fehler war fragte die IDE beim Ausführungsversuch, ob stattdessen die alte Version gestartet werden soll und Du hast "Ja" gesagt und noch dazu "merk Dir die Antwort" und jetzt haben wie den Salat: Man sieht keine Fehler mehr, wenn man mit F5 oder Strg+F5 oder "Ausführen" oder dem Rechtspfeilsmarticon compiliert.
-
volkard schrieb:
Händisch:
Per Hand, nicht mit Copy&Paste.Verschweigen:
Hier ist versehentliches Weglassen des return gemeint.Der Programmierfehler:
template <typename T> int length(T str){ return C<T>::len(str);//dieses return fehlte };Und noch zwei Vermutungen von mir.
Deine Entwicklungsumgebung:
Microsoft Vistal C++ Express EditionDer Klickfehler:
Als ein Fehler war fragte die IDE beim Ausführungsversuch, ob stattdessen die alte Version gestartet werden soll und Du hast "Ja" gesagt und noch dazu "merk Dir die Antwort" und jetzt haben wie den Salat: Man sieht keine Fehler mehr, wenn man mit F5 oder Strg+F5 oder "Ausführen" oder dem Rechtspfeilsmarticon compiliert.Danke für die Korrektur!
PS: Ich arbeite nicht mit MVS. Ich arbeite mit dem GCC, teilweise unter Linux Mint, aber gerade per MinGW auf Windows. Das return hab ich schlichtweg vergessen :p Danke für den Hinweis!
-
lil_pingu schrieb:
PS: Ich arbeite nicht mit MVS. Ich arbeite mit dem GCC, teilweise unter Linux Mint, aber gerade per MinGW auf Windows. Das return hab ich schlichtweg vergessen :p Danke für den Hinweis!
Da ist das vergessene return nur eine Warnung und wenn man mit F9 startet und compiliert, sieht man die Warnung nicht.
Mit Strg+F9, nachdem man den Code geändert hat (Leerzeichen rein- und wieder rausmachen) sieht man die Warnungen nochmal.
Supi ist auch -Wall als Compileroption einzustellen, dann kann einem keine Warnung mehr durch die Lappen gehen.