回答編集履歴
10
回答の不備修正(SaitoAtsushiさんのコメントを参照)
    
        answer	
    CHANGED
    
    | @@ -1,9 +1,10 @@ | |
| 1 1 | 
             
            記載していただいてコードでは
         | 
| 2 2 | 
             
            charポインタを引数とするary_copy関数にintポインタを
         | 
| 3 3 | 
             
            代入しようとしている部分と
         | 
| 4 | 
            -
            引数の型と変数名の間にスペースがないのでコンパイルエラーとなってしまいます。
         | 
| 4 | 
            +
            ~~引数の型と変数名の間にスペースがないのでコンパイルエラーとなってしまいます。~~
         | 
| 5 5 | 
             
            あとプロトタイプ宣言の部分では仮引数名は必要ないので書かなくても構わないかと思われます。
         | 
| 6 6 |  | 
| 7 | 
            +
             | 
| 7 8 | 
             
            ```diff
         | 
| 8 9 | 
             
            #include <stdio.h>
         | 
| 9 10 |  | 
| @@ -11,7 +12,7 @@ | |
| 11 12 | 
             
            +void ary_copy(int*, int*, int);
         | 
| 12 13 |  | 
| 13 14 | 
             
            -void ary_copy(char*d, char*s, int t) 
         | 
| 14 | 
            -
            +void ary_copy(int* | 
| 15 | 
            +
            +void ary_copy(int*d, int*s, int t) 
         | 
| 15 16 | 
             
            {
         | 
| 16 17 | 
             
                int i;
         | 
| 17 18 |  | 
| @@ -40,7 +41,8 @@ | |
| 40 41 | 
             
            静的配列の要素数は"配列全体のバイト数/配列一つ分のバイト数"で取得できるので
         | 
| 41 42 | 
             
            今回の場合バイト数を取得するための演算子sizeofを用いて
         | 
| 42 43 | 
             
            sizeof(array1)/sizeof(array1[0])で要素数を取得できますので
         | 
| 44 | 
            +
            上記を踏まえればC99以降(下記SaitoAtsushiさんのコメントを参照)
         | 
| 43 | 
            -
             | 
| 45 | 
            +
            がコンパイルできる処理系でしかコンパイルできませんが
         | 
| 44 46 | 
             
            下記コードのように書けばよいのではないでしょうか。
         | 
| 45 47 |  | 
| 46 48 | 
             
            ```c
         | 
9
constつけ忘れ修正
    
        answer	
    CHANGED
    
    | @@ -54,7 +54,7 @@ | |
| 54 54 | 
             
            int main(void)
         | 
