Server/Client: Argumentuebergabe funktioniert nur mit const



  • Guten Morgen allerseits,

    ich brauche fuer ein Projekt eine Server/Client Anwendung, in der ich eine Funktion habe, die ein struct uebergibt, welches nicht const sein darf.
    Uebergebe ich ein Objekt dieses structs kommt auf der Server seite nur ein leeres Objekt an, uebergebe ich es allerdings als const, dann kommt auf Server Seite auch etwas an.

    Ich benutze fuer die Server/Client Anwendung die Middleware ICE von ZeroC.

    Anbei mal mein Code:

    IceModule.ice

    #ifndef ICEMODULE_ICE
    #define ICEMODULE_ICE
    
    module ModuleIce{
    	struct MotorNum {
            string name;
            float position;
        };
    
        sequence<MotorNum> MotorSeq;
    
    	class ClassIce{
    		bool Test1(out MotorSeq motors);
    		bool Test2(MotorSeq motors);
    	};
    };
    #endif
    

    IceModuleI.h

    #ifndef ICEMODULE_I_H
    #define ICEMODULE_I_H
    
    #include "IceModule.h"
    
    #include <iostream>
    
    class IceModuleI: public ModuleIce::ClassIce
    {
    public:
    	virtual bool Test1(ModuleIce::MotorSeq& motors, const Ice::Current&);
    	virtual bool Test2(const ModuleIce::MotorSeq& motors, const Ice::Current&);
    };
    
    #endif
    

    IceModuleI.cpp

    #include <Ice/Ice.h>
    #include "IceModuleI.h"
    #include <iostream>
    
    bool IceModuleI::Test1(ModuleIce::MotorSeq& motors, const Ice::Current&){
    
    	return true;
    }
    
    bool IceModuleI::Test2(const ModuleIce::MotorSeq& motors, const Ice::Current&){
    
    	return true;
    }
    

    Server.cpp

    #include <Ice/Ice.h>
    #include "../Common/IceModuleI.h"
    
    class HelloServer : public Ice::Application
    {
    public:
    
        virtual int run(int, char*[]);
    };
    
    int
    main(int argc, char* argv[])
    {
    	HelloServer app;
        return app.main(argc, argv, "config.server");	
    }
    
    int
    HelloServer::run(int argc, char* argv[])
    {
        if(argc > 1)
        {
    		std::cerr << appName() << ": too many arguments" << std::endl;
            return EXIT_FAILURE;
        }
    
        Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Laser");
    	ModuleIce::ClassIcePtr test = new IceModuleI;
        adapter->add(test, communicator()->stringToIdentity("Server1"));
        adapter->activate();
        communicator()->waitForShutdown();
        return EXIT_SUCCESS;
    }
    

    Der Client hat folgende Funktion (nur ein Ausschnitt)

    ModuleIce::MotorSeq motors;
    ModuleIce::MotorNum motor1;
    ModuleIce::MotorNum motor2;
    ModuleIce::MotorNum motor3;
    
    motor1.name="x";
    motor1.position=1;
    motor2.name="y";
    motor2.position=2;
    motor3.name="z";
    motor3.position=3;
    motors.push_back(motor1);
    motors.push_back(motor2);
    motors.push_back(motor3);
    
    hello->Test2(motors);
    hello->Test1(motors);
    

    Das Problem ist nun, dass wenn ich Test2 aufrufe "motors" auch richtig uebergeben wird, ich kann damit auf dem Server also arbeiten und bekomme es auch ordentlich wieder.
    Rufe ich allerdings Test1 auf, erhalte ich auf Serverseite nur ein leeres MotorSeq.

    Die IceModule.h Dateien werden von ZeroC ICE erzeugt. Kann die gerne nachreichen wenn sie benoetigt werden. Da sie aber 600-800 Zeilen lang sind hab ich sie erstmal weggelassen.

    Vielen Dank im Voraus



  • Was bedeutet denn das out bei Test1? Es gibt doch bestimmt ein inout, oder? Ist aber boffensichtlich keine C++ Frage.



  • Ah, tschuldigung das hatte ich vergessen dazu zu schreiben.
    Out bedeutet, dass dieser Parameter veraendert werden kann. Ein inout gibt es meines Wissens nach nicht.

    Liste der Keywords in ICE:
    http://doc.zeroc.com/display/Ice/Slice+Keywords
    Da ist auch nichts dergleichen bei.
    Ich moechte halt die Liste der "motors" in den Funktionen veraendern, deswegen das out. In den 2 Testfunktionen mach ich natuerlich noch nichts damit, aber man kann beim debuggen sehen, dass der Parameter in der Funktion ohne const leer ist.



  • Das scheint in ICE nicht zu gehen, d.h ein Parameter ist entweder in oder out, niemals aber beides. Aber wie gesagt: das ist kein C++ Problem. Du solltest in einem ICE Forum fragen.


Log in to reply