0

私は次の構造を持っています

typedef struct DeviceInfo
{
    char[30] name;
    char[30] serial Number;

}DeviceInfo;

I am doing this    

DeviceInfo* m_DeviceInfo = new DeviceInfo[4];

// Populate m_DeviceInfo 

次に、サイズm_DeviceInfo を 6 に変更し、前の 4 つの値も保持したいと考えました。

C ++でそれを行う方法は?

4

8 に答える 8

3

1) 適合するサイズの新しい配列を作成し、古い配列のすべての要素を新しい配列にコピーします。

2)std::vector(私の推奨)を使用してください。

于 2011-12-14T08:56:31.957 に答える
3

適切な C++ の方法は、そのために適切なコンテナーを使用することです。どうやら、std::vectorコンテナーを使用する必要があります。

std::vector<DeviceInfo> m_DeviceInfo;
m_DeviceInfo.resize(4);

これには、 DeviceInfoにいくつかの制約が必要です。特に、引数のないコンストラクターと、コンストラクターをコピーする必要があります...

そして、あなたの質問は言い回しが悪いです。sizeof(DeviceInfo*)おそらく 32 ビット マシンでは 4 バイト、64 ビット マシンでは 8 バイトであることを変更しないでください。

于 2011-12-14T08:55:17.503 に答える
3

m_DeviceInfoDeviceInfo4 つの要素の配列を指します。配列のサイズ変更はありません。代わりに、削除して 6 つの要素で作成する必要があります。

DeviceInfo * m_DeviceInfo2 = new DeviceInfo[6]; 
memcopy( m_DeviceInfo,m_DeviceInfo2, 4 );
delete[] m_DeviceInfo;

ただし、ベクトルを使用する必要があります。

std::vector<DeviceInfo> m_DeviceInfo;
// or 
std::vector<std::shared_ptr<DeviceInfo>> m_DeviceInfo;

サイズを変更するには

m_DeviceInfo.resize(m_DeviceInfo.size()+ 2);
于 2011-12-14T08:58:27.737 に答える
3

問題には2つのオプションがあり、STLを使用するかどうかによって異なります。

typedef struct DeviceInfo
{
   char[30] name;
   char[30] serial Number;

} DeviceInfo;

STL の場合:

//requires vector.h
vector<DeviceInfo> m_deviceInfo;

DeviceInfo dummy;
dummy.name = "dummyName";
dummy.serialNumber = "1234"; 

m_deviceInfo.insert(m_deviceInfo.begin(), dummy); 
//add as many DeviceInfo instance you need the same way

または STL なし:

//implement this 
DeviceInfo* reallocArray(DeviceInfo* arr, int curItemNum, int newItemNumber)
{
   DeviceInfo* buf = new DeviceInfo[newItemNumber];

   for(int i = 0; i < curItemNum; i++)
     buf[i] = arr[i];

   for(int i = curItemNum; i < newItemNumber; i++)
     buf[i] = null;
}

//and in your main code
DeviceInfo m_DeviceInfo = new DeviceInfo[4];

m_DeviceInfo = reallocArray( m_DeviceInfo, 4, 6 );
于 2011-12-14T09:30:08.403 に答える
2

最善の解決策は、プログラムでvectorを使用することです。

このサイトを参照してください http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html#VECTOR

このサイトは、あなたの問題を解決するのに役立ちます。

ここでデータをプッシュできます。構造体のサイズを気にする必要はありません。

于 2011-12-14T08:58:31.310 に答える
1

構文が間違っています:

DeviceInfo m_DeviceInfo = new DeviceInfo[4];

次のようにする必要があります。

DeviceInfo* m_DeviceInfo = new DeviceInfo[4];

より良い代替手段は、 を使用することですstd::vector

std::vector<DeviceInfo> vec;

//populate:
DeviceInfo inf;
vec.push_back(inf);
vec.push_back(inf);
//....
于 2011-12-14T08:56:54.297 に答える
0

これを行う方法はいくつかありますが、C++ では realloc 関数を使用する必要があります。連続したメモリを再割り当てし、以前のメモリの値を新しいメモリにコピーします。例えば:

temp_DevInfo = (DeviceInfo*) realloc (m_DeviceInfo, (2) * sizeof(struct DeviceInfo));
free(m_DeviceInfo);
m_deviceInfo = temp_DevInfo;

2 * sizeof(DeviceInfo) を実行するのは、さらに 2 つ追加する必要があるためです。さらに前の 4 つが 6 であるため、前のオブジェクトを解放/削除する必要があります。最後に、割り当てたばかりの新しいオブジェクトを指すように古いポインターを設定します。

それが要点であるべき

realloc のドキュメントを見てください。

于 2011-12-14T09:00:21.593 に答える