
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というような値に
なっていました。
これは何故なのでしょうか?メモリか何かが原因なのでしょうか?
よろしくお願いします。
No.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になっているか確認しておきます。
ありがとうございました。
No.5
- 回答日時:
No.1です。
やはり、端折られている部分(確認方法など)に問題がありそうですね。
>-858993460
は、単純に16進数に変換した場合「0xCCCCCCCC」となります。
これがどういう意味を持つかというと、Windowsアプリなら「メモリ確保されていない部分を参照している」ということです。
それぞれ構造体ということですが、その構造体自体がポインタであったり、メンバ変数がポインタであったりしませんか?
また、表示方法は本当に正しいか確認してみてください。
No.4
- 回答日時:
>全体を載せるとどうしても入りきらない
では、せめて当該構造体の定義部分と
当該構造体を用いた当該変数の定義部分だけでも
見せてください。
この回答への補足
実際に使っている構造体は次のようになっています。時間割の振り分け
を行うようなプログラムです。
☆の部分では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];
★
よろしくお願いします。
No.3
- 回答日時:
コードを載せるときは
はしょらずに全部載せてください。
載せていないところに
問題が隠れていることが
ままあります。
この回答への補足
分かりにくくてすいません。
全体を載せるとどうしても入りきらないので問題の部分をシンプルな形に
して載せています。全て一つのファイルの中でグローバル変数を用いている
ので宣言ミスなどでは無いと思います。また、他の場所で似たような操作
をしても問題なく実行できています。
上の部分では変わっていなかった変数が下までの数行で直接操作して
いなかったにもかかわらず急に変わっていることに疑問を感じています。
コンパイル方法はvc++のカーソル行までコンパイルを用いており、
そのときの変数の値を表示してみました。
No.2
- 回答日時:
これだけで原因が分かると思う方が間違っている.
使っている処理系とか問題が起きる完全な (かつ, できれば最小の) プログラムの例をあげてください.
ついでに言うと, 「構造体タグ」に添え字をつけてこんなことをしようとしてもコンパイラが通してくれないはずです.
この回答への補足
分かりにくくてすいません。
処理系はvc++を使用しています。同じ構造体タグで宣言した変数という
意味です。宣言などにはミスはないと思うので、下のソースは上のソース
の続きなので直接操作にかかわっていない変数の値が変化していることに
疑問を感じています。
No.1
- 回答日時:
とりあえずの確認。
・質問のソース部分は、同じ関数内で連続して記述されていますか?
・a_save[]、A[]、b[]、B[] の要素数はすべて3以上ですか?
・a_save[]、A[]、b[]、B[] をそれぞれ宣言している場所は?
・値がおかしくなるのを確認している方法、また確認したタイミングは?
考えられることとしては、
要素宣言ミスによるメモリ破壊や、ローカル変数を別の関数上から確認しようとしての問題の気がしますが。
この回答への補足
分かりにくくてすいません。
上のソースから連続して下のソースになっています。
それぞれこの次の行までコンパイルしたときの変数の値となっています。
要素数は全て3以上でグローバル変数となっており宣言ミスなどでは無い
ので、直接操作していなかった変数が変わっているのが不思議に思いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
構造体のデータを丸ごとコピー...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
C言語 構造体の中に共用体を定...
-
VBAの変数のデータ型を変更する...
-
関数の引数の順番の混乱を回避...
-
HP-UXへの移植でセグメンテーシ...
-
整数から16進数への変換 現在c...
-
命名規則 VB 構造体
-
構造体にする理由・利点・使用例
-
10進数の変換方法
-
値が代入されてない時
-
変数宣言および代入について
-
VBAにてcolorindexを変数に格納...
-
日付チェック関数について
-
1バイトデータの読み出しについて
-
構造体のポインタにNULLが入らない
-
値が変わるのはどうしてでしょ...
-
C言語 配列の長さの上限
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
VBAの変数のデータ型を変更する...
-
typedefをプログラム中で解除す...
-
値が代入されてない時
-
構造体のデータを丸ごとコピー...
-
VBAにてcolorindexを変数に格納...
-
整数から16進数への変換 現在c...
-
変数の初期化について
-
long型のデータをバイト型の配...
-
1バイトデータの読み出しについて
-
命名規則 VB 構造体
-
異なる構造体のデータのコピー
-
VBAで符号無し整数
-
C言語 構造体の中に共用体を定...
-
日付チェック関数について
-
構造体のポインタにNULLが入らない
-
ビット演算について
-
VBAで変数定義を変更する方法
おすすめ情報