2016-12-03 28 views
0

我目前正在开发一个项目,我们必须创建一个1000个元素的数组,然后将其传递给另一个函数进行排序。我在网上看到的所有东西都向你展示了如何将它从主要功能传递到另一个功能,但不是其他功能。努力将一个函数中创建的数组传递给排序函数

请看看我的代码,并帮助我从Array()通过Ar[1000]ISort最终主

#include <iostream> 
#include <time.h> 
using namespace std; 

void Array()//function to make array 
{ 
    int Ar[1000];//creating array  
    int i = 0;//random variable to be element #  
    int counter = 0;// counter variable  
    int randnum;//variable to old random number  
    srand(time(NULL));//seeding rand with time 

    while (counter != 1000)  
    {  
     randnum = rand();  
     Ar[i] = randnum;  
     cout << Ar[i]<<endl;  
     counter++; 
    }   
} 

void ISort(int Ar[1000])//Iterative sort 
{  
    int count = 0;//another counter variable  
    int count2 = 0;//counter variable # 3 because nested loops  
    int j=0;//Temp index # similar to i  
    int temp; //Temp variable to help switch elements  
    while (count != 1000) 
    { 
     if (Ar[count] < Ar[j]) 
     { 
      temp = Ar[count];  
      Ar[count] = Ar[j];  
      Ar[j] = temp; 
     }    
    } 
} 

/*void RSort(int Ar)//Recursive sort 
{ 

} 
*/ 

int main() 
{ 
    Array(); 
    ISort(); 
    system("Pause"); 
    return 0; 
} 
+0

函数'Array'中声明的数组是局部的,当执行离开函数时将消失。将数组传递给函数或使其成为全局函数。 –

+0

在'main'函数中,你没有将数组传递给'ISort'。你的编译器应该警告你这个。 –

+0

...或可能Array()函数返回一个数组而不是'void'(不返回) – Ripi2

回答

0

更改Array功能声明为:
int* Array()并使其返回数组Ar。并在mainArray得到返回值如下:
int* Ar = Array(); 并将它传递给函数ISort像这样:ISort(Ar);

以下是SO passing an array to a function的示例。

+0

传递数组的例子将是有益的。 –

+0

如果你将返回一个局部变量,那么它将导致UB。如果这个数组在这个函数中是静态的,或者它是动态分配的,它将会工作。 – marcinj

+0

我的答案有一个问题,可能会导致@marcinj提到的未定义行为,我建议你看看他的答案并接受它。对不起,祝你好运。 –

1

你的阵列int Ar[1000]一个Array()函数内部变量是一个局部变量。使它成为一个全局变量,通过移动它的功能范围:

int Ar[1000]; //creating array 
// your functions here 
int main() 
{ 
    Array(); 
    ISort(Ar); 
    return 0; 
} 

你也应该修改Array()函数接受数组作为参数,如下面的评论中指出。请注意,我省略了数组大小的部分,因为它似乎元素的个数设置为1000:

在这种情况下
void Array(int Ar[]){ 
    //... 
}; 

上面的代码将是:

int Ar[1000]; //creating array 
// your functions here 
int main() 
{ 
    Array(Ar); 
    ISort(Ar); 
    return 0; 
} 
+0

如果OP不改变'Array'函数将会有一个* shadow *副本;不好,很糟糕。 –

2

Array功能Ar将被破坏,一旦此功能完成后,你需要有一种方法来防止这种情况,一种方法是通过由参数数组,而不是使之发挥作用的局部变量:

void Array(int* Ar, int count)//function to make array 
{ 

我还要改变当前ISort定义:

void ISort(int* Ar, int acount)//Iterative sort 

其中acountAr元素的个数。这是因为您使用void ISort(int Ar[1000])还是void ISort(int* Ar)(有关更多信息,请参阅here)并无区别。如果你想保存数组类型,那么你必须通过引用来传递它:void ISort(int (&Ar)[1000])

最后改变main

int Ar[1000];//creating array 
    Array(Ar, 1000); 
    ISort(Ar, 1000); 
    system("Pause"); 
    return 0; 

工作的代码是在这里:http://coliru.stacked-crooked.com/a/678f581f802da85b

你也忘了增加count您的排序循环内。

0

最简单的办法是改变阵列功能位:

int* Array() { // change return type to be able to return array you create 
    int Ar[1000]; 
    for (int i = 0; i < 1000; i++) { // much better to use for loop than while 
     Ar[i] = rand(); // no need to hold another variable for random number 
     cout << Ar[i] << endl; 
    } 
    return Ar; // return the Ar 
} 

int main() { 
    int* array = Array(); 
    ISort(array); 
} 

希望有所帮助。还有很多其他的解决方案,但我不知道你的任务有什么确切的限制。如果你有任何问题随时问。

编辑:所以我完全忘了,C数组只是一个普通的老球...那好吧解决办法是这样的:

void Array(Ar[1000]& array) { // pass array to the function with reference 
    for (int i = 0; i < 1000; i++) { // much better to use for loop than while 
     array[i] = rand(); // no need to hold another variable for random number 
     cout << array[i] << endl; 
    } 
} 

int main() { 
    int[1000] array = Array(); 
    ISort(array); 
} 

很抱歉的错误,但用C风格的数组真的ISN在使用向量和地图时,在C++中通用。

+0

返回指向局部变量的指针将导致未定义的行为。 – marcinj