
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/10 14:24
- その他(プログラミング・Web制作) Pythonでエクセルファイルの列を指定してスライス 3 2022/08/28 17:35
- TOEFL・TOEIC・英語検定 it isへの言い換え 2 2022/12/21 08:28
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- 英語 英語のカンマについて教えて欲しいです。 英作文についてです。 例えばお題が 100円ショップを利用す 3 2022/12/31 18:03
- 中学校 Many people want to do something to help save envi 2 2022/06/12 14:06
- 英語 「貯める」という意味のsaveは状態動詞ですか?動作動詞ですか? 5 2022/10/31 18:55
- UNIX・Linux Linux(fedora30)が立ち上がらくなってしまった 1 2023/03/29 11:09
- 英語 I want to save 〈 〉needy people 〈 〉の中には何か必要ですか? 私は貧 1 2023/06/11 14:55
- その他(プログラミング・Web制作) VSCodeの自動保存の2か所を無効にしているのに自動で保存されてしまう 1 2022/10/19 11:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
typedefをプログラム中で解除す...
-
1バイトデータの読み出しについて
-
構造体のデータを丸ごとコピー...
-
「#undef」と「#define」の使い...
-
変数の初期化について
-
Integer変数をカラにしたいので...
-
C言語のキャストについて
-
long型のデータをバイト型の配...
-
VB6.0の変数、関数の定義位置か...
-
値が代入されてない時
-
変数宣言および代入について
-
命名規則 VB 構造体
-
値が変わるのはどうしてでしょ...
-
ユーザー定義型変数の一括初期化
-
FileTimeToSystemTime がコンパ...
-
VBAの変数のデータ型を変更する...
-
構造体のポインタにNULLが入らない
-
日付チェック関数について
-
関数から配列を返すには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
C言語 構造体の中に共用体を定...
-
構造体のデータを丸ごとコピー...
-
VBAの変数のデータ型を変更する...
-
日付チェック関数について
-
整数から16進数への変換 現在c...
-
typedefをプログラム中で解除す...
-
値が代入されてない時
-
C++ 構造体の一括初期化 {0}
-
VBAで符号無し整数
-
long型のデータをバイト型の配...
-
変数の初期化について
-
1バイトデータの読み出しについて
-
charとucharの違い
-
VBAにてcolorindexを変数に格納...
-
異なる構造体のデータのコピー
-
構造体を型の異なる構造体に代入
-
構造体にする理由・利点・使用例
おすすめ情報