| 55 55 | 
             
            {
         | 
| 56 56 | 
             
                int array1[] = {1, 2, 3, 4, 5};
         | 
| 57 | 
            -
                unsigned size = sizeof(array1)/sizeof(array1[0]);
         | 
| 57 | 
            +
                const unsigned size = sizeof(array1)/sizeof(array1[0]);
         | 
| 58 58 | 
             
                int array2[size];                    
         | 
| 59 59 |  | 
| 60 60 | 
             
                ary_copy(array1, array2, size);
         | 
8
インクリメント部分修正
    
        answer	
    CHANGED
    
    | @@ -59,7 +59,7 @@ | |
| 59 59 |  | 
| 60 60 | 
             
                ary_copy(array1, array2, size);
         | 
| 61 61 |  | 
| 62 | 
            -
                for(unsigned j = 0; j < size;  | 
| 62 | 
            +
                for(unsigned j = 0; j < size; ++j) printf("%d ", array2[j]);
         | 
| 63 63 |  | 
| 64 64 | 
             
                return 0;
         | 
| 65 65 | 
             
            }
         | 
7
回答文修正
    
        answer	
    CHANGED
    
    | @@ -2,7 +2,7 @@ | |
| 2 2 | 
             
            charポインタを引数とするary_copy関数にintポインタを
         | 
| 3 3 | 
             
            代入しようとしている部分と
         | 
| 4 4 | 
             
            引数の型と変数名の間にスペースがないのでコンパイルエラーとなってしまいます。
         | 
| 5 | 
            -
            あとプロトタイプ宣言の部分では引数 | 
| 5 | 
            +
            あとプロトタイプ宣言の部分では仮引数名は必要ないので書かなくても構わないかと思われます。
         | 
| 6 6 |  | 
| 7 7 | 
             
            ```diff
         | 
| 8 8 | 
             
            #include <stdio.h>
         | 
6
コード簡略化
    
        answer	
    CHANGED
    
    | @@ -46,29 +46,21 @@ | |
| 46 46 | 
             
            ```c
         | 
| 47 47 | 
             
            #include <stdio.h>
         | 
| 48 48 |  | 
| 49 | 
            -
            void ary_copy(int* d, int* s,  | 
| 49 | 
            +
            void ary_copy(const int* const d, int* const s, const unsigned t) 
         | 
| 50 50 | 
             
            {
         | 
| 51 | 
            -
                int i;
         | 
| 52 | 
            -
             | 
| 53 | 
            -
                for(i = 0; i < t;  | 
| 51 | 
            +
                for(unsigned i = 0; i < t; ++i) s[i] = d[i];
         | 
| 54 | 
            -
                {
         | 
| 55 | 
            -
                    s[i] = d[i]; 
         | 
| 56 | 
            -
                }
         | 
| 57 52 | 
             
            }
         | 
| 58 53 |  | 
| 59 54 | 
             
            int main(void)
         | 
| 60 55 | 
             
            {
         | 
| 61 56 | 
             
                int array1[] = {1, 2, 3, 4, 5};
         | 
| 62 57 | 
             
                unsigned size = sizeof(array1)/sizeof(array1[0]);
         | 
| 63 | 
            -
                
         | 
| 64 58 | 
             
                int array2[size];                    
         | 
| 65 | 
            -
                unsigned j;
         | 
| 66 59 |  | 
| 67 60 | 
             
                ary_copy(array1, array2, size);
         | 
| 68 61 |  | 
| 69 | 
            -
                for(j = 0; j < size; j++)
         | 
| 70 | 
            -
                {
         | 
| 71 | 
            -
             | 
| 62 | 
            +
                for(unsigned j = 0; j < size; j++) printf("%d ", array2[j]);
         | 
| 63 | 
            +
                
         | 
| 72 | 
            -
                 | 
| 64 | 
            +
                return 0;
         | 
| 73 65 | 
             
            }
         | 
| 74 66 | 
             
            ```
         | 
5
2つ目のコードにまつわる文章の一部修正
    
        answer	
    CHANGED
    
    | @@ -40,7 +40,7 @@ | |
| 40 40 | 
             
            静的配列の要素数は"配列全体のバイト数/配列一つ分のバイト数"で取得できるので
         | 
| 41 41 | 
             
            今回の場合バイト数を取得するための演算子sizeofを用いて
         | 
| 42 42 | 
             
            sizeof(array1)/sizeof(array1[0])で要素数を取得できますので
         | 
| 43 | 
            -
            上記を踏まえれば配列の要素数を変数で指定できる処理系でしか | 
| 43 | 
            +
            上記を踏まえれば配列の要素数を変数で指定できる処理系でしかコンパイルできませんが
         | 
| 44 44 | 
             
            下記コードのように書けばよいのではないでしょうか。
         | 
| 45 45 |  | 
| 46 46 | 
             
            ```c
         | 
4
コードの不備修正
    
        answer	
    CHANGED
    
    | @@ -40,13 +40,12 @@ | |
| 40 40 | 
             
            静的配列の要素数は"配列全体のバイト数/配列一つ分のバイト数"で取得できるので
         | 
| 41 41 | 
             
            今回の場合バイト数を取得するための演算子sizeofを用いて
         | 
| 42 42 | 
             
            sizeof(array1)/sizeof(array1[0])で要素数を取得できますので
         | 
| 43 | 
            +
            上記を踏まえれば配列の要素数を変数で指定できる処理系でしか動きませんが
         | 
| 43 | 
            -
             | 
| 44 | 
            +
            下記コードのように書けばよいのではないでしょうか。
         | 
| 44 45 |  | 
| 45 46 | 
             
            ```c
         | 
| 46 47 | 
             
            #include <stdio.h>
         | 
| 47 48 |  | 
| 48 | 
            -
            #define SIZE(list) (sizeof(list)/sizeof(list[0]))// 配列の要素数を取得するマクロ
         | 
| 49 | 
            -
             | 
| 50 49 | 
             
            void ary_copy(int* d, int* s, int t) 
         | 
| 51 50 | 
             
            {
         | 
| 52 51 | 
             
                int i;
         | 
| @@ -60,12 +59,14 @@ | |
| 60 59 | 
             
            int main(void)
         | 
| 61 60 | 
             
            {
         | 
| 62 61 | 
             
                int array1[] = {1, 2, 3, 4, 5};
         | 
| 62 | 
            +
                unsigned size = sizeof(array1)/sizeof(array1[0]);
         | 
| 63 | 
            +
                
         | 
| 63 | 
            -
                int array2[ | 
| 64 | 
            +
                int array2[size];                    
         | 
| 64 65 | 
             
                unsigned j;
         | 
| 65 66 |  | 
| 66 | 
            -
                ary_copy(array1, array2,  | 
| 67 | 
            +
                ary_copy(array1, array2, size);
         | 
| 67 68 |  | 
| 68 | 
            -
                for(j = 0; j <  | 
| 69 | 
            +
                for(j = 0; j < size; j++)
         | 
| 69 70 | 
             
                {
         | 
| 70 71 | 
             
                    printf("%d ", array2[j]);
         | 
| 71 72 | 
             
                }
         | 
3
マクロを追記
    
        answer	
    CHANGED
    
    | @@ -37,18 +37,20 @@ | |
| 37 37 |  | 
| 38 38 | 
             
            > これだとt個ではなく5個限定のコードですが、どのようにすると様々な値に対応したコードになりますか。
         | 
| 39 39 |  | 
| 40 | 
            -
            静的配列の要素数は"配列全体のバイト数/ | 
| 40 | 
            +
            静的配列の要素数は"配列全体のバイト数/配列一つ分のバイト数"で取得できるので
         | 
| 41 41 | 
             
            今回の場合バイト数を取得するための演算子sizeofを用いて
         | 
| 42 | 
            -
            sizeof(array1)/sizeof( | 
| 42 | 
            +
            sizeof(array1)/sizeof(array1[0])で要素数を取得できますので
         | 
| 43 43 | 
             
            上記を踏まえれば下記コードのように書けばよいのではないでしょうか。
         | 
| 44 44 |  | 
| 45 45 | 
             
            ```c
         | 
| 46 46 | 
             
            #include <stdio.h>
         | 
| 47 47 |  | 
| 48 | 
            +
            #define SIZE(list) (sizeof(list)/sizeof(list[0]))// 配列の要素数を取得するマクロ
         | 
| 49 | 
            +
             | 
| 48 50 | 
             
            void ary_copy(int* d, int* s, int t) 
         | 
| 49 51 | 
             
            {
         | 
| 50 52 | 
             
                int i;
         | 
| 51 | 
            -
             | 
| 53 | 
            +
             | 
| 52 54 | 
             
                for(i = 0; i < t; i++) 
         | 
| 53 55 | 
             
                {
         | 
| 54 56 | 
             
                    s[i] = d[i]; 
         | 
| @@ -58,14 +60,12 @@ | |
| 58 60 | 
             
            int main(void)
         | 
| 59 61 | 
             
            {
         | 
| 60 62 | 
             
                int array1[] = {1, 2, 3, 4, 5};
         | 
| 61 | 
            -
                int array2[ | 
| 63 | 
            +
                int array2[SIZE(array1)];                    
         | 
| 62 64 | 
             
                unsigned j;
         | 
| 63 65 |  | 
| 64 | 
            -
                unsigned size = sizeof(array1)/sizeof(int);
         | 
| 65 | 
            -
                
         | 
| 66 | 
            -
                ary_copy(array1, array2,  | 
| 66 | 
            +
                ary_copy(array1, array2, SIZE(array1));
         | 
| 67 | 
            -
             | 
| 67 | 
            +
             | 
| 68 | 
            -
                for(j = 0; j <  | 
| 68 | 
            +
                for(j = 0; j < SIZE(array1); j++)
         | 
| 69 69 | 
             
                {
         | 
| 70 70 | 
             
                    printf("%d ", array2[j]);
         | 
| 71 71 | 
             
                }
         | 
2
プロトタイプ宣言が不要なので消去
    
        answer	
    CHANGED
    
    | @@ -45,8 +45,6 @@ | |
| 45 45 | 
             
            ```c
         | 
| 46 46 | 
             
            #include <stdio.h>
         | 
| 47 47 |  | 
| 48 | 
            -
            void ary_copy(int*, int*, int);
         | 
| 49 | 
            -
             | 
| 50 48 | 
             
            void ary_copy(int* d, int* s, int t) 
         | 
| 51 49 | 
             
            {
         | 
| 52 50 | 
             
                int i;
         | 
1
for用インデックスのjをintからunsignedへ変更
    
        answer	
    CHANGED
    
    | @@ -61,7 +61,7 @@ | |
| 61 61 | 
             
            {
         | 
| 62 62 | 
             
                int array1[] = {1, 2, 3, 4, 5};
         | 
| 63 63 | 
             
                int array2[sizeof(array1)/sizeof(int)];					
         | 
| 64 | 
            -
                 | 
| 64 | 
            +
                unsigned j;
         | 
| 65 65 |  | 
| 66 66 | 
             
                unsigned size = sizeof(array1)/sizeof(int);
         | 
| 67 67 |  | 
