Vektoren als Funktionsparameter



  • Kleine Frage:
    ist es möglich in C++ einen Funktionsparameter vom Typ Vektor zu definieren? Denn was für mich am logischsten aussah, geht nicht:

    void funcname( vector<stuctname> &varname )
    {...}
    

    Fehler: type specifier omitted for parameter `vector<strucname>'
    Compiler: g++

    danke!



  • Xilef schrieb:

    Fehler: type specifier omitted for parameter `vector<strucname>'

    Orginal gepastet? Fehlt nämlich ein t.

    Ansonsten: mehr Code.



  • Hi,

    ja, dein Code ist aber eigentlich auch richtig. Hast du noch mehr?



  • danke für schnellen Antworten, ich schreib aus dem Code mal das wichtigste zusammen...



  • merkwürdig ist, das das sauber compiliert wird:

    #include <vector>
    using namespace std;
    
    struct teststruct
    {
    	int a;
    };
    
    void testfunction(vector<teststruct> testparam)
    {
    
    }
    
    int main()
    {
    	return 0;
    }
    

    Ich include halt die Datei, in der das drinsteht, das Original:

    struct xray_3dpoint
    {
    	float	x, y, z;	//position;
    };
    
    struct xray_3dcamera
    {
    	xray_3dpoint	pos;		//position
    	float	p, y, r,		//direction: Pitch, Yaw, Roll
    		h, v;			//open angle: horizontal,vertical
    	bool	rad;			//projection type: radial or normal
    };
    
    void xray_drawto(SDL_Surface *surface, xray_3dcamera &cam, vector<xray_3dpoint> points)
    {
    ...	
    }
    

    oder muss ich in der includeten Datei noch #include <vector> reinschreiben?



  • Der Fehler lässt sich so reproduzieren:
    test.cpp:

    #include <vector>
    #include "testinc.cpp"
    using namespace std;
    
    int main()
    {
    	return 0;
    }
    

    testinc.cpp

    struct xray_3dpoint
    {
    	float	x, y, z;	//position;
    };
    
    struct xray_3dcamera
    {
    	xray_3dpoint	pos;		//position
    	float	p, y, r,		//direction: Pitch, Yaw, Roll
    		h, v;			//open angle: horizontal,vertical
    	bool	rad;			//projection type: radial or normal
    };
    
    void xray_drawto( xray_3dcamera &cam, vector<xray_3dpoint> points)
    {
    }
    

    Was mache ich falsch?
    Danke im Vorraus!



  • OK, OK!
    Ich habs, ist mir beim durchlesen eben nochmal aufgefallen:
    using namespace std; muss natürlich schon vor dem includen hingeschrieben werden.

    Trotzdem danke für alles!



  • In die Funktions-/Methoden-Paramter würde ich aber immer den Namespace mit reinschreiben. Damit jeder (auch man selber) sofort sieht, zu welchem Namespace vector gehört. Denn es könnte ja auch sein, das es in dem Projekt bzw. in einer anderen Library auch ein vector in einem eigenen Namespace gibt.

    void foo(std::vector<x3d> vec)
    {
    }
    

    Ist viel sauberer.



  • Und den vector dann als Referenz übergeben, sonst ist es etwas performance lastig 😵

    Devil



  • Und niemals ein using *vor* irgendwelchen Headerdateien. Immer erst danach. Und auch kein .cpp includen.



  • das mit Referenzen übergeben ist klar...
    std::vector leuchtet auch ein.
    Aber Jester, wie soll ich es denn sonst lösen? Gib bitte mal ein kleines Beispiel.



  • am besten:

    1. auf using "namespace" verzichten !

    2. damit kein knoten in die finger bekommst, typedefs verwenden
    typedef std::vector<x3d> x3dvectorT; // hilft unwahrscheinlich ...

    3. eigendefinitionen (typedefs), structs, enums etc die in den selben zusammenhang verwendest, in ne eigene schlanke headerdatei auslagern, die bei berdarf immer wieder includen kannst ....

    4. frueher oder spaeter kommst dann zu dem punkt, wo die sachen, die immer im selben zusammenhang verwendest, in ne lib auslagerst, auch in nen eigenen namespace pappst .... spaetestens dann ueberlegst dir das using 2 oder 3 mal vorher 🙂 aber das erst spaeter ....

    In deinem Fall wuerd ich sowas machen:

    /////////////////////////////////////////////////////////////////////////////
    // XRayTypes.h
    // Inlude Guards und so nicht vergessen ! 
    
    #include <vector>
    
    struct xray_3dpoint
    {
        float    x, y, z;    //position;
    };
    
    struct xray_3dcamera
    {
        xray_3dpoint    pos;        //position
        float    p, y, r,        //direction: Pitch, Yaw, Roll
            h, v;            //open angle: horizontal,vertical
        bool    rad;            //projection type: radial or normal
    };
    
    typedef std::vector<xray_3dpoint> x3dvector_t;
    
    /////////////////////////////////////////////////////////////////////////////
    // main.cpp
    
    #include XRayTypes.h
    
    void xray_drawto(SDL_Surface *surface, xray_3dcamera &cam, x3dvector_t & points)
    {
    ...    
    } 
    
    int main()
    {
        // ... was auch immer du hier machen willst 
    
        return 0;
    }
    

    Wenn deine Funktionlaitaet zum zeichnen etc ungern ins hauptptogramm pappst, was durchaus sehr verständlich ist 😃 dann nen besseres objektorientiertes design, wo die funktionalitaet in den members von paar spezialisierten klassen liegt. include *.cpp macht ma wirklich nicht ....
    und lose funktionen zum zeichnen sind eher mehr proceduraler stil anstatt objektorientierter ....

    Ciao ...


Anmelden zum Antworten