函数调用后头文件导致原数组出现问题
Header file causes problems with the original array after function call
我创建了一个名为 primes.h 的头文件
我想要的是调用此头文件中定义的函数 generate_primes() 以用确定数量的素数填充数组。
因此,为了测试是否一切正常,我首先打印了来自 'inside' 头文件的数组元素,它工作正常。然后我尝试从头文件外部打印它们,在包含头文件的程序中但它不起作用,并且程序在打印一些元素后就停止了。
为什么这是不当行为?我怎样才能以正确的方式做到这一点。
谢谢你的帮助。
头文件:
int generate_primes(const unsigned long long n, unsigned long long*prime)
{
try
{
prime = new unsigned long long[n];
}
catch(const std::bad_alloc&e) {
std::cerr << e.what();
exit(EXIT_FAILURE);
}
prime[0] = 2, prime[1] = 3, prime[2] = 5;
unsigned long long p;
unsigned long long index = 3;
for (p = 7; index < n; p += 2)
{
short isPrime = 1;
unsigned long long test_limit = (unsigned long long) sqrt(p);
for (int i = 1; prime[i] <= test_limit && i < index; i++)
{
if (!(p%prime[i]))
{
isPrime = 0;
break;
}
}
if (isPrime) prime[index++] = p;
}
//everything works fine when I print from inside the header file
/*for (int i = 0; i < n; i++)
{
if (i && i % 7 == 0) std::cout << '\n';
std::cout << prime[i] << "\t\t";
}
*/
return 1;
}
我的程序:
#include <iostream>
#include <cmath>
#include <vector>
#include <new>
#include <cstdlib>
#include "primes.h"
int main(){
unsigned long long n = 100;//example
unsigned long long *prime;
generate_primes(n, prime);
//but printing from here causes problems
//isn't the array now filled after calling the above function ?
for (unsigned long long i = 0; i < n; i++)
{
if (i && i % 5 == 0) std::cout<< '\n';
std::cout << prime[i] << "\t";
}
return 0;
}
那不是头文件,是一堆代码。如果您想分离该代码,它应该在另一个 .cpp
文件中。
关联的 .h
将如下所示:
#include <cmath>
#include <vector>
#include <new>
int generate_primes(const unsigned long long n, unsigned long long*prime);
然后你会得到 generate_primes.cpp
或类似的东西:
#include "generate_primes.h"
int generate_primes(const unsigned long long n, unsigned long long*prime) {
// (function body)
}
要构建您的应用程序,您需要同时编译 .cpp
文件和 link 它们以及所需的库。
问题是参数 prime
是按值传递的,而不是按引用传递的。所以当 generate_prime
赋值时:
prime = new unsigned long long[n];
这只赋值给局部变量prime
,而不是调用者的变量。您需要通过引用传递参数,以便分配对 main()
.
可见
int generate_primes(const unsigned long long n, unsigned long long*&prime)
未初始化指针质数的值是 generate_primes 调用的参数。在那里它没有被评估,但参数分配了一个新的(本地)值。因此在方法内部可以访问数组。但是新值永远不会 returned,所以主要是 prime 的值保持不变。
此外,为了编译器,您应该将 n 从 unsingned long long 更改为更小的类型。
两种可能的解决方案:
a) 修改 generate_prime 使其 return 数组的地址
unsigned long long *prime generate_primes(const unsigned long n)
b) 将指针的地址作为参数传递给方法
int generate_primes(const unsigned long n, unsigned long long **prime)
{
try
{
*prime = new unsigned long long[n];
} catch (const std::bad_alloc &e) {
// your code
和
int main(){
unsigned long n = 100;//example
unsigned long long *prime;
generate_primes(n, &prime);
// your Code
delete[] prime; // free memeory
return 0;
}
我创建了一个名为 primes.h 的头文件 我想要的是调用此头文件中定义的函数 generate_primes() 以用确定数量的素数填充数组。 因此,为了测试是否一切正常,我首先打印了来自 'inside' 头文件的数组元素,它工作正常。然后我尝试从头文件外部打印它们,在包含头文件的程序中但它不起作用,并且程序在打印一些元素后就停止了。 为什么这是不当行为?我怎样才能以正确的方式做到这一点。 谢谢你的帮助。
头文件:
int generate_primes(const unsigned long long n, unsigned long long*prime)
{
try
{
prime = new unsigned long long[n];
}
catch(const std::bad_alloc&e) {
std::cerr << e.what();
exit(EXIT_FAILURE);
}
prime[0] = 2, prime[1] = 3, prime[2] = 5;
unsigned long long p;
unsigned long long index = 3;
for (p = 7; index < n; p += 2)
{
short isPrime = 1;
unsigned long long test_limit = (unsigned long long) sqrt(p);
for (int i = 1; prime[i] <= test_limit && i < index; i++)
{
if (!(p%prime[i]))
{
isPrime = 0;
break;
}
}
if (isPrime) prime[index++] = p;
}
//everything works fine when I print from inside the header file
/*for (int i = 0; i < n; i++)
{
if (i && i % 7 == 0) std::cout << '\n';
std::cout << prime[i] << "\t\t";
}
*/
return 1;
}
我的程序:
#include <iostream>
#include <cmath>
#include <vector>
#include <new>
#include <cstdlib>
#include "primes.h"
int main(){
unsigned long long n = 100;//example
unsigned long long *prime;
generate_primes(n, prime);
//but printing from here causes problems
//isn't the array now filled after calling the above function ?
for (unsigned long long i = 0; i < n; i++)
{
if (i && i % 5 == 0) std::cout<< '\n';
std::cout << prime[i] << "\t";
}
return 0;
}
那不是头文件,是一堆代码。如果您想分离该代码,它应该在另一个 .cpp
文件中。
关联的 .h
将如下所示:
#include <cmath>
#include <vector>
#include <new>
int generate_primes(const unsigned long long n, unsigned long long*prime);
然后你会得到 generate_primes.cpp
或类似的东西:
#include "generate_primes.h"
int generate_primes(const unsigned long long n, unsigned long long*prime) {
// (function body)
}
要构建您的应用程序,您需要同时编译 .cpp
文件和 link 它们以及所需的库。
问题是参数 prime
是按值传递的,而不是按引用传递的。所以当 generate_prime
赋值时:
prime = new unsigned long long[n];
这只赋值给局部变量prime
,而不是调用者的变量。您需要通过引用传递参数,以便分配对 main()
.
int generate_primes(const unsigned long long n, unsigned long long*&prime)
未初始化指针质数的值是 generate_primes 调用的参数。在那里它没有被评估,但参数分配了一个新的(本地)值。因此在方法内部可以访问数组。但是新值永远不会 returned,所以主要是 prime 的值保持不变。
此外,为了编译器,您应该将 n 从 unsingned long long 更改为更小的类型。
两种可能的解决方案: a) 修改 generate_prime 使其 return 数组的地址
unsigned long long *prime generate_primes(const unsigned long n)
b) 将指针的地址作为参数传递给方法
int generate_primes(const unsigned long n, unsigned long long **prime)
{
try
{
*prime = new unsigned long long[n];
} catch (const std::bad_alloc &e) {
// your code
和
int main(){
unsigned long n = 100;//example
unsigned long long *prime;
generate_primes(n, &prime);
// your Code
delete[] prime; // free memeory
return 0;
}