メモリダイナミックアロケーションはメモリをどう管理してるのですか?
使用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);
}
}