太陽系の惑星ごとの直径を、名前とともに一覧表示するプログラムを作ろうとしています。でも、コンパイルエラーで動きません。
何が間違っているか分かりますか?
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
水星(Mercury)から海王星(Neptune)までの、8つの惑星のデータが並んでますね。
データを構造体の配列で表現しようとしているのが分かるかしら?
はい。
PlanetInfo
が構造体で、その配列がplanets
ですね。
構造体のほうは……
typedef struct {
uint32_t diameter; /* [km] */
const char *pName;
} PlanetInfo;
diameter
っていうのが惑星の「直径」を表してて、単位が「キロメートル(km)」なわけですね。
そうそう。で、
pName
が惑星の「名前」ね。
データを表示しているところは……
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);
}
for
ループで構造体の中身を1つずつ表示してるのは分かるんですけど……
うん。
変数
n
のところは、何を計算をしてるんですか?
配列全体のサイズ
sizeof(planets)
を、要素1つ分のサイズsizeof(planets[0])
で割ってるわよね。
たしかに。ということは……
int n = sizeof(planets) / sizeof(planets[0]);
分かった!
n
は配列の要素数ってことですね!
うん、正解!これはね、C言語ではよく使う計算なのよ。
そうなんですか?この行が怪しいと思ったんだけどなぁ……
なーんだ、そういうことだったのね。
えっと、じゃあ、実際にコンパイルしてみれば何か分かりますかね?
そうね。コンパイルエラーの内容をよく確認すればね。
ですよね。やってみます!
配列の内側にある数字の書き方に注目してみましょう!