Templates
-
ramsis: das template mit den zahlen funktioniert! nur das mit dem zeichenketten funktioniert nicht!
ich kapier nicht warum das funktioniert!
ist ja komisch!char *scheissendreck[]={"schei","sse","en","dreck!"};Das ist ein char Zeiger-array von char zeiger.
int MyMin(char** feld, int const anz)Also müsste es ja hier auch zeiger auf zeiger sein um dann mit "feld" auf die elemente zuzugreifen!
int MyMin(char* const* feld, int const anz)Was bedeutet das? einen zeiger auf einen konstanten char?
kapier ich nicht! könntest du das weiter erläutern?
-
ah ich verstehe!
int MyMin(char *const *feld, int const anz)das ist ein konstanter char-zeiger auf einen char-zeiger!
aber nun 2 fragen:
1. wieso muss der erste zeiger konstant sein?
2. wieso wird beiint MyMin(const char *const *feld, int const anz)Position 3 ausgegeben?
-
hmm naja dein Problem ist eigtl. nicht ganz nachzuvollziehen. Deine Max und Min-Funktionen würden ja die Zeigervergleichen, nichtaber deren Wert. Das ist doch garnicht gewünscht, d.h. weiß ich nicht warum du das unbedingt haben willst!
-
Das ist eigentlich eine übungsaufgabe zu templates!
Ich soll aus einem Array, das aus Zahlen besteht, das Minimum bestimmen und die Position bestimmen!
Also habe ich zu erst die erste MyMin Funktionen geschrieben und mit den beiden verschiedenen (float, int) Arrays getestet - hat auch astrein funktioniert.
Nun sollte man noch eine spezifische Funktion implementieren, das aus einem char Array die Position der kürzesten Zeichenkette bestimmt.
Also habe ich die spezifische template Funktion mit "template<>" eingeleitet! Aber leider hat das mit meiner Methode nicht funktioniert.
Deshalb habe ich die Frage hier gestellt.
Also meine Fragen bestehen immernoch

-
Wenn man so spezialisiert ohne const
kommt "en" also position 2 heraus.
korekt oder!template <> int MyMin(char** feld, const int anz)
-
Hmm na okay das geht anders
Template-Spezifizierung, denn du musst da mit std::strlen arbeiten, sonst haut das nicht hin. ptr1 < ptr2 ist nicht das selbe wie length(*ptr1) < length(*ptr2)!
-
ich kapier nicht warum das funktioniert!
Ich habe mir einfach die template-Deklaration angeschaut.
int MyMin(const T* feld ,int const anz)Das ist quasi ein Zeiger auf ein konstantes T.
Setz ich jetzt fuer T char* ein erhalte ich einen Zeiger auf einen konstanten char-Zeiger ->
char* const*Das fehlende const ist das, was dir der Compiler sagen will, weil dann eben die Spezialisierung nicht mehr zur der Vorlage passt.
Edit:
PS: wenn dir die Zeigersyntax und deren Bedeutung nicht ganz klar ist, schau vielleicht mal hier rein
-
hä?
ich weiß, dass er bei der ersten funktion nur die zeiger vergleichen würde, deshalb habe ich ja die zweite funktion (unter template<>)
ah verdammt, ich habe using namespace std vergessen, ich depp! nochmal testen!
-
hmm..geht auch nicht
-
hmm..geht auch nicht
was funktioniert nicht?

#include <iostream> using namespace std; template <class T> int MyMin(const T feld ,int const anz) { int min=0; for(int i=0; i<anz; i++ ) { if(feld[i]<feld[min]) min=i; } return min; } template<> int MyMin(char **const feld, const int anz) { int min=0; for(int i=0; i<anz;i++) { if(strlen(feld[i])<strlen(feld[min])) min=i; } return min; } int main(void) { int min=0; int bla[]={5,3,-2,1,8,10,-5,4,7,-14,6,-3,123,56,-46}; min=MyMin(bla,15); cout << "Kleinstes Element ist "<< bla[min]<< " an Position " <<min<<endl; float blub[]={1.0,4.6,3.5,4.3,-9.6,10.0,-3.4,1.0,-2,9}; min=MyMin(blub,8); cout << "Kleinstes Element ist "<< blub[min]<< " an Position " <<min<<endl; char *scheissendreck[]={"schei","sse","en","dreck!", "pn", "d", "az"}; min=MyMin(scheissendreck,7); cout << "Kleinstes Element ist "<< scheissendreck[min]<< " an Position " <<min<<endl; return 0; }