- ベストアンサー
メモリダイナミックアロケーションはメモリをどう管理してるのですか?
使用PC:東芝TECRA M9 2015MBメモリ、Intel(R)Core(TM)2 Duo CPU 2.50GHz Windows Vista Business 以下のC プログラムで入力データM=3のもとにNの値を3から4へ、4から5へと増加させN=17まで上記PCで正常計算ができた。N=18にしたらWindowsが申し訳ありませんがエラーが起きました。Micorsoft へエラー報告しますか?という例のエラーWindowsが表れて異常計算終了する。 N=18でこのエラーが起きたのでメモリ確保ができなくて異常終了したのだと思います。Windowsでなく、Linuxマシーンで実行させればエラーにならないのでしょうか? //Jensen 2007-11-16作成 #include <stdio.h> #include <time.h> #include <string.h> #include <stdlib.h> #include <float.h> #define MMAX 24 #define NMAX 25 #define ldmax 100 float d[NMAX+1][NMAX+1]; float point[NMAX][ldmax]; unsigned int NS[MMAX+1]; float dij(int i,int j,int N,int ld); int Makeup_eval(int N,int k,float eval[],int ks); float evaluate(int N,int k,int w[]); int Outputdij(int N,int ld); int Subsets(int N,int K, int k, int tbl[], int ks); int Prepare_Network(int M, int N, short int min[], short int max[]); int main() { unsigned int kk, k; int ks,M,N,K,i,j,ld,dummy,ds,is,stateKm1k; int **state,**trace_back,state_tbl[65536];//33554432=2**NMAX=2**25 needs about 2MB memory which causes difficult error at excution. //Note that 2**15=65536. short int min[NMAX+1],max[NMAX+1]; float eval[65536; char pbname[101]; clock_t start; float **dpv; FILE *in,*out; in=fopen("InCluster.txt","r"); out=fopen("OutCluster.txt","w"); start = clock(); printf("Time One:%d 秒\n",(clock()-start)/CLOCKS_PER_SEC); fscanf(in,"%s",pbname); fscanf(in,"%d %d %d",&M,&N,&ld); for(i=0;i<N;i++)//N kono data. {//8retsu me no tyuukakko. fscanf(in,"%s",&dummy);// i=0 ya i=1 wo yomitobasu. for(k=0;k<ld;k++)//ld dimension. { fscanf(in,"%f",&point[i][k]); } } //Debug write of point.Start. 2007-12-4, point no debaggu. // for(i=0;i<N;i++) { for(k=0;k<ld;k++)//ld dimension. { printf(" point[%d][%d] = %f",i,k,point[i][k]); } printf("\n"); } // //point no debaggu.End of debug write of point, 2007-12-4. strcat(pbname,"HIK"); fprintf(out,"%s\n",pbname); fprintf(out,"M = %d N = %d ld = %d\n",M,N,ld); fprintf(out,"\n\n"); fprintf(out,"CLUSTERS with Optimal Objctive value"); printf("CLUSTERS with Optimal Objctive value"); if(!((1<=ld)&&(ld<=ldmax))) { printf("Error NO 510"); return 510; } if(!((2<=M)&&(M<=N)&&(N<=NMAX))) { printf("Error NO 520"); return 520; } // //この間にイニシャライゼーション計算部分がありますが全角2000文字以内の制約で省略しました。以下のnew 命令以外の原因が見当たらないのですが、new 命令で大域変数として確保されるのなら2015MBメモリを持つ私のPCがWindowsの原因不明により異常計算終了する理由はなんなのでしょうか? // //ダイナミックアロケーションはC++文法で確保しないと文法エラーになる。// state = new int*[M + 1]; trace_back = new int*[M + 1]; dpv = new float*[M + 1]; for(K = 0;K <= M;K++) { state[K] = new int[NS[K]]; if(!state[K]) { printf("Allocation Error of state[%d].520",K); } } for(K=0;K<=M;K++) { trace_back[K] = new int[NS[K]]; if(!trace_back[K]) { printf("Allocation Error of trace_back[%d].520",K); } } for(K=0;K<=M;K++) { dpv[K] = new float[NS[K]]; if(!dpv[K]) { printf("Allocation Error of dpv[%d].530",K); } }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず,どの行でエラーが発生するのか突き止めるべきです. 開発環境がなんなのか解りませんが,デバッグツールの ステップ実行やブレークポイントを利用して確かめてみてください. 例:VCの場合 http://www.nitoyon.com/vc/tutorial/debug/ (配列の添字に使用している)変数の値を増やすと破綻するのは, おそらく確保した配列の大きさ以上のところにアクセスしているからだと思います.Linuxでも同様に起こると思われます. メモリ確保が原因とは考えにくいです.
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
#1 のいう通り, どこでエラーが起きているかがわからないとどうしようもありません. 実は NS[K] の値が狂ってるとかいうオチもあったりして. ちなみに new で失敗するとその次の if すら実行されないので注意.
お礼
[ちなみに new で失敗するとその次の if すら実行されないので注意.] など、参考になりました。Microsoft VisualC++.NET を使用しています。Visual C++6.0 のほうがdebug はしやすかったですね。Microsoft Visual C++.NET のほうからのエラーメッセージが何もなくて、いきなりWindows Vista が「エラーが起こった。Microsoft へ報告しますか」という例のメッセージだけを出してくるのは不親切にもほどがあります。出入りの業者の話ではMicrosoft Vista使用した応用ソフト製品を開発している企業にはVistaやMicrosoft 製品の内部情報を詳しく開示するそうです。契約にもとズいてです。単なる製品使用者にはなんの手当てもしない、してほしかったら技術相談料30万円を払えなどという態度には我慢ができません。 TURBO C++ という製品が昔ありました。BORLAND C++ の簡易廉価版でした。配列aを使用パソコンから考えられる最大メモリを超えて使用すると、他の使用中のデータメモリ領域bをaとして黙って使用してしまいます。この時も原因不明で3,6月困りましたがあるときひょんなことからこのバグの原因・理由を発見しました。a[10000]と配列の大きさを10000 と宣言しても10001や10002を使用することを許してしまい、そのときほかのデータ領域を無断で使用するという欠点は1070年代と変わっていません。
お礼
了解。最後はここに誰でも来ますよね。ありがとうございました。