太陽系の惑星ごとの直径を、名前とともに一覧表示するプログラムを作ろうとしています。でも、コンパイルエラーで動きません。
![](/wp-content/include/images/avatar/teacher/5.png)
何が間違っているか分かりますか?
main.c
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
typedef struct {
uint32_t diameter; /* [km] */
const char *pName;
} PlanetInfo;
PlanetInfo planets[] = {
{ 004879, "Mercury" },
{ 012104, "Venus" },
{ 012742, "Earth" },
{ 006779, "Mars" },
{ 139820, "Jupiter" },
{ 116460, "Saturn" },
{ 050724, "Uranus" },
{ 049244, "Neptune" },
};
int main(void) {
int n = sizeof(planets) / sizeof(planets[0]);
for (int i=0; i<n; i++) {
printf("Diameter of %s: %dkm\n", planets[i].pName, planets[i].diameter);
}
return EXIT_SUCCESS;
}
期待される実行結果
Diameter of Mercury: 4879km
Diameter of Venus: 12104km
Diameter of Earth: 12742km
Diameter of Mars: 6779km
Diameter of Jupiter: 139820km
Diameter of Saturn: 116460km
Diameter of Uranus: 50724km
Diameter of Neptune: 49244km
![](/wp-content/include/images/avatar/student/3.png)
水星(Mercury)から海王星(Neptune)までの、8つの惑星のデータが並んでますね。
![](/wp-content/include/images/avatar/teacher/5.png)
データを構造体の配列で表現しようとしているのが分かるかしら?
![](/wp-content/include/images/avatar/student/4.png)
はい。
PlanetInfo
が構造体で、その配列がplanets
ですね。
![](/wp-content/include/images/avatar/student/7.png)
構造体のほうは……
typedef struct {
uint32_t diameter; /* [km] */
const char *pName;
} PlanetInfo;
![](/wp-content/include/images/avatar/student/6.png)
diameter
っていうのが惑星の「直径」を表してて、単位が「キロメートル(km)」なわけですね。
![](/wp-content/include/images/avatar/teacher/3.png)
そうそう。で、
pName
が惑星の「名前」ね。
![](/wp-content/include/images/avatar/student/7.png)
データを表示しているところは……
int n = sizeof(planets) / sizeof(planets[0]);
for (int i=0; i<n; i++) {
printf("Diameter of %s: %dkm\n", planets[i].pName, planets[i].diameter);
}
![](/wp-content/include/images/avatar/student/5.png)
for
ループで構造体の中身を1つずつ表示してるのは分かるんですけど……
![](/wp-content/include/images/avatar/teacher/1.png)
うん。
![](/wp-content/include/images/avatar/student/2.png)
変数
n
のところは、何を計算をしてるんですか?
![](/wp-content/include/images/avatar/teacher/6.png)
配列全体のサイズ
sizeof(planets)
を、要素1つ分のサイズsizeof(planets[0])
で割ってるわよね。
![](/wp-content/include/images/avatar/student/7.png)
たしかに。ということは……
int n = sizeof(planets) / sizeof(planets[0]);
![](/wp-content/include/images/avatar/student/8.png)
分かった!
n
は配列の要素数ってことですね!
![](/wp-content/include/images/avatar/teacher/4.png)
うん、正解!これはね、C言語ではよく使う計算なのよ。
![](/wp-content/include/images/avatar/student/12.png)
そうなんですか?この行が怪しいと思ったんだけどなぁ……
![](/wp-content/include/images/avatar/teacher/9.png)
なーんだ、そういうことだったのね。
![](/wp-content/include/images/avatar/student/2.png)
えっと、じゃあ、実際にコンパイルしてみれば何か分かりますかね?
![](/wp-content/include/images/avatar/teacher/4.png)
そうね。コンパイルエラーの内容をよく確認すればね。
![](/wp-content/include/images/avatar/student/4.png)
ですよね。やってみます!
![](/wp-content/include/images/avatar/teacher/7.png)
配列の内側にある数字の書き方に注目してみましょう!