我有这个功能
int array[FIXED_SIZE];
shuffle_array(array, FIXED_SIZE);
当我从
调用此函数时int *array = new int[dynamic_size];
shuffle_array(array, dynamic_size);
[...]
delete array;
一切都很顺利,我可以在合理的时间内根据预期检查改组 - 毕竟,它不是一个大的数组(< 1000元素)。
然而,当我从
调用该函数时int*& array
函数永远循环,没有明显的原因。我已经用调试工具检查了它,我不能说出失败的原因(部分是由于我的算法依赖于随机数)。
问题是,它不起作用...我尝试将数组作为std::vector<int>&
传递,我尝试使用random_shuffle
,我尝试使用{{1}}(但是大项目的结果并不让我高兴。
为什么会发生这种情况,我该怎么做才能解决这个问题?
答案 0 :(得分:3)
您的问题是{1}在您的第一个示例中未初始化。如果您使用的是Visual Studio调试模式,array
中的每个条目都将设置为全部0xCC(“已创建”)。这掩盖了你的实际问题(见下文)。
使用array
时,数组初始化为零。这会导致你的实际错误。
您的实际错误是,您尝试仅在阵列尚未包含该项目时添加新项目,并且每次都在查看整个数组,但是如果您的最后一个元素你的数组已经是一个有效值(比如0),你的循环永远不会终止,因为它总是在数组中找到0并且已经用完了所有其他数字。
要解决此问题,请将算法更改为仅查看已放入数组的值(即最多new int[dynamic_size]
)。
更改
i
到
for(j = 0; j < size; j++)
答案 1 :(得分:0)
我猜测问题在于数组的初始化方式和行:
r = mt_lrand() % size; // my RNG function
如果由于某种原因将动态分配的数组初始化为0
,则在填充数组的最后一个数字时,代码将始终获得堆栈。
我可以想到以下两种方法来克服这个问题:
您确保使用大于或等于array
的数字初始化size
。
int *array = new int[dynamic_size];
for ( int i = 0; i < dynnamic_size; ++i )
array[i] = size;
shuffle_array(array, dynamic_size);
您可以允许随机数介于1
和size
之间,而不是循环中的0
和size-1
之间。第二步,您可以从数组的每个元素中减去1
。
void shuffle_array(int* array, const int size){
int i, j, r;
bool in_list;
for(i = 0; i < size; i++){
in_list = 0;
// Make r to be betwen 1 and size
r = rand() % size + 1;
for(j = 0; j < size; j++)
if(array[j] == r){
in_list = 1;
break;
}
if(!in_list)
{
array[i] = r;
}
else
i--;
}
// Now decrement the elements of array by 1.
for(i = 0; i < size; i++){
--array[i];
// Debugging output
std::cout << "array[" << i << "] = " << array[i] << std::endl;
}
}
答案 2 :(得分:-1)
您正在将C代码与new和delete的C ++内存分配例程混合使用。而是坚持使用纯C并直接使用malloc / free。
int *array = malloc(dynamic_size * sizeof(int));
shuffle_array(array, dynamic_size);
[...]
free(array);
另外,如果您在C ++中使用new []运算符分配数组,请使用等效的delete []运算符来正确释放内存。在此处阅读更多内容 - http://www.cplusplus.com/reference/new/operator%20new[]/