ページ 11

どうも、二回目です・・・住所録を作成しているのですが・・・

Posted: 2014年4月08日(火) 20:58
by matunon
現行の状態でもバイナリファイルだったらいけるべとおもいコンパイル。
するとエラーが出なかったので喜び勇んで実行したのですが・・・・・・
結果は空欄の結果がずっと表示される中にぽつんと
No-8564211012
氏名:フフフフフフフフがgきあ
年齢:フフフフフフ


といったようなものが一つあるだけになってしまいます。
環境はvisual studio2013 C++
言語はC言語です。

以下ソースです。
► スポイラーを表示
以前よりはレベルアップしたつもりだったのですが・・・・・・まだまだだったようです。
アドバイスをいただきたいです。
おねがいします!

Re: どうも、二回目です・・・住所録を作成しているのですが・・・

Posted: 2014年4月08日(火) 21:58
by matunon
あれ?これってもしかしてchar型の配列に1000はおおすぎまっせって感じですか?
はずかしい・・・・・。
どうなんでしょう?

Re: どうも、二回目です・・・住所録を作成しているのですが・・・

Posted: 2014年4月08日(火) 22:04
by みけCAT
matunon さんが書きました:あれ?これってもしかしてchar型の配列に1000はおおすぎまっせって感じですか?
はずかしい・・・・・。
どうなんでしょう?
この構造体(disp_t)の1000要素の配列を確保するのは多すぎるとは思いませんが、
実際に1000要素の配列を確保している場所が見当たりません。
確保された領域の範囲外にアクセスし、メモリ(上のデータ)を破壊している可能性が考えられます。

【追記】このようなバグを防ぐため、確保する配列の要素数(=読み書きする要素数)を#defineを利用した定数で指定した方がいいと思います。

Re: どうも、二回目です・・・住所録を作成しているのですが・・・

Posted: 2014年4月08日(火) 22:21
by matunon
あ、みけCATさん!今回もありがとうございます!

#define・・・いわゆるマクロってやつですね。
数値設定だけなら難しくないと思うんでやってみます!

質問なのですが、今回の課題では保存できるアドレスのかずには制限は設けないとのことだったのですが、
やはり、配列の可変冗長をつかうのかなあと思ったのですが、構造体配列でも可変冗長は使えるのでしょうか?
malloc関数を使えるのでしょうか?
使うとしたらどのように使うのでしょうか。

アドバイスをばお願いします!

Re: どうも、二回目です・・・住所録を作成しているのですが・・・

Posted: 2014年4月08日(火) 22:28
by みけCAT
「可変冗長」が何のことかわかりませんが、malloc関数は使えます。
可変個のデータを保存するときは、データの件数を最初に保存した方がいいと思います。
不定個のデータを入力する時はデータをリスト構造で管理すると、reallocを使用する必要が無くなっていいと思います。
ファイルから読み込む時は、最初に保存したデータの件数を元に配列を確保し、そこにデータを読み込んでいくといいと思います。
リスト構造の1個のノードは、例えばこんな感じで配列を乗せられるようにするといいかもしれません。

コード:

struct disp_t_list {
    int dataNum;
   disp_t* data;
    struct disp_t_list* next;
}

Re: どうも、二回目です・・・住所録を作成しているのですが・・・

Posted: 2014年4月08日(火) 22:30
by matunon
みけCAT さんが書きました:「可変冗長」が何のことかわかりませんが、malloc関数は使えます。
可変個のデータを保存するときは、データの件数を最初に保存した方がいいと思います。
不定個のデータを入力する時はデータをリスト構造で管理すると、reallocを使用する必要が無くなっていいと思います。
ファイルから読み込む時は、最初に保存したデータの件数を元に配列を確保し、そこにデータを読み込んでいくといいと思います。
リスト構造の1個のノードは、例えばこんな感じで配列を乗せられるようにするといいかもしれません。

コード:

struct disp_t_list {
    int dataNum;
   disp_t* data;
    struct disp_t_list* next;
}
リスト構造ですね・・・・・・。
勉強してきます。
明日には進展を報告できるかと・・・・・・。
まだ未解決にしておきます。