0

私は、約1か月の情報を保持する単純な構造から、うるう年以外の同じ情報の12の構造の配列に徐々に成長するプログラムを作成しました。ここで、「月番号を指定すると、その月を含むまでの1年の合計日数を返す関数を含めようとしています。質問3の構造テンプレートとそのような構造の適切な配列が宣言されていると仮定します。外部的に。」

runを押すと、2つのエラーが発生しますが、どちらもわかりません。アーキテクチャx86_64の未定義のシンボル: "_ months"、参照元:_days in main.o ld:アーキテクチャx86_64のシンボルが見つかりませんclang:エラー:リンカーコマンドが終了コード1で失敗しました(-vを使用して呼び出しを参照)」

どんな助けでも大歓迎です、ありがとう。

#include <stdio.h>
int days(int monthnum);
struct month {
char name[10];
char abbreviaton[4];
int days;
int monthnum;
};
int main(void)
{

struct month months[12] = {
    {"January", "Jan", 31, 1},
    {"February", "Feb", 28, 2},
    {"March", "Mar", 31, 3},
    {"April", "Apr", 30, 4},
    {"May", "May", 31, 5},
    {"June", "Jun", 30, 6},
    {"July", "Jul", 31, 7},
    {"August", "Aug", 31, 8},
    {"September", "Sep", 30, 9},
    {"October", "Oct", 31, 10},
    {"November", "Nov", 30, 11},
    {"December", "Dec", 31, 12},
};

struct month *sign;

sign = &months[12];

days(months[12].monthnum);

return 0;
}
extern struct month months[12];
int days(int monthnum)
{
int index, total;

if (monthnum < 1 || monthnum > 12)
    return(-1);
else
{
    for (index = 0, total = 0; index < monthnum; index++)
        total += months[index].days;
return(total);
}
}

これが私が今持っているコードです。プログラムは動作します:

#include <stdio.h>
int days(int monthnum);
struct month {
char name[10];
char abbreviaton[4];
int days;
int monthnum;
};
struct month months[12] = {
    {"January", "Jan", 31, 1},
    {"February", "Feb", 28, 2},
    {"March", "Mar", 31, 3},
    {"April", "Apr", 30, 4},
    {"May", "May", 31, 5},
    {"June", "Jun", 30, 6},
    {"July", "Jul", 31, 7},
    {"August", "Aug", 31, 8},
    {"September", "Sep", 30, 9},
    {"October", "Oct", 31, 10},
    {"November", "Nov", 30, 11},
    {"December", "Dec", 31, 12},
};
int main(void)
{
int value;
int count = 0;
struct month *sign;

sign = &months;

printf("Enter month number: ");

scanf("%d", &months[count].monthnum);

value = days(sign->monthnum);

printf("%d", value);

return 0;
}
extern struct month months[];
int days(int monthnum)
{
int index, total;

if (monthnum < 1 || monthnum > 12)
    return(-1);
else
{
    for (index = 0, total = 0; index < monthnum; index++)
        total += months[index].days;
return(total);
}
}
4

2 に答える 2

2

差し迫った問題はこの線によるものです。

extern struct month months[12];

ここで参照する配列定義はありません。monthsの中で宣言され、他のmainどこにも宣言されていません。その行を取り除きます。

次に、論理的な問題があります。

days(months[12].monthnum);

配列の境界を超えました。配列には0のインデックスが付けられます。つまり、12個の要素の配列には有効なインデックス0〜11が含まれます。12は遠すぎます。

余談ですが、各要素を明示的に初期化するときに、配列の次元を指定する必要はありません。使用するだけです:

struct month months[] = {
    {"January", "Jan", 31, 1},
    {"February", "Feb", 28, 2},
    {"March", "Mar", 31, 3},
    {"April", "Apr", 30, 4},
    {"May", "May", 31, 5},
    {"June", "Jun", 30, 6},
    {"July", "Jul", 31, 7},
    {"August", "Aug", 31, 8},
    {"September", "Sep", 30, 9},
    {"October", "Oct", 31, 10},
    {"November", "Nov", 30, 11},
    {"December", "Dec", 31, 12},
};

コンパイラは、あなたがそう言ったので、12個の要素があることを知っています。これで、要素を追加または削除するときに、寸法を変更する必要がなくなりました。

次の問題; 可変スコープ。あなたはあなたのdays関数の中にこれを持っています:

total += months[index].days;

にローカルであるため、daysにアクセスできません。可変スコープを研究して理解する必要があります。monthsmonthsmain

于 2013-03-26T05:45:46.060 に答える
2

extern struct month months[12];monthsどこかにグローバル配列が定義されていることを意味します。配列monthsはグローバルではなく、関数に対してローカルmainです。それがエラーです。その他のメッセージは2番目のエラーではありません。

また、その配列にmonths[12]は12個の要素しかないため、アクセスしないように注意する必要があります-to 。months[0]months[11]

于 2013-03-26T05:49:26.573 に答える