C# 访问结构数组中的字段
我希望有人能帮我解决这个问题 我正在制定一个通过以太网UDP与一些节点通信的协议 我试图用这段代码实现的是,我想通过其源ID和注册表添加传感器数据结构中节点的数据 我在我的“MicroRov_Protocol_Structs.cs”中做了一些结构 但我希望代码是这样的:C# 访问结构数组中的字段,c#,arrays,struct,field,C#,Arrays,Struct,Field,我希望有人能帮我解决这个问题 我正在制定一个通过以太网UDP与一些节点通信的协议 我试图用这段代码实现的是,我想通过其源ID和注册表添加传感器数据结构中节点的数据 我在我的“MicroRov_Protocol_Structs.cs”中做了一些结构 但我希望代码是这样的: // save data by sensor number: sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID
// save data by sensor number:
sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].microRov_msg_header.REGISTER_ADDRESS = microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS];
dataFromMicroRovProtocolCallback(ipAddress, ListenPort, buffer, microRov_data, StateMachines_Structs.ProtocolDataState.Data, microRov_msg_header.REGISTER_ADDRESS);
}
}
}
catch
{
}
}
我希望有人能帮我一些关于这方面的信息。我更喜欢这样编写代码,而不是制作一个巨大的开关盒结构。我曾尝试在网上搜索一些代码示例,但没有。
我已经尽可能详细地解释了这个问题
SENSORS\u DATA
是一种类型为MICRO\u ROV\u REGISTRY\u DATA
的数组MICRO ROV_msg_header
是类型为MICRO_ROV_REGISTRY_DATA
的对象,并且不是MICRO_ROV_REGISTRY_DATA
的成员
向数组中添加对象时,会在数组中创建对象引用,而不是对象本身。我已编辑了您的标题。请看,“,共识是“不,他们不应该”。我不知道。你好,谢谢你的回复。我仍然不知道如何在我的代码中使用它。你能给我指一篇解释这一点的文章吗?或者你能更详细地解释一下吗?只需要谷歌对象数组。你会看到大量的文章详细地解释了如何访问其中的对象。
// structs
public MICRO_ROV_ADDRESS microRov_address = new MICRO_ROV_ADDRESS();
public MICRO_ROV_REGISTRY_DATA microRov_data = new MICRO_ROV_REGISTRY_DATA();
public MICRO_ROV_MESSAGE_HEADER microRov_msg_header = new MICRO_ROV_MESSAGE_HEADER();
public MICRO_ROV_STATUS_DATAINDEX microRov_dataindex = new MICRO_ROV_STATUS_DATAINDEX();
public SENSOR_DATA sensorData = new SENSOR_DATA();
//
microRov_data.ALL_DATA = new MICRO_ROV_MESSAGE_HEADER[255];
//
microRov_data.FunctionArray = new Dictionary<object, Func<int, double>>();
microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_ADDRESS] = controller_information.GetVersionNumber;
microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_SERIAL_NUMBER] = controller_information.GetSerialNumber;
microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_TEMPERATURE] = ntc_calc.findNTCTemp;
microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_VOLTAGE] = volt_calc.findVoltage;
//
sensorData.SENSORS_DATA = new MICRO_ROV_REGISTRY_DATA[255];
private void ProcessAllData(IPAddress ipAddress, int ListenPort, byte[] buffer)
{
try
{
// check if message length is ok.
if (buffer.Length == (byte)MICRO_ROV_STATUS_DATAINDEX.Packet_Length)
{
// calculate checksum of buffer
Int16 checksumBuffer = additiveChecksum.ComputeChecksumBytes(buffer, (byte)(buffer.Length - 1));
// update crc fields in buffer
microRov_msg_header.CHECKSUM = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Checksum];
// updata field containig info regarding crc validity
if (microRov_msg_header.CHECKSUM == checksumBuffer)
{
microRov_msg_header.LAST_RX = DateTime.Now;
microRov_msg_header.DESTINATION_ID = (ADRESSES)buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Destination];
microRov_msg_header.SOURCE_ID = (ADRESSES)buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Source];
microRov_msg_header.DATA_LENGTH = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.DataLength];
microRov_msg_header.REGISTER_ADDRESS = (MICRO_ROV_ADDRESS)buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Register];
//
microRov_msg_header.Data8bit_MSB = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Data_MSB];
microRov_msg_header.Data8bit_LSB = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Data_LSB];
//
microRov_msg_header.Data16bit = (byte)microRov_msg_header.Data8bit_MSB << 8 | (byte)microRov_msg_header.Data8bit_LSB;
// add data to its location in the array
microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS] = (MICRO_ROV_MESSAGE_HEADER)microRov_msg_header;
// calculate
microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS].DataCalculated = microRov_data.FunctionArray[(byte)microRov_msg_header.REGISTER_ADDRESS](microRov_msg_header.Data16bit);
MICRO_ROV_ADDRESS test = microRov_msg_header.REGISTER_ADDRESS;
//Type type = typeof(SENSOR_DATA);
//FieldInfo[] fields = type.GetFields();
//
//FieldInfo info = sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].GetType().GetField("BOARD_TEMPERATURE");
//FieldInfo info = sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].GetField("MaxValue");
//Console.WriteLine(info.ToString());
//info.SetValue(sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID], microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS]);
// save data by sensor number:
sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].BOARD_TEMPERATURE = microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS];
// save data by sensor number:
sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].microRov_msg_header.REGISTER_ADDRESS = microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS];
dataFromMicroRovProtocolCallback(ipAddress, ListenPort, buffer, microRov_data, StateMachines_Structs.ProtocolDataState.Data, microRov_msg_header.REGISTER_ADDRESS);
}
}
}
catch
{
}
}