初めて自分の家と他人の家が違う、と意識した時

c言語でプログラミングを行い、コンパイルが通って実行した時に
エラーが出たので、1行ずつコンパイルしてみました。

/////////////////ソース部分//////////////////////////////
a_save[0] = A[0] //(a_save と A は同じ構造体タグ)
a_save[1] = A[1]
a_save[2] = A[2]
/////////////////////////////////////////////////////////
→ここでコンパイルしたときは当然のように
a_save[0].a という変数の値は A[0].a の値と同じ8となっています。

ここからもう少し進んで

/////////////////ソース部分//////////////////////////////
a_save[0] = A[0] //(a_save と A は同じ構造体タグ)
a_save[1] = A[1]
a_save[2] = A[2]

b[0] = B[0] //(b と B は同じ構造体タグ(Aとは別))
b[1] = B[1]
b[2] = B[2]
/////////////////////////////////////////////////////////
→ここでコンパイルしたときに A[0].a の値は8のままだったの
ですが a_save[0].a の値が急に-858993460というような値に
なっていました。

これは何故なのでしょうか?メモリか何かが原因なのでしょうか?
よろしくお願いします。

A 回答 (9件)

すでに完結していますが、


>要素数は全て3以上でグローバル変数となっており宣言ミスなどでは無い
-----------
>struct KOMA koma2_save[2];
>struct KOM kom2_save[2];

要素2個ですね。明らかに宣言ミスです。これでは
>koma2_save[2] = koma2[max_koma3];
を実行した時点で内部的(メモリ的)には破たんしています。

さらに追い打ちをかけることになりますが
>kom2_save[0] = kom2[max_koma1];
>kom2_save[1] = kom2[max_koma2];
>kom2_save[2] = kom2[max_koma3];
ここで使用している「max_koma1~max_koma3」の値は提示されたソースでは「0~29」であると保障できていますか?

この回答への補足

単純なミスをしていました。失礼しました(汗

max_komaの方も0~29になっているか確認しておきます。
ありがとうございました。

補足日時:2008/12/18 17:44
    • good
    • 0

>要素数は全て3以上でグローバル変数となっており宣言ミスなどでは無い



struct KOMA koma2_save[2];
struct KOM kom2_save[2];

2個しかないようです

この回答への補足

そうですね^^;
簡単な部分を見落としていました(汗
ありがとうございます。

補足日時:2008/12/18 17:43
    • good
    • 0

struct KOMA koma2_save[2];


struct KOM kom2_save[2];

要素数が2個しかないのに、3個代入してるけど。
#添え字「0」「1」「2」で代入してる

>要素数は全て3以上でグローバル変数となっており宣言ミスなどでは無いので

ということで、宣言ミスじゃない?

この回答への補足

そうですね^^;
簡単な部分を見落としていました(汗
ありがとうございます。

補足日時:2008/12/18 17:40
    • good
    • 0

「今使っているプログラムをそのまま載せてくれ」といってるわけじゃないんだけどなぁ.


その中から「削れるところ (= 削っても問題が発生するところ)」を削った上で載せてほしいんだが.

この回答への補足

前の方に実際の宣言部分などを載せました。
よろしくおねがいします。

補足日時:2008/12/18 14:31
    • good
    • 0

No.1です。


やはり、端折られている部分(確認方法など)に問題がありそうですね。
>-858993460
は、単純に16進数に変換した場合「0xCCCCCCCC」となります。
これがどういう意味を持つかというと、Windowsアプリなら「メモリ確保されていない部分を参照している」ということです。
それぞれ構造体ということですが、その構造体自体がポインタであったり、メンバ変数がポインタであったりしませんか?
また、表示方法は本当に正しいか確認してみてください。

この回答への補足

前の方に実際の宣言部分などを載せました。
よろしくおねがいします。

補足日時:2008/12/18 14:29
    • good
    • 0

>全体を載せるとどうしても入りきらない



では、せめて当該構造体の定義部分と
当該構造体を用いた当該変数の定義部分だけでも
見せてください。

この回答への補足

実際に使っている構造体は次のようになっています。時間割の振り分け
を行うようなプログラムです。

☆の部分ではkoma2_save[0].subject_class_numberの値が8だったのに
★の部分ではkoma2_save[0].subject_class_numberの値が変わって
いました。

// 構造体の定義部分
struct KOMA
{
int subject_number;
int subject_bangou[20];
int subject_stock[20];
int subject_class_number;
int class_bangou[20];
int class_code[20];
int class_stock[20];
int student_number;
int student[170];
int new_subject_class_number;
int new_class_bangou[20];
int new_class_bunkatu[20];
};
struct KOM
{
int student_number[15];
int student[15][40];
int subject_class_number;
int subject_bangou[20];
int subject_class[20];
int subject_class_stock[20];
};

// 変数の定義部分
struct KOMA koma2[30];
struct KOMA koma2_save[2];
struct KOM kom2[30];
struct KOM kom2_save[2];

// 問題部分
// koma2_save にコピーする
koma2_save[0] = koma2[max_koma1];
koma2_save[1] = koma2[max_koma2];
koma2_save[2] = koma2[max_koma3];

// kom2_save にコピーする
kom2_save[0] = kom2[max_koma1];
kom2_save[1] = kom2[max_koma2];
kom2_save[2] = kom2[max_koma3];


よろしくお願いします。

補足日時:2008/12/18 14:17
    • good
    • 0

コードを載せるときは


はしょらずに全部載せてください。
載せていないところに
問題が隠れていることが
ままあります。

この回答への補足

分かりにくくてすいません。

全体を載せるとどうしても入りきらないので問題の部分をシンプルな形に
して載せています。全て一つのファイルの中でグローバル変数を用いている
ので宣言ミスなどでは無いと思います。また、他の場所で似たような操作
をしても問題なく実行できています。

上の部分では変わっていなかった変数が下までの数行で直接操作して
いなかったにもかかわらず急に変わっていることに疑問を感じています。

コンパイル方法はvc++のカーソル行までコンパイルを用いており、
そのときの変数の値を表示してみました。

補足日時:2008/12/18 13:13
    • good
    • 0

これだけで原因が分かると思う方が間違っている.


使っている処理系とか問題が起きる完全な (かつ, できれば最小の) プログラムの例をあげてください.
ついでに言うと, 「構造体タグ」に添え字をつけてこんなことをしようとしてもコンパイラが通してくれないはずです.

この回答への補足

分かりにくくてすいません。

処理系はvc++を使用しています。同じ構造体タグで宣言した変数という
意味です。宣言などにはミスはないと思うので、下のソースは上のソース
の続きなので直接操作にかかわっていない変数の値が変化していることに
疑問を感じています。

補足日時:2008/12/18 13:07
    • good
    • 0

とりあえずの確認。


・質問のソース部分は、同じ関数内で連続して記述されていますか?
・a_save[]、A[]、b[]、B[] の要素数はすべて3以上ですか?
・a_save[]、A[]、b[]、B[] をそれぞれ宣言している場所は?
・値がおかしくなるのを確認している方法、また確認したタイミングは?

考えられることとしては、
要素宣言ミスによるメモリ破壊や、ローカル変数を別の関数上から確認しようとしての問題の気がしますが。

この回答への補足

分かりにくくてすいません。
上のソースから連続して下のソースになっています。
それぞれこの次の行までコンパイルしたときの変数の値となっています。

要素数は全て3以上でグローバル変数となっており宣言ミスなどでは無い
ので、直接操作していなかった変数が変わっているのが不思議に思いました。

補足日時:2008/12/18 13:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報