Resize eines static vector aus einem externen struct



  • Hallo,

    ich habe folgendes Problem:

    Ich habe einen externen Struct, welcher ein static vector enthält.
    Nun möchte ich diesen Vektor mit Hilfe von resize modifizieren.
    Leider bekomme ich folgende Fehlermeldung:

    error LNK2019: unresolved external symbol "public: static class std::vector<struct float2,class std::allocator<struct float2> > teststruct::test" (?test@teststruct@@2V?vector@Ufloat2@@V?vector@Ufloat2@@V?allocator@Ufloat2@@@std@@@std@@A) referenced in function "void __cdecl task2Trajectoryplanner::write2InputStructure(class CFreespaceDataChannelMsg const &)" (?write2InputStructure@task2Trajectoryplanner@@YAXABVCFreespaceDataChannelMsg@@@Z)

    Hier ist der Code dazu:

    #include <vector>
    using namespace std;
    
    //*********************
    
    struct float2 {
    	float2(float x, float y) {
    		float2::x = x;
    		float2::y = y;
    	}
    
    	float2() {
    		x = 0;
    		y = 0;
    	}
    
    	float x;
    	float y;
    };
    
    //*********************
    
    struct teststruct
    		{
    			 static std::vector<float2> test;
    		};
    
    extern struct teststruct teststruct1;
    
    //*********************
    
    void write2InputStructure(const CFreespaceDataChannelMsg & fs )
    {
    
    		teststruct1.test.resize(5);
    }
    

    Wäre super, wenn ihr mir weiterhelfen könntet.

    viele Grüße,
    Eric



  • Hast du

    teststruct1
    

    auch definiert?

    extern struct teststruct teststruct1;
    

    ist nur eine Deklaration. Ist dir klar, was

    extern
    

    bedeutet?

    Außerdem muss es

    void write2InputStructure(const CFreespaceDataChannelMsg & fs )
    {
        teststruct::test.resize(5);
    }
    

    heißen, da test static ist.



  • Erstmal vielen Dank für deine Antwort.
    Den Unterschied zwischen einer Deklaration und Definition habe ich mir grad nochmal klar gemacht und somit brauche ich natürlich noch die Definition. Habe sie eingefügt, ich hoffe an der richtigen Stelle, und den Code angepasst:

    #include <vector>
    using namespace std;
    
    //*********************
    
    struct float2 {
    	float2(float x, float y) {
    		float2::x = x;
    		float2::y = y;
    	}
    
    	float2() {
    		x = 0;
    		y = 0;
    	}
    
    	float x;
    	float y;
    };
    
    //*********************
    
    struct teststruct
    		{
    			 static std::vector<float2> test;
    		};
    
    extern struct teststruct teststruct1;
    
    //*********************
    
    void write2InputStructure(const CFreespaceDataChannelMsg & fs )
    {
    	struct teststruct teststruct1;
    		teststruct1::test.resize(5);
    }
    

    Leider bekomme ich nun folgende Fehlermeldungen:

    1>..\..\sandbox\src\Trajectoryplanner\src\Framework\RunTask\Task2Appl_Trajectoryplanner.cpp(100) : error C2510: 'teststruct1' : left of '::' must be a class/struct/union
    1>..\..\sandbox\src\Trajectoryplanner\src\Framework\RunTask\Task2Appl_Trajectoryplanner.cpp(100) : error C2065: 'test' : undeclared identifier
    1>..\..\sandbox\src\Trajectoryplanner\src\Framework\RunTask\Task2Appl_Trajectoryplanner.cpp(100) : error C2228: left of '.resize' must have class/struct/union



  • eric84 schrieb:

    Habe sie eingefügt, ich hoffe an der richtigen Stelle...

    Scheint mir nicht so.
    1. Wenn hättest du sie außerhalb der Funktion definieren müssen. Wobei mir ohnehin der Sinn einer Instanz an dieser Stelle fehlt: Enthält doch nur statische Member.
    2. extern macht meines Erachtens allgemein in einer cpp-Datei keinen Sinn.



  • #include <vector>
    
    struct float2 {
        float2(float x, float y) {
            float2::x = x;
            float2::y = y;
        }
    
        float2() {
            x = 0;
            y = 0;
        }
    
        float x;
        float y;
    };
    
    struct teststruct
    {
         static std::vector<float2> test;  
    };
    
    std::vector<float2> teststruct::test;  // definition hat gefehlt
    
    int main()
    {
        //teststruct t1;
        //t1.test.resize(5);
        // oder
        teststruct::test.resize(15);
    }
    


  • Hallo,

    erstmal vielen Dank für eure Antworten!
    Im nächsten Schritte möchte ich gerne ein struct in einem struct verwenden, weiß aber nicht, wie ich das Beispiel aus dem letzten verändern muss.
    Nochmal kurz zum Kontext:
    Das Beispiel muss nicht unbedingt Sinn machen, denn ich hab es so reduziert, dass das eigentliche Problem dargestellt. Eigentlich ist es Teil eines großen vorgegebenen Frameworks. Das heißt, dass die Art und Weise der Deklaration des Structs vorgegeben ist, auch z.B. die Verwendung von extern.
    So jetzt zum Biespiel:

    #include <vector>
    
    struct float2 {
        float2(float x, float y) {
            float2::x = x;
            float2::y = y;
        }
    
        float2() {
            x = 0;
            y = 0;
        }
    
        float x;
        float y;
    };
    
    extern struct teststruct t1;
    
    struct inneresstruct
    {
         static std::vector<float2> test;  
    };
    
    struct teststruct
    {
    inneresstruct istr;
    };
    
    std::vector<float2> inneresstruct::test;  
    
    int main()
    {
        teststruct t1;
        t1.istr.test.resize(5);
    
    }
    

    Ich glaube, ich habe da noch ein bißchen Chaos drin 😉
    Denn habe die Fehlermeldung:
    1>..\..\sandbox\src\Trajectoryplanner\src\Framework\RunTask\Task2Appl_Trajectoryplanner.cpp(109) : warning C4101: 't1' : unreferenced local variable



  • eric84 schrieb:

    Das Beispiel muss nicht unbedingt Sinn machen, denn ich hab es so reduziert, dass das eigentliche Problem dargestellt. Eigentlich ist es Teil eines großen vorgegebenen Frameworks. Das heißt, dass die Art und Weise der Deklaration des Structs vorgegeben ist, auch z.B. die Verwendung von extern.

    Dann nehme ich mal an das "extern" in einem Header steht? Wenn nicht ist es weiterhin nonsense. Zudem VERSTEHST du extern nicht.

    Weißt du überhaupt was extern macht?

    // Header
    extern teststruct t1; // <-- Alleine für sich nicht ausreichend
    

    In einer cpp muss die eigentliche Deklaration stehen, wenn es wirklich Teil eines Frameworks ist, sollte sie auch existieren. Zudem wird hier eine globale Variable als Gegenstück erwartet.

    // Source
    teststruct t1; // <-- Gegenstück (globale Variable)
    

    Daher ist auch dein restlicher Code Unsinn. Deine lokale Variable hat nichts mit der "extern"-Deklaration zu tun.

    Edit: Unnötige "stuct"-Angaben entfernt.



  • Ich habe das bislang mit dem extern so verstanden, dass ich die Variable bzw. das Struct damit erstmal nur deklariere und somit sage, dass es existiert und ich es dann in der cpp initialisiere.

    Du hast recht, ich hätte erkenntlich machen sollen, dass ein Teil des Codes im header steht:

    //headerfile1.h
    #include <vector>
    
    struct float2 {
        float2(float x, float y) {
            float2::x = x;
            float2::y = y;
        }
    
        float2() {
            x = 0;
            y = 0;
        }
    
        float x;
        float y;
    };
    
    //headerfile2
    extern struct teststruct t1;
    
    struct inneresstruct
    {
         static std::vector<float2> test;  
    };
    
    struct teststruct
    {
    inneresstruct istr;
    };
    
    // Source file
    #include "headerfile1.h"
    #include "headerfile2.h" 
    
    std::vector<float2> inneresstruct::test;  //brauch ich das?
    
    void write2InputStructure(const CFreespaceDataChannelMsg		 & fs )
    {
        struct teststruct t1;
        t1.istr.test.resize(5);
    
    }
    

    Leider tue ich mich trotzdem noch immer schwer, wie ich jetzt weitermachen kann, denn ich bin noch nicht wirklich fit in C++ und muss leider damit auskommen.



  • Warum willst Du eine Instanz einer Struktur erzeugen, die keine Member enthält? Weißt Du, was static in dem Zusammenhang bedeutet?

    Vielleicht schilderst Du mal, was Du überhaupt erreichen willst.



  • eric84 schrieb:

    Ich habe das bislang mit dem extern so verstanden, dass ich die Variable bzw. das Struct damit erstmal nur deklariere und somit sage, dass es existiert und ich es dann in der cpp initialisiere.

    Und nochmals: Wo definierst die die Variable? Das extern sagt aus das du es in der Source definierst - die Definition fehlt noch immer. Du hast extern eine globale Variable (übrigens ist hier das stuct-Schlüsselwort unnötig, das ist C-Stil) deklariert, in deiner Sourcedatei existiert aber keine solche (außer eine Lokale [auch hier ist struct unnötig], die nichts mit der extern deklarierten zu tun hat).

    Alles das wurde aber schon mehrmals gesagt - nur liest du es scheinbar nur halbherzig.

    Und ja, statische Member musst du nochmals in der Sourcedatei definieren.



  • Ich versuche mal zu beschreiben, was ich eigentlich erreichen will und warum ich das mache.
    Im header habe ich im struct TrajectoryplannerInData verschiedene member. Hier im Beispiel habe ich die anderen rausgeworfen, so dass nur freespace übrig bleibt. Die Variable SplineControlPoints stellt für mich im weiteren Verlauf eine Art Zwischenvariable dar.
    Im Sourcefile übergebe ich dann die Kontrollpunkte über die SplineControlPoints an die Variable ControlPoints. Eventuell könnte ich auch den Zwischenschritt weglassen.
    Mir ist bewusst, dass der Code noch falsch ist, aber ich denke mal, somit wisst ihr warum ich das mache. 😉

    //header
    using namespace std;
    
    extern struct STrajectoryplannerInData TrajectoryplannerInData;
    
    struct SFreespace
    {
    	static std::vector<float2> SplineControlPoints;
    
    	};
    
    struct STrajectoryplannerInData
    {
    
      SFreespace	freespace;
    
    };
    
    //source
    #include "TrajectoryplannerIn.h"
    namespace task2Trajectoryplanner
    {
    void write2InputStructure(const CFreespaceDataChannelMsg		 & fs )
    {
    
    		int ControlPointCount = fs.SplineControlPoints.mBufferDataSize/sizeof(float2);
    
    		static std::vector<float2> ControlPoints;
    
    TrajectoryplannerInData.freespace.SplineControlPoints.resize(ControlPointCount);
    
    		memcpy(&ControlPoints.front(), fs.SplineControlPoints.mBuffer, ControlPoints.size()*sizeof(float2));
    		TrajectoryplannerInData.freespace.SplineControlPoints=ControlPoints;
    
    		}
    

Anmelden zum Antworten