2017-05-10 6 views
-1

私はシェルソートプログラムを実行していますが、関数に配列を渡すときに問題があります。配列を関数に渡す方法について調べましたが、まだ理解しません。私の関数に配列を渡すことができません

#include <iostream> 
#include <cmath> 
using namespace std; 

int shellsort(int arr[]){ 
    int gap = floor(sizeof(arr)/2); 
    for(int gap = floor(sizeof(arr)/2); gap < 0; gap=gap/2){ 
     for(int i = gap; i < sizeof(arr); i++){ 
      if(arr[i] < arr[i-gap]){ 
       int temp = arr[i]; 
       arr[i] = arr[i-gap]; 
       arr[i-gap] = temp; 
       if(gap == 1){ 
        if(arr[i-1] < arr[i-2]){ 
         int temp = arr[i-1]; 
         arr[i-1] = arr[i-2]; 
         arr[i-2] = temp; 
        } 
       } 
      } 
     } 
    } 
    return arr; 
} 


int main(){ 
    int numcount; 
    cin>>numcount; 
    int numbers[numcount]; 
    for(int i; i<numcount; i++){ 
     cin>>numbers[i]; 
    } 

    int numbers = shellsort(numbers); 
    cout<<numbers; 
} 
+2

あなたはいけない、少なくとも3つの事をやっています。 – LogicStuff

+3

'std :: vector'を使います。 – jotik

+0

'std :: vector'を使いたくない場合は、' int shellsort(int arr []) 'に配列の大きさ' int shellsort(int arr、size_t size) 'をとり、ポインタの崩壊 – doctorlove

答えて

0

問題は、あなたの関数の内部に、int arr[]の実際のサイズは知られておらず、そしてarrはしたがってポインタ、sizeof(arr) == sizeof(int*)に減衰することです。

私はあなたがstd::vectorを使用するようにコードを書き換える勧め:

#include <iostream> 
#include <cmath> 
#include <vector> 
using namespace std; 

std::vector<int> shellsort(std::vector<int> arr){ 
    int gap = floor(arr.size()/2); 
    for(int gap = floor(arr.size()/2); gap < 0; gap=gap/2){ 
     for(int i = gap; i < arr.size(); i++){ 
      // ...as before... 
     } 
    } 
    return arr; 
} 


int main(){ 
    int numcount; 
    cin>>numcount; 
    std::vector<int> numbers(numcount); 
    for(int i; i<numcount; i++){ 
     cin>>numbers[i]; 
    } 

    numbers = shellsort(numbers); 
    for (std::size_t i = 0u; i < numbers.size(); ++i) 
     cout<<numbers[i]; 
} 
1

は、あなたが戻ってくると約束しているとあなたが戻ってきた何に注意してください。

int shellsort(int arr[]){ 
    //.... 
    return arr;//<--- ****not an int**** 
} 

、変更ベクトルを使用するには、次のいずれかのサイズで

std::vector<int> shellsort(std::vector<int> arr){ 
    int gap = floor(arr.size()/2); 
    for(int gap = floor(arr.size()/2); gap < 0; gap=gap/2){ 
     //as above 
    } 
    return arr; 
} 

または送信

int * shellsort(int * arr, size_t size){ 
    int gap = floor(size/2); 
    for(int gap = floor(size/2); gap < 0; gap=gap/2){ 
     //as above 
    } 
    return arr; 
} 
関連する問題