ganz schlimmer fehler!!!



  • Die Includeguards kommen in die Headerdatei. Und in der .cpp-Datei brauchst du
    die .h-Datei nicht mehr includieren. Nach der include-Zeile in der Header steht
    der Code ja quasi direkt untereinander.

    Auch hier ist es besser, den Namensraum nicht zu oeffnen und auch in der
    .cpp-Datei mit dem std::-Prefix zu arbeiten.

    mfg
    v R



  • ok;
    meine klasse sieht dann so aus:

    #ifndef matrix_klasse
    #define matrix_klasse
    
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    template <class T>
    class matrix
    {
    	public:
    		matrix(unsigned int z); //eine dimension
    		matrix(unsigned int z, unsigned int s);  //zwei dimemsionen
    		//matrix(int, int, int);  //noch nicht
    		~matrix();
    
    		void ausgabe_matrix();
    
    		void setze_in_matrix(T *feld); //schiebt hinten rein(matrix)
    		void setze_in_matrix(T *feld, int pos_z);  //für eindim array
    		void setze_in_matrix(T *feld, int pos_z, int pos_s); //für zweidim matrix
    
    		void fuege_array_ein(T *array);
    
    	private:
    		T *matrix_eindim;
    		T **matrix_zweidim;
    		//T ***matrix_dreidim;
    
    		unsigned int zeilen_matr;
    		unsigned int spalten_matr;
    
    		unsigned int index_z_eindim;  //damit verwechlungen ausgeschlossen sind
    		unsigned int index_z_zweidim;
    		unsigned int index_s_zweidim;
    };
    #include "matrix.cpp"
    
    #endif
    
    #include <iostream>
    #include <cstdlib>
    
    template <class T>
    matrix<T>::matrix(unsigned int zeilen)
    {
    	matrix_eindim = new T[zeilen];
    	zeilen_matr = zeilen;
    }
    
    template <class T>
    matrix<T>::matrix(unsigned int zeilen, unsigned int spalten)
    {
    	matrix_zweidim = new T*[zeilen];
    	for(int i=0; i < zeilen; i++)
    		matrix_zweidim[i] = new T[spalten];
    	zeilen_matr = zeilen;
    	spalten_matr = spalten;
    }
    
    template <class T>
    matrix<T>::~matrix()
    {
    	delete [] matrix_eindim;
    	delete [] matrix_zweidim;
    	//delete matrix_dreidim;
    }
    
    template <class T>
    void matrix<T>::ausgabe_matrix()
    {
    	for(int i = 0; i < zeilen_matr; i++)
    		cout<< "Position " << i << ": " << matrix_eindim[i] << endl;
    }
    
    template <class T>
    void matrix<T>::setze_in_matrix(T *feld)
    {
    	int feld_zeilen = sizeof(feld) / sizeof(feld[0]);
    	for(; index_z_eindim < feld_zeilen; index_z_eindim++)
    		matrix_eindim[index_z_eindim] = feld[index_z_eindim];
    }
    
    matrix.cpp:5: error: expected constructor, destructor, or type conversion before '<' token
    matrix.cpp:5: error: expected `;' before '<' token
    matrix.cpp:12: error: expected constructor, destructor, or type conversion before '<' token
    matrix.cpp:12: error: expected `;' before '<' token
    matrix.cpp:22: error: expected constructor, destructor, or type conversion before '<' token
    matrix.cpp:22: error: expected `;' before '<' token
    matrix.cpp:30: error: expected init-declarator before '<' token
    matrix.cpp:30: error: expected `;' before '<' token
    matrix.cpp:37: error: expected init-declarator before '<' token
    matrix.cpp:37: error: expected `;' before '<' token
    

    mir scheint an erfahrung zu mangeln...



  • @exigoner:
    Dein Hauptprogramm sollte so aussehen:

    #include "matrix.hpp"
    
    int main()
    {
          return 0;
    }
    

    Beachte das du in dein Hauptmodul den header matrix.hpp einbinden musst und nicht die matrix.cpp...

    Caipi



  • also meine main:

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    #include <iostream>
    #include <cstdlib>
    #include "matrix.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
      int a[] = {1,2,3,4,5,6,7,8,9,8,7,6,5,4,3};
    
      matrix<int> mat(15);
      mat.setze_in_matrix(a, 15);
      mat.ausgabe_matrix();
    
      return EXIT_SUCCESS;
    }
    

    sieht ganz gut aus... außerdem hab ich meine klasse ganz normal matrix.h und meine getrennte implementation matrix.cpp genannt. (siehe oben)
    der fehler liegt damit best. wieder in dieser beschissenen klasse. 😞
    [heul]



  • My last try 🙂

    Wenn deine Dateien matrix.hpp, matrix.cpp und main.cpp heißen und du zusätzlich die setze_in_matrix() Methode überarbeitest (Du rufst diese mit zwei Argumenten auf, sie erwartet aber nur eins), sollte sich der folgende Code (abgesehen von ein paar Warnungen) mit dem g++ compilieren lassen: (Von den logischen Fehlern spreche ich hier mal nicht...)

    matrix.hpp

    #ifndef matrix_klasse
    #define matrix_klasse
    
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    template <class T>
    class matrix
    {
        public:
            matrix(unsigned int z); //eine dimension
            matrix(unsigned int z, unsigned int s);  //zwei dimemsionen
            //matrix(int, int, int);  //noch nicht
            ~matrix();
    
            void ausgabe_matrix();
    
            void setze_in_matrix(T *feld); //schiebt hinten rein(matrix)
            void setze_in_matrix(T *feld, int pos_z);  //für eindim array
            void setze_in_matrix(T *feld, int pos_z, int pos_s); //für zweidim matrix
    
            void fuege_array_ein(T *array);
    
        private:
            T *matrix_eindim;
            T **matrix_zweidim;
            //T ***matrix_dreidim;
    
            unsigned int zeilen_matr;
            unsigned int spalten_matr;
    
            unsigned int index_z_eindim;  //damit verwechlungen ausgeschlossen sind
            unsigned int index_z_zweidim;
            unsigned int index_s_zweidim;
    };
    #include "matrix.cpp"
    
    #endif
    

    matrix.cpp

    #include <iostream>
    #include <cstdlib>
    
    template <class T>
    matrix<T>::matrix(unsigned int zeilen)
    {
        matrix_eindim = new T[zeilen];
        zeilen_matr = zeilen;
    }
    
    template <class T>
    matrix<T>::matrix(unsigned int zeilen, unsigned int spalten)
    {
        matrix_zweidim = new T*[zeilen];
        for(int i=0; i < zeilen; i++)
            matrix_zweidim[i] = new T[spalten];
        zeilen_matr = zeilen;
        spalten_matr = spalten;
    }
    
    template <class T>
    matrix<T>::~matrix()
    {
        delete [] matrix_eindim;
        delete [] matrix_zweidim;
        //delete matrix_dreidim;
    }
    
    template <class T>
    void matrix<T>::ausgabe_matrix()
    {
        for(unsigned int i = 0; i < zeilen_matr; i++)
            cout<< "Position " << i << ": " << matrix_eindim[i] << endl;
    }
    
    template <class T>
    void matrix<T>::setze_in_matrix(T *feld)
    {
        unsigned int feld_zeilen = sizeof(feld) / sizeof(feld[0]);
        for(; index_z_eindim < feld_zeilen; index_z_eindim++)
            matrix_eindim[index_z_eindim] = feld[index_z_eindim];
    }
    

    main.cpp

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    #include <iostream>
    #include <cstdlib>
    #include "matrix.hpp"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
      int a[] = {1,2,3,4,5,6,7,8,9,8,7,6,5,4,3};
    
      matrix<int> mat(15);
      mat.setze_in_matrix(a);
      mat.ausgabe_matrix();
    
      return EXIT_SUCCESS;
    }
    

    Caipi



  • es kommen genau dieselben fehler..
    und um auf die logischen fehler zu kommen... testen konnt ich die klasse noch nicht weiter 😞



  • @caipi: hast du deinen code eigentlich getestet???



  • ich hoffe ihr seid glücklich! ich habe meine templates entfernt 👎



  • Ist glaub ich auch besser so...



  • exigoner schrieb:

    @caipi: hast du deinen code eigentlich getestet???

    Von testen kann nicht die Rede sein. Aber ich habe ihn so wie von mir gepostet ohne (Syntax/Semantik)-Fehler durch den Compiler (g++) gejagt :).

    Caipi



  • egal, ich hab die klasse nicht getrennt kompillieren können, ich musste unbedingt klasse und implementation in eine datei packen. naja wenigsten funzt es jetzt 🙂
    trotzdem danke


Anmelden zum Antworten