teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

10

回答の不備修正(SaitoAtsushiさんのコメントを参照)

2020/12/08 09:47

投稿

退会済みユーザー
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* d, int* s, int t)
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つけ忘れ修正

2020/12/08 09:47

投稿

退会済みユーザー
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

インクリメント部分修正

2020/12/07 21:03

投稿

退会済みユーザー
answer CHANGED
@@ -59,7 +59,7 @@
59
59
 
60
60
  ary_copy(array1, array2, size);
61
61
 
62
- for(unsigned j = 0; j < size; j++) printf("%d ", array2[j]);
62
+ for(unsigned j = 0; j < size; ++j) printf("%d ", array2[j]);
63
63
 
64
64
  return 0;
65
65
  }

7

回答文修正

2020/12/07 20:59

投稿

退会済みユーザー
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

コード簡略化

2020/12/07 20:58

投稿

退会済みユーザー
answer CHANGED
@@ -46,29 +46,21 @@
46
46
  ```c
47
47
  #include <stdio.h>
48
48
 
49
- void ary_copy(int* d, int* s, int t)
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; i++)
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
- printf("%d ", array2[j]);
62
+ for(unsigned j = 0; j < size; j++) printf("%d ", array2[j]);
63
+
72
- }
64
+ return 0;
73
65
  }
74
66
  ```

5

2つ目のコードにまつわる文章の一部修正

2020/12/07 20:56

投稿

退会済みユーザー
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

コードの不備修正

2020/12/07 20:51

投稿

退会済みユーザー
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[SIZE(array1)];
64
+ int array2[size];
64
65
  unsigned j;
65
66
 
66
- ary_copy(array1, array2, SIZE(array1));
67
+ ary_copy(array1, array2, size);
67
68
 
68
- for(j = 0; j < SIZE(array1); j++)
69
+ for(j = 0; j < size; j++)
69
70
  {
70
71
  printf("%d ", array2[j]);
71
72
  }

3

マクロを追記

2020/12/07 20:48

投稿

退会済みユーザー
answer CHANGED
@@ -37,18 +37,20 @@
37
37
 
38
38
  > これだとt個ではなく5個限定のコードですが、どのようにすると様々な値に対応したコードになりますか。
39
39
 
40
- 静的配列の要素数は"配列全体のバイト数/型ひとつ分のバイト数"で取得できるので
40
+ 静的配列の要素数は"配列全体のバイト数/配列一つ分のバイト数"で取得できるので
41
41
  今回の場合バイト数を取得するための演算子sizeofを用いて
42
- sizeof(array1)/sizeof(int)で要素数を取得できます
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[sizeof(array1)/sizeof(int)];
63
+ int array2[SIZE(array1)];
62
64
  unsigned j;
63
65
 
64
- unsigned size = sizeof(array1)/sizeof(int);
65
-
66
- ary_copy(array1, array2, size);
66
+ ary_copy(array1, array2, SIZE(array1));
67
-
67
+
68
- for(j = 0; j < size; j++)
68
+ for(j = 0; j < SIZE(array1); j++)
69
69
  {
70
70
  printf("%d ", array2[j]);
71
71
  }

2

プロトタイプ宣言が不要なので消去

2020/12/07 20:19

投稿

退会済みユーザー
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へ変更

2020/12/07 20:05

投稿

退会済みユーザー
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
- int j;
64
+ unsigned j;
65
65
 
66
66
  unsigned size = sizeof(array1)/sizeof(int);
67
67