第28問

太陽系の惑星ごとの直径を、名前とともに一覧表示するプログラムを作ろうとしています。でも、コンパイルエラーで動きません。

何が間違っているか分かりますか?
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言語ではよく使う計算なのよ。
そうなんですか?この行が怪しいと思ったんだけどなぁ……
なーんだ、そういうことだったのね。
えっと、じゃあ、実際にコンパイルしてみれば何か分かりますかね?
そうね。コンパイルエラーの内容をよく確認すればね。
ですよね。やってみます!
配列の内側にある数字の書き方に注目してみましょう!