列表的每个对象上的属性等于,但应在循环中设置不同

时间:2011-01-07 12:56:27

标签: list c++-cli getter-setter

我的代码中存在问题。 代码应该从类型robot中构建一个对象列表。每个机器人应该包括一个串口和一个名称(可能稍后会有更多的属性)。 但在这一点上,我不明白,为什么任何机器人都得到相同的名称 - 系统中最后一个可用的com-port的名称。

所以,谁能告诉我,为什么? (差不多在// TBD-mark的最后) 并且,请随时评论或更正其余部分。我知道,这是很多臃肿,也许不是最好的代码。

所以,提前谢谢你。

#define debug_enabled 0
#define exampleclass_enabled 0

#using <System.dll>

using namespace System;
using namespace System::IO::Ports;
using namespace System::Threading;
using namespace System::Collections::Generic;
using namespace System::Timers;


public ref class Robot {
private: static String^ _name;
        static bool _active;

public:
    property String^ name
    {
        String^ get(){return _name;}
        void set (String^ newname) {_name = newname;} }
    static SerialPort^ port;
//  static String^ GetNameString() { return _name;}
    static bool IsActive() {return _active;}
//  static String^ SetName(String^ name) { _name->Copy(name);return _name;} 
    static bool SetActive(bool active) { _active = active; return _active;} 

};
public ref class CommunicatorClass
{
private:
       static System::Timers::Timer^ aTimer;
       static array<String^,2>^ commandList = gcnew array<String^,2>(6,2);


public: 
    static List<Robot^>^ _serialPortList = gcnew List<Robot^>();
    static int baudRate = 9600;
    static int dataBits = 8;
    static System::IO::Ports::StopBits stopBits = System::IO::Ports::StopBits::One;
    static System::IO::Ports::Parity parity = System::IO::Ports::Parity::None;
//  void Main(); /*initialisation of the Com-Ports*/
    static bool SendCommand(String^ command){
        //search in defined commandlist for command to send, if match, send int, if not set int to last default position(start) to wait for start as response
        int commandInArray;

        for(int i=0; i<commandList->Rank; i++)
            for (int j=0;j<1;j++) { //it doesnt care, if the command is the number or the word for it that equals the response
            if(command->Contains(commandList[i,0]))
                commandInArray = i;
            else
                commandInArray = commandList->Rank;
            }


        for each (Robot^ s in _serialPortList)
        {
            if (s->IsActive()){
                if (!s->port->IsOpen){
                    s->port->Open();
                } 

                try
                   {

                        s->port->DiscardInBuffer();
                        s->port->WriteLine(commandList[commandInArray,0]);
                        bool _temp = 0;


                        aTimer = gcnew System::Timers::Timer( 10000 );

                      // Set the Interval to 500 mseconds.
                      aTimer->Interval = 500;
                      aTimer->Enabled = true;

                        do  
                        {if (s->port->ReadLine()->Contains(commandList[commandInArray,1])) _temp = 1; // and in code of robot: /n after each line!
                        if (aTimer->Interval == 0) {
                            _temp = 1;
                            throw gcnew TimeoutException("Timeout on sending command to Robot - no response.");
                            }
                        }
                        while (_temp == 1);

                      }
            catch (TimeoutException ^) {
            return 0;}

                }
            }

        return 1;
    } /*sends the specified command to each robot marked active*/
    static bool refresh(){
        _serialPortList->Clear();
        CommunicatorClass::Main();
        return 1;
    }
    static void Main(){
        //initialize commands [*,0] and responses [*,1] in array
        commandList[0,0] = "8";
        commandList[0,1] = "Vor";
        commandList[1,0] = "6";
        commandList[1,1] = "Links";
        commandList[2,0] = "7";
        commandList[2,1] = "Zurueck";
        commandList[3,0] = "4";
        commandList[3,1] = "Rechts";
        commandList[4,0] = "5";
        commandList[4,1] = "Stop";
        commandList[5,0] = "";
        commandList[5,1] = "Start";


//          _serialPortList->Initialize;
        for each (String^ s in SerialPort::GetPortNames())
        {
#if debug_enabled
            Console::WriteLine("   {0}", s);
#endif

            Robot^ temp = gcnew Robot();
            temp->port = gcnew SerialPort(s,baudRate,parity,dataBits,stopBits);
            //temp->SetName(s);
            temp->name = s;
            _serialPortList->Add(temp); //TBD::error in dereferianciation ?!


        }
#if debug_enabled
        for each (Robot^ s in _serialPortList)
        {
            Console::WriteLine("   {0}", s->name);
        }
#endif
    }

};

1 个答案:

答案 0 :(得分:0)

public ref class Robot {
private: static String^ _name;
        static bool _active;

public:
    property String^ name
    {
        String^ get(){return _name;}
        void set (String^ newname) {_name = newname;} 
    }
    static SerialPort^ port;
//  static String^ GetNameString() { return _name;}
    static bool IsActive() {return _active;}
//  static String^ SetName(String^ name) { _name->Copy(name);return _name;} 
    static bool SetActive(bool active) { _active = active; return _active;} 
};

在Robot的类定义中,您将所有内容定义为静态。这意味着它将在该类的所有实例之间共享,并且可以作为Robot::SerialPort访问,而不需要像Robot^ r; r->SerialPort那样的Robot实例。

将所有这些转换为非静态的,我认为这将解决您的问题。