![](/img/trans.png)
[英]how do i change values of a global struct inside main/another function in c?
[英]How do I change this array inside the function?
此代码适用于 CS 235 class,但我是 C++ 的新手,我不知道他们希望我如何执行此操作。 grow function 的工作原理是接收一个数组并将其更改为两倍大。 来自 python,我想这相当于改变数组? 无论如何,我不能让它对插入 function 做同样的事情。我需要它来检查我们试图插入一个项目的 position 是否在数组边界之外,并使数组足够大以便它可以插入价值。 一切正常....在 function 内。数组不维护 function 之外的更改。我尝试将它作为指针传递,作为(对指针的引用?)像 *&array,基本上任何组合我可以想到。
void grow(int *&original_array, unsigned int & capacity){
int *temp = new int[capacity * 2];
for (int i=0; i<capacity*2; i++){
temp[i] = 0;
}
std::cout << "line 18: ";
print_array(temp, capacity*2);
for(int i=0; i<capacity; i++){
temp[i] = original_array[i];
}
std::cout << "line 23: ";
print_array(temp, capacity*2);
// delete[] original_array;
original_array = temp;
std::cout << "line 27: ";
print_array(original_array, capacity * 2);
capacity = capacity * 2;
}
bool insert (int array[], unsigned int & maxSize, unsigned int & nFilled, unsigned int pos, int value){
while (maxSize < pos){
grow(array, maxSize);
print_array(array, maxSize);
}
for(unsigned int i = nFilled - 1; i >= pos; i = i-1){
array[i+1] = array[i];
}
array[pos] = value;
print_array(array, maxSize);
return true;
}
这是一些示例输入以及我的程序现在输出的内容:
int main() {
unsigned int my_size = 4;
int new_array[4] = {1,2,3,4};
unsigned int nFilled = 4;
insert(new_array, my_size, nFilled, 5, 15);
print_array(new_array, my_size);
return 0;
}
Output:
line 18: {0, 0, 0, 0, 0, 0, 0, 0}
line 23: {1, 2, 3, 4, 0, 0, 0, 0}
line 27: {1, 2, 3, 4, 0, 0, 0, 0}
{1, 2, 3, 4, 0, 0, 0, 0}
{1, 2, 3, 4, 0, 15, 0, 0}
{1, 2, 3, 4, -152629248, 32758, 0, 8}
倒数第二行在 function 内部,最后一行在 function 外部。我需要它们相同
任何帮助表示赞赏 - 助教和教授都没有帮助
谢谢
您的代码按照编写的方式工作有两个问题,第一个是您无法按照编写的方式在 main 中重新分配new_array
的值。 如所写,它不是动态分配的,因此无法更改。 您需要将其更改为动态分配:
int* new_array = new int[4];
for(int x = 0; x < 4; ++x)
{
new_array[x] = x + 1;
}
这将解决一个问题,但代码仍然无法正常工作,这与变量如何传递给insert
和grow
有关。
您的grow()
function 采用int*&
指向指向 integer 的指针的引用。这意味着传入的基础值可以更改。 但是,您的insert()
function 采用int[]
一个 integer 数组,该数组衰减为指向 integer 的指针,并且此处的更改不会反映在insert()
的调用站点。
您可以通过添加更多调试语句来验证这一点:
bool insert (int array[],
unsigned int & maxSize,
unsigned int & nFilled,
unsigned int pos,
int value)
{
// unchanged above...
std::cout << "Inside insert: " << array << '\n';
return true;
}
int main()
{
// unchanged above...
std::cout << "After insert: " << new_array << "\n";
print_array(new_array, my_size);
return 0;
}
您将获得类似于此的 output:
line 18: {0 0 0 0 0 0 0 0 }
line 23: {1 2 3 4 0 0 0 0 }
line 27: {1 2 3 4 0 0 0 0 }
{1 2 3 4 0 0 0 0 }
{1 2 3 4 0 15 0 0 }
Inside insert: 0x548ed0
After insert: 0x548eb0
{1 2 3 4 0 0 49 0 }
请注意数组“Inside insert”和“After insert”是不同的。
要解决此问题,您需要确保将某些内容传递给insert()
以允许更改值,类似于对grow()
所做的操作。
该更改就像更改insert()
的签名一样简单,如下所示:
bool insert (int *&array,
unsigned int & maxSize,
unsigned int & nFilled,
unsigned int pos,
int value)
请注意, insert()
的第一个参数已更改为匹配grow()
中指向 integer 的指针的类型。现在,当我们将指针new_array
传递给insert()
时,将传递对该指针的引用(这允许值是改变了),并且它也被传递给grow()
(如果需要),允许它一直传播到调用站点。
请注意,尽管这种方法存在风格问题——所有权语义不明确、memory 泄漏的可能性(出现在发布的代码中)等。
我还要警告“重新发明”这种类型的数据结构而不是使用std::vector
不是一个好的做法,但是它在教学环境中确实有其用途。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.