Templatedefinition fehlerhaft?



  • template <class T> int stop(int wahl, T option) {
    
      char taste;
    
      switch(wahl) {
        case 1: while(taste != option) { scanf("%1.1c" , &taste); };break;
        case 2: sleep(opition); break;
        default : printf("Fehler"); return -1;
      }
    
      return 0;
    
    };
    

    Wo ist der Fehler hier?

    storm@localhost ~/Desktop/C%2fC++/Versuch/Ansi $ g++ -c ansi.cpp
    ansi.cpp: In function `int storm::stop(int, T)':
    ansi.cpp:56: error: syntax error before numeric constant
    


  • Storm.Xapek.de schrieb:

    Wo ist der Fehler hier?

    ansi.cpp:56: error: syntax error before numeric constant
    

    Gegenfrage: Wo ist Zeile 56 hier?

    Möglicherweise hier?

    case 2: sleep(opition); break;
    

    Ansonsten frage ich mich, für welche Datentypen sleep definiert ist.



  • Du hast offensichtlich keine Ahnung was templates sind.

    int stop(int wahl, char option) {
    
      char taste;
    
      switch(wahl) {
        case 1: while(taste != option) { scanf("%1.1c" , &taste); };break;
        case 2: sleep(option); break;
        default : printf("Fehler"); return -1;
      }
    
      return 0;
    
    };
    


  • btw. die funktion hat noch nen anderen fehler, da taste keinen definierten anfangswert hat und du somit niemals sicher sein kannst, dass taste und option nicht doch mal den gleichen wert haben.



  • Ihr habt mich glaub ich falsch verstanden
    (oder ich hab zu wenig gesagt, ihr wisst schließlich nicht was das soll)
    Zeile 56 ist diese

    template <class T> int stop(int wahl, T option) {
    
    56:  char taste = '\0';
    
      switch(wahl) {
        case 1: while(taste != option) { scanf("%1.1c" , &taste); };break;
        case 2: sleep(option); break;
        default : printf("Fehler"); return -1;
      }
    
      return 0;
    
    };
    

    Der fehler muss also oben im funktionskopf sein

    Der Template deshalb weil man wählen kann zwischen einem stop der mit tastendruck beendet wird und einem stop der auf zeit geht.

    Das ganze gehört zu einer Bibliothek die ich mache.
    (Versuchsweiße um mal zu sehn wie das funktioniert)



  • funktioniert so trotzdem nicht, da scanf so lange wartet bis der benutzer etwas eingegeben hat
    außerdem warum verwendest du in c++ cstdio statt iostream?



  • Ich verwende cstdio weil das besser zum rest der bibliothek passt, die arbeiten nämlich mit Ansi-Sequenzen
    z.B.

    //Cusor setzen
    int cusor(int cursor_x, int cursor_y) {
    
      std::printf("\033[%d;%dH" , cursor_x ,cursor_y);
      std::fflush(stdin);
    
      return 0;
    
    }
    
    //Farbe setzen
    int farbe(int schrift, int bg, int status) {
    
      std::printf("\033[%d;%d;%dm" , schrift + 30 , bg + 40 , status);
      std::fflush(stdin);
    
      return 0;
    
    }
    
    //Bildschirm leeren
    int clear(void) {
    
    std::printf("\033[2J");
    
      return 0;
    
    }
    
    //Einstellungen zurücksetzen
    int end(void) {
    
      std::printf("\033[0m\033[2J\033[0;0H");
    
      return 0;
    
    }
    

    scanf soll ja warten bis der benutzer was bestimmtes eingibt (das bestimmte wird durch option bestimmt). Wenn es nicht der gesuchte buchstabe war dann wird die schleife wiederholt.



  • Storm.Xapek.de schrieb:

    Ihr habt mich glaub ich falsch verstanden
    (oder ich hab zu wenig gesagt, ihr wisst schließlich nicht was das soll)

    Stimmt.
    Die Version, die Du gepostet hast, wird bei mir kompiliert. (GNU C 4.0.3)

    Was das ganze soll, halte ich definitiv für fraglich, wenn das ganze auch noch in eine Bibliothek soll, nimm bitte Any's Variante ohne die Template-Definition.

    Für ein deartiges Problem(?) sind Templates nicht gedacht.



  • [quote="Storm.Xapek.de"]Ich verwende cstdio weil das besser zum rest der bibliothek passt, die arbeiten nämlich mit Ansi-Sequenzen
    z.B.

    //Cusor setzen
    int cusor(int cursor_x, int cursor_y) {
    
      std::printf("\033[%d;%dH" , cursor_x ,cursor_y);
      std::fflush(stdin);
    
      return 0;
    }
    

    Du hast y und x vertauscht.



  • Bei mir wirds nicht gemacht

    storm@localhost ~/Desktop/C%2fC++/Versuch/Ansi $ g++ -c ansi.cpp
    ansi.cpp: In function `int storm::stop(int, T)':
    ansi.cpp:56: error: syntax error before numeric constant
    

    g++ (GCC) 3.3.6

    Ihr habt recht, dass ganze hat keinen richtigen Sinn (bis jetzt halt noch nicht) ich will nur mal eine Bibliothek erstellen, was auch klappt. Nur ist irgendwas in dem Funktions kopf falsch, und mir kommt einfach nicht ein was!

    PS: das mit x und y hab ich nochnicht getestte, weil mir dieses template den letzten nerv raubt.
    ich änders gleich um danke!



  • Storm.Xapek.de schrieb:

    Ihr habt recht, dass ganze hat keinen richtigen Sinn (bis jetzt halt noch nicht) ich will nur mal eine Bibliothek erstellen, was auch klappt.

    Hmm... wenn Du schon Bibliotheken schreibst, ist Dir sicherlich auch bewußt, dass Templates jeweils für den entsprechenden Datentyp kompiliert werden, sich die Sourcecodes für das komplette Template daher in einer Headerdatei (.h) und nicht in einer bereits kompilierten Datei (.o) wiederfinden.

    Ansonsten hätte das Template nur für die Programmierung Deiner Bibliothek, nicht aber für die Anwendung der Bibliothek Sinn. Und den Sinn Deiner Funktion sehe ich darin, dass das Template Dir Fehler ermöglicht, die Any's Variante verhindert. Spricht also nicht grade für die Verwendung von Templates ;->

    Storm.Xapek.de schrieb:

    Nur ist irgendwas in dem Funktions kopf falsch, und mir kommt einfach nicht ein was!

    Wenn der 4.0.3 es ohne Meldung kompiliert und der 3.3.6 nicht, dann würde ich die Frage mal vorsichtig umformulieren. Was macht der 3.3.6 anders als der 4.0.3... bzw. warum macht eine neuere Version das.

    Ich habe jetzt schon länger keine Templates mehr verwendet, aber so wie ich das sehe, scheint die Definition ok zu sein, was mir zumindest der 4.0.3 auch nicht widerlegt.

    Gibt's eine Version 3.3.7? ;->



  • Hm ich glaub ich schmei den template wirklich raus.
    Und versuchs mal mit ner überladenen Funktion.

    Vielen Dank für eure Hilfe.

    (Ich will auch den GCC 4.0.3 wusst garnicht das es den schon gibt)



  • Ach jetzt verstehe ich was du meintest, der erste parameter bestimmt ja ob per eingabe oder per zeit, hatte dich falsch verstanden, sorry.

    Aber mir ist immernoch schleierhaft warum dein zweiter parameter kein char sein darf, wenn du doch nur ein einzelnes zeichen einliest und es mit dem zweiten parameter vergleichst.

    Außerdem würd ich den ersten Parameter zu nem enum machen, mit nem schönen Namen kann man mehr anfangen, als mit 1 und 2. Alternativ geht natürlich auch ne Konstante (const int, kein define).



  • Hi Leute,

    momentan ärgere ich mich mit einer Template-Klasse rum, die folgendermaßen definiert ist:

    template <class T>
    class Array
    {
     public:
    
      Array(int array_s = 1) : size(array_s)
      {
       ar_pt = new T[size];
      }
    
      ~Array(void)
      {
      } 
    
      int ar_size(void)
      {
       return (size);
      }
    
      T& operator[](int index)
      {
       if(index < 0 || index >= size)
       {
        cerr << "Ungueltige Index-Laufweite.";
       }
    
       return (ar_pt[index]);
      }
    
     private:
    
      int size;
      T* ar_pt;
    };
    

    Wenn ich dann versuche, diese Template-Klasse zu expandieren, indem ich sie in einer Klasse Kalender implementiere, was folgendermaßen aussieht,

    class Kalender : public Datum
    {
     public:
    
      Kalender(int j = 2006)
    
      {
       if(!schaltjahr(j))
       {
       // delete kal[366];
       } 
      }
    
      virtual ~Kalender(void)
      {
      }
    
      short int schaltjahr(int); 
    
      Array<Datum> kal(366);
      Array<int> ai(5);
    };
    

    schmeißt mir der tolle Compiler entgegen, er hätte in Zeile soundso (Expandierung der Template- in Datum- bzw. int-Klasse) den Syntax-Fehler 'constant' gefunden. Hat jemand eine Ahnung, woran das liegen könnte?



  • Tschuldige, hab vorher falschen Benutzernamen eingegeben.

    Sorry @ any

    Redemption



  • Any schrieb:

    Hi Leute,
    schmeißt mir der tolle Compiler entgegen, er hätte in Zeile soundso (Expandierung der Template- in Datum- bzw. int-Klasse) den Syntax-Fehler 'constant' gefunden. Hat jemand eine Ahnung, woran das liegen könnte?

    Könntest Du die exakte Compilermeldung wiedergeben.
    Syntaxfehler... klingt nach ... falsch geschrieben.

    Hast Du mal grep 'constant' durch Deinen Quellcode laufen lassen, insbesondere da, wo Datum definiert wurde?



  • Bitte ignorieren [versehentlich 2x geschickt]



  • Verzeih mir meine Unwissenheit, aber was meinst du mit grep?

    Zur Fehlermeldung: Das ist ja gerade das lustige - er meldet nur, dass er in dieser Zeile einen Fehler gefunden hat, und zwar 'constant'.

    In main() kann ich die Ausdrücke

    Array<Datum> kal(366);
    

    und

    Array<int> ai(5);
    

    ohne Fehler anwenden, in der Klassendefinition meldet er jedes Mal, wenn ich die Template-Klasse expandiere, egal ob mit einer vorgegebenen Klasse (int, char...) oder mit einer eigenen (Datum) diesen Fehler.



  • Redemption schrieb:

    Verzeih mir meine Unwissenheit, aber was meinst du mit grep?

    grep ist ein Programm, das Textdateien nach bestimmten Mustern, z.B. "constant" durchsucht. Hätte ja sein können, dass Du irgendwo statt const mal constant geschrieben hast in einem Stück Sourcecode, dass Du nicht gepostet hast.

    Redemption schrieb:

    Zur Fehlermeldung: Das ist ja gerade das lustige - er meldet nur, dass er in dieser Zeile einen Fehler gefunden hat, und zwar 'constant'.

    Welche ist "diese" Zeile? Und wie lautet die exakte Fehlermeldung?

    Redemption schrieb:

    In main() kann ich die Ausdrücke Array<Datum> kal(366); und Array<int> ai(5); ohne Fehler anwenden, in der Klassendefinition meldet er jedes Mal, wenn ich die Template-Klasse expandiere, egal ob mit einer vorgegebenen Klasse (int, char...) oder mit einer eigenen (Datum) diesen Fehler.

    Schlussfolgerung: Es liegt vermutlich nicht an Array<>.

    Es muss also an der Klassendefinition liegen, die ja anscheinend Datum erweitert. (Wieso ist ein Kalender eigentlich ein Datum?)

    Kann es sein, dass dadurch irgendwas in die Brechen geht?
    Mir fällt auf Anhieb kein Fehler auf.

    Was sagen andere Compiler?



  • Diese Zeile ist diese hier:

    Array<Datum> kal(366);
    

    Den Tipp mit dem constant berücksichtige ich mal - wär zwar peinlich, aber was solls...

    Und das ein Kalender kein Datum ist, stimmt natürlich, aber wir haben für die Schule gerade die Datum-Klasse geschrieben, und ich experimentier schon mal mit Vererbung, virtuellen Methoden und Templates herum. Mir ist schon klar, das diese Vererbungs-Hierarchie nicht der Realität entspricht und wahrscheinlich auch nicht zweckmäßig ist. Das ist sozusagen mein erster Gehversuch in Sachen Vererbung, Polymorphismus etc.


Anmelden zum Antworten