回答編集履歴

10

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

2020/12/08 09:47

投稿

退会済みユーザー
test CHANGED
@@ -4,9 +4,11 @@
4
4
 
5
5
  代入しようとしている部分と
6
6
 
7
- 引数の型と変数名の間にスペースがないのでコンパイルエラーとなってしまいます。
7
+ ~~引数の型と変数名の間にスペースがないのでコンパイルエラーとなってしまいます。~~
8
8
 
9
9
  あとプロトタイプ宣言の部分では仮引数名は必要ないので書かなくても構わないかと思われます。
10
+
11
+
10
12
 
11
13
 
12
14
 
@@ -24,7 +26,7 @@
24
26
 
25
27
  -void ary_copy(char*d, char*s, int t)
26
28
 
27
- +void ary_copy(int* d, int* s, int t)
29
+ +void ary_copy(int*d, int*s, int t)
28
30
 
29
31
  {
30
32
 
@@ -82,7 +84,9 @@
82
84
 
83
85
  sizeof(array1)/sizeof(array1[0])で要素数を取得できますので
84
86
 
87
+ 上記を踏まえればC99以降(下記SaitoAtsushiさんのコメントを参照)
88
+
85
- 上記を踏まえれば配列の要素数を変数指定できる処理系でしかコンパイルできませんが
89
+ がコンパイルできる処理系でしかコンパイルできませんが
86
90
 
87
91
  下記コードのように書けばよいのではないでしょうか。
88
92
 

9

constつけ忘れ修正

2020/12/08 09:47

投稿

退会済みユーザー
test CHANGED
@@ -110,7 +110,7 @@
110
110
 
111
111
  int array1[] = {1, 2, 3, 4, 5};
112
112
 
113
- unsigned size = sizeof(array1)/sizeof(array1[0]);
113
+ const unsigned size = sizeof(array1)/sizeof(array1[0]);
114
114
 
115
115
  int array2[size];
116
116
 

8

インクリメント部分修正

2020/12/07 21:03

投稿

退会済みユーザー
test CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
 
122
122
 
123
- for(unsigned j = 0; j < size; j++) printf("%d ", array2[j]);
123
+ for(unsigned j = 0; j < size; ++j) printf("%d ", array2[j]);
124
124
 
125
125
 
126
126
 

7

回答文修正

2020/12/07 20:59

投稿

退会済みユーザー
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  引数の型と変数名の間にスペースがないのでコンパイルエラーとなってしまいます。
8
8
 
9
- あとプロトタイプ宣言の部分では引数の変数名は必要ないので書かなくても構わないかと思われます。
9
+ あとプロトタイプ宣言の部分では引数名は必要ないので書かなくても構わないかと思われます。
10
10
 
11
11
 
12
12
 

6

コード簡略化

2020/12/07 20:58

投稿

退会済みユーザー
test CHANGED
@@ -94,21 +94,11 @@
94
94
 
95
95
 
96
96
 
97
- void ary_copy(int* d, int* s, int t)
97
+ void ary_copy(const int* const d, int* const s, const unsigned t)
98
98
 
99
99
  {
100
100
 
101
- int i;
102
-
103
-
104
-
105
- for(i = 0; i < t; i++)
101
+ for(unsigned i = 0; i < t; ++i) s[i] = d[i];
106
-
107
- {
108
-
109
- s[i] = d[i];
110
-
111
- }
112
102
 
113
103
  }
114
104
 
@@ -122,11 +112,7 @@
122
112
 
123
113
  unsigned size = sizeof(array1)/sizeof(array1[0]);
124
114
 
125
-
126
-
127
115
  int array2[size];
128
-
129
- unsigned j;
130
116
 
131
117
 
132
118
 
@@ -134,13 +120,11 @@
134
120
 
135
121
 
136
122
 
137
- for(j = 0; j < size; j++)
123
+ for(unsigned j = 0; j < size; j++) printf("%d ", array2[j]);
138
124
 
139
- {
125
+
140
126
 
141
- printf("%d ", array2[j]);
127
+ return 0;
142
-
143
- }
144
128
 
145
129
  }
146
130
 

5

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

2020/12/07 20:56

投稿

退会済みユーザー
test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
  sizeof(array1)/sizeof(array1[0])で要素数を取得できますので
84
84
 
85
- 上記を踏まえれば配列の要素数を変数で指定できる処理系でしかきませんが
85
+ 上記を踏まえれば配列の要素数を変数で指定できる処理系でしかコンパイルできませんが
86
86
 
