2016-08-21 4 views
0

私は文字列とintの配列を扱うコードに取り組んでいます。int配列の並べ替えは、配列の内容を変更します

これはコンパイルしてOKを実行しますが、配列の内容は変更されます。

コードは、最も大きな数字である主な結果を示します。 しかし、ソート処理後、配列の内容が表示され、要素の1つが0に変更されます。 これはなぜですか?

よろしく、

あなたは[] 5であるARR2の合計要素を見ることができますが、あなたがしようとしている i=4,cr=4,ps=5の.asなりループ値のための最後のステップの実行中にあなたのコードを実行して乾燥状態
#include<stdio.h> 
#include<string.h> 
#include<stdint.h> 

int main() 
{ 

static uint8_t arr2[]={5,100,-2,75,42},cr=0,ps=1,temp=0; 
uint8_t i; 

for (i=0;i<sizeof(arr2);i++) 
{ 
    printf("1stloop[%d]\n",i); 
    if (arr2[cr]>arr2[ps]) 
    { 
     printf("before change1 cr %d ps %d\n",arr2[cr],arr2[ps]); 
     temp=arr2[cr]; 
     arr2[cr]=arr2[ps]; 
     arr2[ps]=temp; 
     printf("change1  cr %d ps %d\n\n",arr2[cr],arr2[ps]); 

     if (arr2[cr-1]>arr2[ps-1]) 
     { 
      printf("before change2 cr %d ps %d\n",arr2[cr-1],arr2[ps-1]); 
      temp=arr2[cr-1]; 
      arr2[cr-1]=arr2[ps-1]; 
      arr2[ps-1]=temp; 
      printf("change2  cr %d ps %d\n\n",arr2[cr-1],arr2[ps-1]); 
     } 
    } 
    cr++; ps++; 
} 
    for (i=0;i<sizeof(arr2);i++) 
{ 
    printf("contents %d \n",arr2[i]); 
} 
printf("\nLargest No. in arr2 of arr2 is %d \n",(arr2[sizeof(arr2)])); 
return 0; 
} 
+0

cr == 0のときにarr2 [cr-1]を使用しています。インデックス-1はあなたの配列の外にあります。また、ps == sizeof(arr2)== 5のときarr2 [ps]を使用しています。インデックス5も配列外です。最後に印刷する最大の数は、配列の外側のインデックス5からです。最大の数字をここに、つまり配列の外側に入れ替えた場合、ゼロになったガベージを配列に入れ替えました。 –

+0

デバッガを使用してコードをステップ実行し、実際に何が起こっているかを確認します。 – alk

+0

ありがとう、私はprintf( "OK")を追加します。どこに問題があるかを知るためにループを作成します。これは実際にはループカウンタに関するもので、現在は動作しています。 –

答えて

1

5番目の要素と6番目の要素を比較して、6番目の要素を0とみなし、ロジックに従って実行します。

forループ条件では、変更を加えることができます。代わりに、このfor (i=0;i<sizeof(arr2);i++)


あなたはこのfor (i=0;i<sizeof(arr2) && ps<sizeof(arr2);i++)を試すことができます。


それはunsigned char型であり、これは、要素の入力をarray.Butのエントリを変更しないであろう「-2」「254」とみなされます。

+0

私はこのコードを実行し、それは正常に動作します!静的int8_t arr2 [] = {5,100、-2,75,42}、cr = 0、ps = 1、temp = 0; \t uint8_t i、cnt = sizeof(arr2); \t \t printf( "配列の前に:\ n"); (i = 0; i

関連する問題