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