我目前正在处理一项任务,您应该从文件中读取球体。来自文件的典型输入可能如下所示:“0.182361 -0.017057 0.129582 0.001816”。表示 x、y 和 z 坐标加上球体半径。在阅读文件时,我正在使用我自己的方法:“AddSphere”,它将一个球体添加到一个数组中。
void Array::AddSphere(MySphere inp)
{
if (length == 10000 || length == 200000 || length == 30000)
{
ResizeBuffer();
}
this->length++;
*arr = inp;
arr++;
//this->length++;
}
“Array”类应该像所有球体的持有者,并且包含指向当前元素的变量“arr”。
class Array
{
public :
int length;
void AddSphere(MySphere inp);
int arrLength();
void RemoveAt(int pos);
void AddFromFile();
MySphere * Buffer;
void CreatenewBuffer();
private:
MySphere * arr;
public:Array()
{
Buffer = new MySphere[10000];
arr = Buffer;
length = 0;
}
~Array()
{
delete[] arr;
delete[] Buffer;
}
};
它还包含指向“arr”中第一个元素的“Buffer”。那么现在我的问题是什么?问题是我希望能够在“长度”等于指定值时动态增加缓冲区的大小。假设我的文件包含 15000 个元素。然后我需要增加缓冲区大小以便能够在数组上具有正确的长度。使用 ResizeBuffer() 我尝试这样做。
void Array::ResizeBuffer()
{
MySphere * tempBuff = new MySphere[length+10000];
memcpy(tempBuff, Buffer, sizeof((MySphere)*Buffer));
this->Buffer = new MySphere[length+10000];
arr = Buffer;
memcpy(Buffer, tempBuff, sizeof((MySphere)*tempBuff));
//int a = 0;
}
但由于某种原因,我只得到了输出中的最后 5000 个元素,而不是全部 15000 个。我认为这与 arr 的指针没有指向整个缓冲区有关,但我的尝试都没有奏效。那么为什么会这样呢?
感谢您的时间!