2016-03-29 7 views
0

私は以下に示す非常に簡単なプログラムを持っています。私はcoutを挿入して、どの行が実行されるかを知っています。プログラムがループに突き当たった

int main(void) { 
    int n_in = 0; 
    int keys = 0; 
    cin>>n_in; 
    long long in_array[n_in]; 

    for(int i=0; i<n_in; i++){ 
    cin>>in_array[i]; 
    } 
    cout<<"Executed"; 
    cin>>keys; 
    cout<<"Executed"<<" "<<keys; 
    int index[keys]; 
    long long key_array[keys]; 
    cout<<"Executed"; 
    for(int j=0; j<keys; j++){ 
    cin>>key_array[j]; 
    cout<<"Iteration" <<j<<"complete" ; 
    } 
    cout<<"Executed"; 
    //bin_search(in_array, n_in, key_array, keys, index); 

    for(int i=0; i<keys; i++){ 
    cout<<index[i]<<" " ; 
    } 
    return 0; 

} 

スクリーンショットが与えられます。

enter image description here

あなたがイメージから見ることができるように、最後の反復が完了したことがないと私は理由を知りません。 iteration0complete以降の数字は入力です。

誰かが何が起きているのか説明できますか?

+0

http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Biffen

+4

技術的には、C++には[可変長配列]がないため、コードは有効ではありません( http://en.wikipedia.org/wiki/Variable-length_array)。これは、コンパイラの拡張機能のために移植性があり、代わりに['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)を使うべきです。 –

+0

@silflowいいえ、技術的には規格に準拠していません。コンパイラの拡張が必要です。しかし、UBではありません。 – juanchopanza

答えて

1

ここでは、私が使用したコメントvectors instaedのarraysに記載されているように、あなたのコードを修正したバージョンです。コンパイラのコンパイル時に配列の宣言とは反対に、配列のサイズを知っている必要がありますが、配列を定義し、コンパイル時には定数ではないサイズを与えます。配列番号index[]を使用するコードの部分には、なぜ何を印刷しているのか分からないのでコメントしました配列は空ですが、あなたが宣言したものは何も持っていません。

ここはあなたのニーズを満たすためのコードです。

#include<string> 
#include<vector> 
#include<iostream> 



using namespace std; 


int main(){ 


    int n_in = 0; 
    int keys = 0; 
    cin>>n_in; 
    vector<long long> in_array; 

    for(int i=0; i<n_in; i++){ 
     int k =0; 
     cin >> k; 

    in_array.push_back(k); 
    } 
    cout<<"Executed"; 
    cin>>keys; 
    cout<<"Executed"<<" "<<keys; 

    vector<int> index; 
    vector<long long> key_array; 
    cout<<"Executed"; 

    for(int j=0; j<keys; j++){ 
     int p =0; 

    cin>>p ; 
     key_array.push_back(p); 
    cout<<"Iteration" <<j<<"complete" ; 
    } 
    cout<<"Executed"; 
    //bin_search(in_array, n_in, key_array, keys, index); 

    /*for(int i=0; i<keys; i++){ 
     int m =0; 

    cout<<index[i]<<" " ; 
    } 
*/ 

    return 0; 
} 

編集:あなたがコメントで言っ はCで真であるが、コンパイラは、コンパイル、配列の正確なサイズを持っている必要があり、C++でそうでなければ、new演算子を使用する必要があります動的にメモリを割り当てます。例えば

int MyArray[5]; // correct 

または

const int ARRAY_SIZE = 6; 
int MyArray[ARRAY_SIZE]; // correct 

しかし

int ArraySize = 5; 
int MyArray[ArraySize]; // incorrect 

それをまとめると:

電子の数配列の値は、定数式でなければなりません。変数の境界が必要な場合は、ベクトルを使用します。

+0

(http://stackoverflow.com/questions/1107705/systempause-why-is-it-wrong) – Biffen

+0

私のコンソールがポップアップしてすぐに動くので、私はそれを使用しますが、情報 – Mourad

+0

@Mouradに感謝します。私はそれを感謝しますが、コードを自分で構築したいと思っていました。私が理解しなかったことが1つあります。あなたは配列のサイズはコンパイル時に一定でなければならないと言った。私はCでこれをやってきて、いつも働いていました。ここでも、 "in_array"である最初の配列はそのように定義され、動作します。これを説明できますか? –

関連する問題