函数调用后,头文件导致原始数组出现问题

时间:2017-07-12 19:42:07

标签: c++ arrays header-files

我创建了一个名为primes.h的头文件 我想要的是调用此头文件中定义的函数generate_primes()来填充具有确定数量的素数的数组。 因此,为了测试一切是否正常,我首先从头部文件'内部'打印出数组元素,这样可以正常工作。然后我尝试从头文件外部打印它们,在包含头文件的程序中但是它不起作用,程序在打印几个元素后就停止了。 为什么这种行为不合适?我怎样才能以正确的方式做到这一点。 谢谢你的帮助。

标题文件:

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; 
}

3 个答案:

答案 0 :(得分:2)

问题是参数prime是按值传递的,而不是通过引用传递的。所以当generate_prime分配时:

prime = new unsigned long long[n];

这只分配给局部变量prime,而不是调用者的变量。您需要通过引用传递参数,以便main()可以看到作业。

int generate_primes(const unsigned long long n, unsigned long long*&prime) 

答案 1 :(得分: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文件并将它们与所需的库链接在一起。

答案 2 :(得分:0)

未初始化指针素数的值是generate_primes调用的参数。在那里它没有被评估,但参数分配了一个新的(本地)值。因此,在方法内部,Array是可访问的。但是新值永远不会返回,所以在主要情况下,素数值保持不变。

此外,为了编译器,您应该将n从未加工的long long更改为较小的类型。

两种可能的解决方案: a)修改generate_prime,使其返回数组的地址

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; 
}