87
87
  下記コードのように書けばよいのではないでしょうか。
88
88
 

4

コードの不備修正

2020/12/07 20:51

投稿

退会済みユーザー
test CHANGED
@@ -82,17 +82,15 @@
82
82
 
83
83
  sizeof(array1)/sizeof(array1[0])で要素数を取得できますので
84
84
 
85
+ 上記を踏まえれば配列の要素数を変数で指定できる処理系でしか動きませんが
86
+
85
- 上記を踏まえれば下記コードのように書けばよいのではないでしょうか。
87
+ 下記コードのように書けばよいのではないでしょうか。
86
88
 
87
89
 
88
90
 
89
91
  ```c
90
92
 
91
93
  #include <stdio.h>
92
-
93
-
94
-
95
- #define SIZE(list) (sizeof(list)/sizeof(list[0]))// 配列の要素数を取得するマクロ
96
94
 
97
95
 
98
96
 
@@ -122,17 +120,21 @@
122
120
 
123
121
  int array1[] = {1, 2, 3, 4, 5};
124
122
 
123
+ unsigned size = sizeof(array1)/sizeof(array1[0]);
124
+
125
+
126
+
125
- int array2[SIZE(array1)];
127
+ int array2[size];
126
128
 
127
129
  unsigned j;
128
130
 
129
131
 
130
132
 
131
- ary_copy(array1, array2, SIZE(array1));
133
+ ary_copy(array1, array2, size);
132
134
 
133
135
 
134
136
 
135
- for(j = 0; j < SIZE(array1); j++)
137
+ for(j = 0; j < size; j++)
136
138
 
137
139
  {
138
140
 

3

マクロを追記

2020/12/07 20:48

投稿

退会済みユーザー
test CHANGED
@@ -76,11 +76,11 @@
76
76
 
77
77
 
78
78
 
79
- 静的配列の要素数は"配列全体のバイト数/型ひとつ分のバイト数"で取得できるので
79
+ 静的配列の要素数は"配列全体のバイト数/配列一つ分のバイト数"で取得できるので
80
80
 
81
81
  今回の場合バイト数を取得するための演算子sizeofを用いて
82
82
 
83
- sizeof(array1)/sizeof(int)で要素数を取得できます
83
+ sizeof(array1)/sizeof(array1[0])で要素数を取得できますので
84
84
 
85
85
  上記を踏まえれば下記コードのように書けばよいのではないでしょうか。
86
86
 
@@ -92,13 +92,17 @@
92
92
 
93
93
 
94
94
 
95
+ #define SIZE(list) (sizeof(list)/sizeof(list[0]))// 配列の要素数を取得するマクロ
96
+
97
+
98
+
95
99
  void ary_copy(int* d, int* s, int t)
96
100
 
97
101
  {
98
102
 
99
103
  int i;
100
104
 
101
-
105
+
102
106
 
103
107
  for(i = 0; i < t; i++)
104
108
 
@@ -118,21 +122,17 @@
118
122
 
119
123
  int array1[] = {1, 2, 3, 4, 5};
120
124
 
121
- int array2[sizeof(array1)/sizeof(int)];
125
+ int array2[SIZE(array1)];
122
126
 
123
127
  unsigned j;
124
128
 
125
129
 
126
130
 
127
- unsigned size = sizeof(array1)/sizeof(int);
131
+ ary_copy(array1, array2, SIZE(array1));
128
132
 
129
-
130
133
 
131
- ary_copy(array1, array2, size);
132
134
 
133
-
134
-
135
- for(j = 0; j < size; j++)
135
+ for(j = 0; j < SIZE(array1); j++)
136
136
 
137
137
  {
138
138
 

2

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

2020/12/07 20:19

投稿

退会済みユーザー
test CHANGED
@@ -92,10 +92,6 @@
92
92
 
93
93
 
94
94
 
95
- void ary_copy(int*, int*, int);
96
-
97
-
98
-
99
95
  void ary_copy(int* d, int* s, int t)
100
96
 
101
97
  {

1

for用インデックスのjをintからunsignedへ変更

2020/12/07 20:05

投稿

退会済みユーザー
test CHANGED
@@ -124,7 +124,7 @@
124
124
 
125
125
  int array2[sizeof(array1)/sizeof(int)];
126
126
 
127
- int j;
127
+ unsigned j;
128
128
 
129
129
 
130
130