ページ 1 / 1
動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 12:00
by shiro4ao
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)
にて、作成しております。
ファイルが多いため、ファイルを添付いたします。
ご迷惑をおかけします。
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 12:34
by ookami
まだ回答ではないのですが、よろしくお願いします。
テキスト比較ツールで比較してみましたが、確かに
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: 動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 12:39
by 初級者
関数の引数においては、
st[]
も
*st
も同じです。
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 13:04
by shiro4ao
>ookamiさん
書き換えてみましたが、変化がなかったように思われます。
[]と*の違いについては興味深く読ませていただきました。
ありがとうございます。
>初級者さん
たしかに引数はの場合は[]も*も同じ結果になりました。
ありがとうございます。
過去のソースを見たところ曜日ごとのカウンタである
COUNTER型構造体の配列を実装したバージョンから
STUDENT型の配列の動的割り当てをすると不具合が出るようです。
(COUNTER型構造体が未実装の時は、単なるint型の変数を
曜日ごとのカウンタとして使っていました。)
また、COUNTER型を疑う理由としては、"malloc result.txt"内で
第一希望しかないにもかかわらず、(授業への)割り当て失敗
と表示されている生徒(278郎さん他)がいることです。
アルゴリズム上はまっさきに(授業を)割り当てられ、
(授業への)割り当て失敗となることはありえないはずなので
曜日ごとのカウンタに不具合があると考えています。
しかし、COUNTER型構造体は動的割り当てに関する変更とは何ら
関係ないので全く関係がないのかもしれません。
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 15:54
by softya(ソフト屋)
とりあえず試しとして、両方のプログラムにst配列のクリアを入れて満たら結果がおなじになりました。
memset( st,0x00,MAX_STUDENT*sizeof(struct student) );
なので、メモリの初期値に依存して動いている部分があるのは間違いないです。
とりあえず怪しい動作をする部分について、printfで変数値やifの分岐を随時表示してみてください。
コメントが少ないプログラムなんで動作を他人が推測しきれない所があります。
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 15:57
by shiro4ao
>softyaさん
ありがとうございます。
上手く動きました。
また、なぜかCOUNTER型配列を動的に割り当てると
正常な結果が帰ってきました。
原因がよくわかりませんが一応、解決にさせていただきたいと
思います。
ありがとうございました。
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 16:15
by softya(ソフト屋)
メモリクリアして動いたのは直ったとは言えませんよ。
勉強のためにプログラムを作っているのなら、ちゃんと原因をつかんだほうが良いと思います。
memset( st,0x00,MAX_STUDENT*sizeof(struct student) );
でも
memset( st,0x01,MAX_STUDENT*sizeof(struct student) );
同じ結果が得られるプログラムを目指すべきです。
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 16:20
by shiro4ao
>softyaさん
たしかに、このままでは不気味なのですこし調べてみたいと思います。
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 16:23
by ISLe
添付ファイルとやらは削除されてしまったのでしょうか。
何が何やら。
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 16:27
by shiro4ao
>ISLeさん
すみません。容量を圧迫するといけないと思って
消してしまいました。
再度添付いたします。
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 16:47
by ISLe
添付ファイル見てみました。
"clas in.csv"ファイルに15列しか無いのに、ReadDataExで16列読み込んでいるところは間違っているのではないでしょうか。
scanf系の関数は戻り値(実際に取り込めた項目数)をチェックすべきかと思います。
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月08日(水) 17:34
by pooka
少し見ただけですが、
・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列読み込もうとしている
とかでしょうか。
(投稿が禁止されている単語が見つかりましたと出て投稿できなかったので関数名で空白を開けています)
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月09日(木) 01:07
by ISLe
なぜいちいち添付ファイルを削除するのでしょう。
過去ログとしての価値が無くなってしまいます。
添付ファイルを削除しても容量が減るどころか編集履歴分増えると思いますけど。
Re: 動的割り当てをすると起こる不具合
Posted: 2010年12月09日(木) 01:33
by shiro4ao
大変御迷惑をおかけしました。
添付いたしました。