2016-04-07 7 views
-4

があるいつもインデックス0から配列を始めるべきですか?他にも立ち上げなければならない場合、どうすればいいですか?</p> <pre><code>for (i=min ; i<=max ; i++) b[i]=i; </code></pre> <p>しかし、私のコンパイラはエラーを示しています:私は私のCコードで書くべきかの問題については

||warning: command line option '-Wzero-as-null-pointer-constant' is valid for C++/ObjC++ but not for C [enabled by default]|
C:\Users\Amir Khasru\Desktop\counting_sort.c||In function 'main':|
C:\Users\Amir Khasru\Desktop\counting_sort.c|13|error: subscripted value is neither array nor pointer nor vector|
||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|

+1

通常、最初の要素はインデックス0なので、時には不便な場合もあります。その場合、配列1の要素を大きくする必要があります。 'int b [max]'合法的に 'b [max-1]'までしか索引付けできないので、配列をオーバーフローさせます。 –

+4

あなたの質問のタイトルは、あなたが得ているエラーと一致しません。問題は 'b'は配列ではないということです。 –

+3

それは異なります。循環バッファを使用しているときは、バッファに要素がないときは少し難しいので、1から始まります。私の仕事の他の部分とうまく整列します。これは、なぜあなたがArrayを使用しているかに依存しています。大部分のケースでは、ゼロから始める必要があります(メンテナンスプログラマーには、そうしないことを知らせてください)。 –

答えて

-1

あなたはいつものように変更し、あなたのforループでは0で開始する必要があります:

for (i=min ; i <max ; i++) b[i] = i; 
+0

ここであなたのコードVS opのコードの変更は何ですか? –

+0

@Am_I_Helpfulが 'i <= max'を' i

+0

おっと、申し訳ありません。しかし、最大と最小の値は標準のCのために縛られるべきであるので、それはまだ疑わしいです! –

-1

配列は、メンバー0 ... N-1とn個の要素の数(あなたのケースでmax)を有しているので、あなたが書く必要があります。

for (i=min ; i<max ; i++) b[i]=i; 

もちろん、途中で開始することもできます(例:min= max/2;)。

+1

'min'が10で' max'が20で、配列のサイズが11であれば(OPが十分だと思うかもしれませんが)、これはうまくいかず、本当に質問に答えません。 –

+0

@ Steve-summit、それは彼の問題です。すなわちそれを理解する。もちろん、0 <= minとmax

0

はい、Cの配列は0から始まります。常に。あなたはこれを支配しません。 0からmax-1i実行されることを

for(i = 0; i < max; i++) 
    ... do something with arr[i] ... 

注:

通常は、常にこのようになりますCで配列をループします。条件は<であり、<=ではありません。

アレイを1からNまで、または任意の最小値から任意の最大値まで考えてみたい場合は、さまざまな方法でそれをシミュレートできます。あなたは「あなた」の指標をループをすることができますし、それらを変換するために、ループ内の「本当の」配列インデックス:

int min = 10; 
int max = 20; 
int arr[11]; 

for(i = min; i <= max; i++) 
    printf("%d: %d\n", i, arr[i-min]); 

それとも、実際のインデックスをループとは、ループの中に独自にそれらを変換することができます

for(i = 0; i < N; i++) { 
    int myindex = i + min; 
    printf("%d: %d\n", myindex, arr[i]); 

しかし、このようなコードは、 "あなたの"インデックスと "本当の"インデックスの違いを常に把握しておく必要があるため、混乱する可能性があります。

もちろん、このすべてでは、使用している実際の最小値と最大値に配列のサイズが適切であるように注意する必要があります。そして "fencepost"エラーを覚えておいてください!最小値が10で最大値が20の場合は、10ではなく、11の配列が必要です。つまり、必要なサイズは通常max - min + 1です。

1ベースの配列をシミュレートしたい場合は、必要なサイズより1大きい値を割り当てて、セル0を廃棄します。

#define N 10 
int arr[N+1]; /* +1 so can make 1-based */ 

for(i = 1; i <= N; i++) 
    arr[i] = i; 

これは正常に動作しますが、それはそれは必要以上に1より大きな配列を割り当てることを忘れするのは簡単ですので、それはまた、やや危険な考えることができ、そしてあなたも、誰でしょう、あなたのコードの後に​​、読者を混乱させる可能性あなたのようなものを書いてみてください

for(i = 1; i <= N; i++) 

とsa y "いいえ!それは間違っている! for(i = 0; i < N; i++)

+0

例えば、maxは20ですが、配列のサイズは11です... –

関連する問題

 関連する問題