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

回答編集履歴

2

追加説明

2021/03/01 03:55

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -16,4 +16,9 @@
16
16
  コンパイラは、関数abcの引数であるxの形状情報を持っていません。従って引数のポインタの要素数を出すようなコードを書くことは原理的に不可能です。
17
17
 
18
18
 
19
- 該当のソースコードの場合には他の方も書かれているように、sizeof xはポインタ型の大きさとなりますので、32ビットOSであれば4、64ビットOSであれば8になります。
19
+ 該当のソースコードの場合には他の方も書かれているように、sizeof xはポインタ型の大きさとなりますので、32ビットOSであれば4、64ビットOSであれば8になります。
20
+
21
+ 下手な例を挙げて、間違ってしまいましたが、一番重要なのは、C言語は性能重視のために、関数呼び出しのオーバーヘッドを最小限にするように作られた言語だということです。
22
+ それは、C言語がUNIXというOSを書くために作られた言語だからです。C言語が作られるまでOSはアセンブラで書かなければ性能が出ないので無理だと思われていました。
23
+ C言語の関数は性能のために、明示的に書かれた以外の情報を受け渡ししません。配列数が必要なら配列数を渡してプログラマがそれを使って関数内で必要な処理をしなさい、というのが基本的な方針です。
24
+ 従って、uha.spwさんの関数abcの書き方が上手とか下手とかの問題ではなく、どうやっても無理だと言うことを理解してください。・

1

修正

2021/03/01 03:55

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -7,20 +7,13 @@
7
7
  constが導入されてから分かりにくくなりましたが
8
8
  - constでないポインタは代入演算子の左辺に書けるが、配列は代入演算子の左辺に書けない。
9
9
 
10
- またsizeofは、()を付けて使う場合もあって関数だと誤解している人もいますが見えますが、関数ではなく演算子です。実行時にサイズを計算しているのではなく、コンパイル時にコンパイラが計算して定数に置き換えています。
10
+ またsizeofは、()を付けて使う場合もあって関数だと誤解している人もいますが見えますが、関数ではなく演算子です。~~実行時にサイズを計算しているのではなく、コンパイル時にコンパイラが計算して定数に置き換えています。
11
+ ~~
12
+ C99から、実行時に計算するものも入ったそうです。
11
13
 
12
14
  [sizeofは関数でなく演算子](http://www.6809.net/tenk/html/cgokai/sizeof.htm)
13
15
 
14
- コンパイラは、関数abcの引数であるxの形状情報を持っていません。従って要素数を出すようなコードを書くことは原理的に不可能です。
16
+ コンパイラは、関数abcの引数であるxの形状情報を持っていません。従って引数のポインタの要素数を出すようなコードを書くことは原理的に不可能です。
15
17
 
16
- xに形状情報を持たせるためには以下のように書く必要があります。
17
18
 
18
- ```python
19
- void abc(float x[3]) {
20
- int l = sizeof x/sizeof(x[0]);
21
- printf("要素数=%d",l);
22
- }
23
- ```
24
- つまり、引数の宣言時に配列として宣言するしかありません。
25
-
26
19
  該当のソースコードの場合には他の方も書かれているように、sizeof xはポインタ型の大きさとなりますので、32ビットOSであれば4、64ビットOSであれば8になります。