2016-12-03 32 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