0

変なタイトルで申し訳ありませんが、それを表現する方法を理解できませんでした:)最近C#に移行し、現在構造体に取り組んでいます。私は基本的に C++ 開発者であり、C++ コードで次のことを行いました。

typedef struct 
{
String ChannelName;
bool available;
} Voltage_Channel;

Voltage_Channel *m_voltageChannels;

Voltage_Channel redhookChannels[6] = {
{"", false},
{"VDD_IO_AUD",  true},
{"VDD_CODEC_AUD",true},
{"VDD_DAL_AUD", true},
{"VDD_DPD_AUD",  true},
{"VDD_PLL_AUD", true}   
};

if(m_boardName->compareIgnoreCase("S1010012") == 0) //m_BoardName is string
{   
    m_voltageChannels = redhookChannels;
}

私のC#アプリケーションでこれを行う必要があります。私は次のように試しましたが、何かが間違っています:

struct VoltageBoardChannel
    {
        public string ChannelName;
        public bool available;            
    };

VoltageBoardChannel[] mVoltageStruct; 

VoltageBoardChannel[] redhookChannels = new VoltageBoardChannel[6]
    {
        new VoltageBoardChannel() { ChannelName = "", available = false},
        new VoltageBoardChannel() { ChannelName = "VDD_IO_AUD", available = true},
        new VoltageBoardChannel() { ChannelName = "VDD_CODEC_AUD", available = true},
        new VoltageBoardChannel() { ChannelName = "VDD_DAL_AUD", available = true},
        new VoltageBoardChannel() { ChannelName = "VDD_DPD_AUD", available = true},
        new VoltageBoardChannel() { ChannelName = "VDD_PLL_AUD", available = true}            
    };

string redhookboardname = "S1010012";
string redhookboardnameCase = "s1010012";

if (redhookboardnameCase.Equals(redhookboardname, stringComparison.InvariantCultureIgnoreCase))
        {
            mVoltageStruct = redhookChannels;
        }

私はどこで間違いを犯していますか?:(

4

2 に答える 2

1

必要なのは、オブジェクトではなく、配列mVoltageStructとして宣言することだけです。

  VoltageBoardChannel[] mVoltageStruct;

次に、以下を割り当てることができます。

 if (redhookboardnameCase.Equals(redhookboardname, StringComparison.InvariantCultureIgnoreCase))
 {
       mVoltageStruct = redhookChannels;
 }
于 2012-10-12T06:07:17.767 に答える
1

mVoltageStructは個別値です。redhookChannels配列です。配列を値に割り当てることはできません。ただし、配列内をのぞくことができます。

mVoltageStruct = redhookChannels[0]; // copy the item with index 0, zero-based

ただし、を使用する特定の理由 (P/Invoke など) がない限り、そこでクラスの使用を検討するstructことをお勧めします。可変構造体は通常、多くの混乱を引き起こします。C# では、C/C++structと同じ意味ではありません。struct

mVoltageStruct = redhookChannels[0]; 行がコピー操作であることにも注意してください。mVoltageStructそれがゼロ番目の項目への参照/ポインタであることを意味するものではありません。C# でこれを行う方法はいくつかありますが、 class;を使用していればはるかに簡単です。その場合、参照値のみをコピーします。


コメントごとに編集:

using System;
using System.Collections.Generic;
class VoltageBoardChannel
{
    public string ChannelName { get; set; }
    public bool IsAvailable { get; set; }
}
static class Program {
    static void Main()
    {
        List<VoltageBoardChannel> selectedChannels = null;

        List <VoltageBoardChannel> redhookChannels = new List<VoltageBoardChannel>
        {
            new VoltageBoardChannel { ChannelName = "", IsAvailable = false},
            new VoltageBoardChannel { ChannelName = "VDD_IO_AUD", IsAvailable = true},
            new VoltageBoardChannel { ChannelName = "VDD_CODEC_AUD", IsAvailable = true},
            new VoltageBoardChannel { ChannelName = "VDD_DAL_AUD", IsAvailable = true},
            new VoltageBoardChannel { ChannelName = "VDD_DPD_AUD", IsAvailable = true},
            new VoltageBoardChannel { ChannelName = "VDD_PLL_AUD", IsAvailable = true}            
        };

        string redhookboardname = "S1010012";
        string redhookboardnameCase = "s1010012";

        // string.Equals(a,b,...) rather than a.Equals(b, ...) avoids
        // potential issues when "a" is null
        if (string.Equals(redhookboardnameCase, redhookboardname,
            StringComparison.InvariantCultureIgnoreCase))
        {
            // set selectedChannels to the **same** list:
            selectedChannels = redhookChannels;

            // or if we wanted a filtered list (same VoltageBoardChannel
            // objects, but a different list instance)
            selectedChannels = redhookChannels.FindAll(x => x.IsAvailable);
        }
    }
}
于 2012-10-12T06:04:07.257 に答える