動的割り当てをすると起こる不具合

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
shiro4ao
記事: 224
登録日時: 10年前
住所: 広島

動的割り当てをすると起こる不具合

#1

投稿記事 by shiro4ao » 9年前

csvからデータを読み込んで、学生をクラス分けし、csvに出力する
プログラムを書こうとしています。

おおよそ完成したのですが、配列を動的割り当てすると結果が
異なってしまいました。

clas.cppとmalloc.cppの違いはmain()内にてSTUDENT型の配列を
動的割り当てしているかどうかの違いしかないのですが、
その結果は全く異なっています。

本来はmalloc.exeの結果(malloc result.txt)も
clas.exeの結果(clas result.txt)のようになってほしいのです。
どこか根本的におかしいでしょうか?
ご回答いただければ幸いです。

WindowsVista Home Premium
Borland C++ Compiler(Borland C++ 5.5.1 for Win32)
にて、作成しております。

ファイルが多いため、ファイルを添付いたします。
ご迷惑をおかけします。
添付ファイル
test.zip
(93.38 KiB) ダウンロード数: 32 回
最後に編集したユーザー shiro4ao on 2010年12月09日(木) 01:15 [ 編集 2 回目 ]

アバター
ookami
記事: 214
登録日時: 10年前
住所: 東京都

Re: 動的割り当てをすると起こる不具合

#2

投稿記事 by ookami » 9年前

まだ回答ではないのですが、よろしくお願いします。

テキスト比較ツールで比較してみましたが、確かに
struct student *st=(struct student *)malloc(MAX_STUDENT*sizeof(struct student));
か、
struct student st[MAX_STUDENT];
の違いしかないですね。

未検証ですが、各関数の引数が、
int WriteDataEx(struct student st[],int count){
のようになっていますが、
int WriteDataEx(struct student *st,int count){
のように変えたらかわるかも...?すいません、自信ないです。
[]と*の違いについては以下。
http://www.geocities.jp/ky_webid/c/031.html

初級者

Re: 動的割り当てをすると起こる不具合

#3

投稿記事 by 初級者 » 9年前

関数の引数においては、
st[]

*st
も同じです。

アバター
shiro4ao
記事: 224
登録日時: 10年前
住所: 広島

Re: 動的割り当てをすると起こる不具合

#4

投稿記事 by shiro4ao » 9年前

>ookamiさん
書き換えてみましたが、変化がなかったように思われます。
[]と*の違いについては興味深く読ませていただきました。
ありがとうございます。

>初級者さん
たしかに引数はの場合は[]も*も同じ結果になりました。
ありがとうございます。

過去のソースを見たところ曜日ごとのカウンタである
COUNTER型構造体の配列を実装したバージョンから
STUDENT型の配列の動的割り当てをすると不具合が出るようです。
(COUNTER型構造体が未実装の時は、単なるint型の変数を
 曜日ごとのカウンタとして使っていました。)

また、COUNTER型を疑う理由としては、"malloc result.txt"内で
第一希望しかないにもかかわらず、(授業への)割り当て失敗
と表示されている生徒(278郎さん他)がいることです。
アルゴリズム上はまっさきに(授業を)割り当てられ、
(授業への)割り当て失敗となることはありえないはずなので
曜日ごとのカウンタに不具合があると考えています。

しかし、COUNTER型構造体は動的割り当てに関する変更とは何ら
関係ないので全く関係がないのかもしれません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: 動的割り当てをすると起こる不具合

#5

投稿記事 by softya(ソフト屋) » 9年前

とりあえず試しとして、両方のプログラムにst配列のクリアを入れて満たら結果がおなじになりました。
memset( st,0x00,MAX_STUDENT*sizeof(struct student) );
なので、メモリの初期値に依存して動いている部分があるのは間違いないです。

とりあえず怪しい動作をする部分について、printfで変数値やifの分岐を随時表示してみてください。
コメントが少ないプログラムなんで動作を他人が推測しきれない所があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
shiro4ao
記事: 224
登録日時: 10年前
住所: 広島

Re: 動的割り当てをすると起こる不具合

#6

投稿記事 by shiro4ao » 9年前

>softyaさん
ありがとうございます。
上手く動きました。


また、なぜかCOUNTER型配列を動的に割り当てると
正常な結果が帰ってきました。


原因がよくわかりませんが一応、解決にさせていただきたいと
思います。

ありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: 動的割り当てをすると起こる不具合

#7

投稿記事 by softya(ソフト屋) » 9年前

メモリクリアして動いたのは直ったとは言えませんよ。
勉強のためにプログラムを作っているのなら、ちゃんと原因をつかんだほうが良いと思います。
memset( st,0x00,MAX_STUDENT*sizeof(struct student) );
でも
memset( st,0x01,MAX_STUDENT*sizeof(struct student) );
同じ結果が得られるプログラムを目指すべきです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
shiro4ao
記事: 224
登録日時: 10年前
住所: 広島

Re: 動的割り当てをすると起こる不具合

#8

投稿記事 by shiro4ao » 9年前

>softyaさん
たしかに、このままでは不気味なのですこし調べてみたいと思います。

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: 動的割り当てをすると起こる不具合

#9

投稿記事 by ISLe » 9年前

添付ファイルとやらは削除されてしまったのでしょうか。
何が何やら。

アバター
shiro4ao
記事: 224
登録日時: 10年前
住所: 広島

Re: 動的割り当てをすると起こる不具合

#10

投稿記事 by shiro4ao » 9年前

>ISLeさん
すみません。容量を圧迫するといけないと思って
消してしまいました。
再度添付いたします。
最後に編集したユーザー shiro4ao on 2010年12月08日(水) 23:24 [ 編集 1 回目 ]

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: 動的割り当てをすると起こる不具合

#11

投稿記事 by ISLe » 9年前

添付ファイル見てみました。
"clas in.csv"ファイルに15列しか無いのに、ReadDataExで16列読み込んでいるところは間違っているのではないでしょうか。
scanf系の関数は戻り値(実際に取り込めた項目数)をチェックすべきかと思います。

アバター
pooka
記事: 7
登録日時: 10年前
住所: 福井

Re: 動的割り当てをすると起こる不具合

#12

投稿記事 by pooka » 9年前

少し見ただけですが、

・co配列を初期化せずにRegisterStudentClas Ex関数とかで使用している

コード:

//RegisterStudentClas Ex()で希望の少ない学生から先に割り当てていく
for(i=0;i<6;i++){
	for(j=0;j<=MAX_STUDENT;j++){
		RegisterStudentClas Ex(st,co,j,1,i);	
	}
}
・j < MAX_STUDENTでは?

・csvファイルでは15列しかないのに16列読み込もうとしている

とかでしょうか。


(投稿が禁止されている単語が見つかりましたと出て投稿できなかったので関数名で空白を開けています)

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: 動的割り当てをすると起こる不具合

#13

投稿記事 by ISLe » 9年前

なぜいちいち添付ファイルを削除するのでしょう。
過去ログとしての価値が無くなってしまいます。
添付ファイルを削除しても容量が減るどころか編集履歴分増えると思いますけど。

アバター
shiro4ao
記事: 224
登録日時: 10年前
住所: 広島

Re: 動的割り当てをすると起こる不具合

#14

投稿記事 by shiro4ao » 9年前

大変御迷惑をおかけしました。
添付いたしました。

閉鎖

“C言語何でも質問掲示板” へ戻る