Windowsでエラーが起きる原因とは?

このQ&Aのポイント
  • Windowsではエラーが発生するが、Macでは正常に実行できる
  • エラーメッセージは"XXXXX.exe has triggered a breakpoint."で、VC++上の"malloc.c"タブが開く
  • WindowsとMacの環境の違いが原因でエラーが発生している可能性がある
回答を見る
  • ベストアンサー

Windowsでは出るエラーでMacでは出ない

現在、Visual C++ 2013 Expressを使っているのですが、そちらではエラーが出るのに、MacbookのXcodeで走らせたらエラーも出ずに正常に実行することができます。 いったい何が原因でエラーが起こっているのでしょうか? エラーメッセージは"XXXXX.exe has triggered a breakpoint."で"malloc.c"のタブがVC++上に開きます。以下がそのコードになるのですが、アドバイス宜しくお願い致します。 #define _USE_MATH_DEFINES #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> #include <iostream> #include <complex> #include <stdlib.h> using namespace std; typedef complex<double> dcmplx; complex<double> M_i = dcmplx(0, 1); //--------------------------------------------------------------- // Characteristic Function dcmplx* CharFunc(double alpha, double* nu, double s0, double r, double q, double sigma, double t, int N) { dcmplx* out = (dcmplx*)malloc(sizeof(dcmplx) * N); dcmplx* u = (dcmplx*)malloc(sizeof(dcmplx) * N); for (int j = 0; j < N; ++j){ // j = 1,...,N u[j] = nu[j] - (alpha + 1) * M_i; out[j] = exp(M_i*(log(s0) + (r - q - sigma*sigma / 2.0)*t)*u[j] - sigma*sigma * u[j] * u[j] * t / 2.0); } return out; } // Characteristic Function for C dcmplx CharFuncC(double u, double s0, double K, double r, double q, double sigma, double t, int N) { return exp(M_i*((log(s0) - log(K)) + (r - q - sigma*sigma / 2.0)*t)*u - sigma*sigma * u*u * t / 2.0); } //--------------------------------------------------------------- // Main int main(int, char**) { double alpha[] = { -1.2, -1.5, -5.0, -10.0 }; double eta; double s0; double r; double q; double sigma; double t; double K; int pow2; int N; int m_atm = 0; FILE *fp; if (!(fp = fopen("inputa.txt", "r"))){ printf("File \'inputa\' could not be opened!"); exit(-1); } fscanf(fp, "%lg%lg%lg%lg%lg%lg%d", &eta, &s0, &r, &q, &sigma, &t, &pow2); double a; double b; double v; double abs_ab[] = { 2.0, 5.0, 10.0, 20.0 }; double sum =0; for (pow2 = 7; pow2 <= 10; ++pow2){ N = (int)pow(2.0, pow2); double *nu = (double*)malloc(sizeof(double)* N);// nu * (b - a) / M_PI; double *Vp = (double*)malloc(sizeof(double)* N); double *chi = (double*)malloc(sizeof(double)* N); double *phi = (double*)malloc(sizeof(double)* N); dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N); for (int i = 0; i < 4; ++i){ b = abs_ab[i]; a = -b; cout << "N:" << N << ", (a, b): (" << a << ", " << b << ")" << endl; for (K = 1600; K <= 1900; K += 100){ for (int k = 0; k < N; ++k){ nu[k] = k * M_PI / (b - a); // chi for Put with (c,d) = (a,0) chi[k] = 1.0 / (1.0 + nu[k] * nu[k]) * (cos(nu[k] * (-a)) - exp(a) + nu[k] * sin(nu[k] * (-a))); // phi for Put with (c,d) = (a,0) phi[k] = sin(nu[k] * (-a)) * (1.0 / nu[k]); phi[0] = -a; // COS expasion coeff V for Put Vp[k] = (2.0 / (b - a)) * K * (-chi[k] + phi[k]); // Characteristic Function for C, (just different argument inputs) nu[k] = k * M_PI / (b - a); Phi[k] = CharFuncC(nu[k], s0, K, r, q, sigma, t, N); sum += real(Phi[k] * exp(-M_i*(k*M_PI) * a / (b - a)))*Vp[k]; if (k == 0) sum /= 2.0; } v = exp(-r*t)*sum; cout << "strike=" << K << ", price=" << v << endl; sum = 0.0; } } } system("Pause"); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8524/19375)
回答No.3

>XXXXX.exe has triggered a breakpoint. 意味は「XXXXX.exeはブレークポイントで停止した」です。 malloc.cの所で出るとしたら「ヒープ領域を破壊している」と思います。 Visual C++ 2013の場合、ヒープ領域を破壊すると、mallocの内部で「ブレークポイントで例外停止」するようになっています。 んで dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N); は、明らかにおかしいです。 dcmplx型をN個分確保したいのに、double型をN個分しか確保してません。 正しくは dcmplx *Phi = (dcmplx*)malloc(sizeof(dcmplx)* N); じゃないかと思います。 あと、MacのXcodeでは、ヒープを破壊すると APPNAME_XXX(????,0x????????) malloc: *** error for object 0x????????: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug と言うエラーが出る筈だけど、Visual C++ 2013とは実装が異なるので、偶然「使ってないヒープ領域を壊しただけ」の場合は、エラーも出ないし、何も起きず、普通に「ちゃんと実行したフリ」をする筈です。 ヒープ領域は、壊し方によっては、Visual C++ 2013でも「エラーも出ないし、何も起きず、普通にちゃんと実行したフリをする」で終わるので、なかなかバグが見付からない場合もあります。

codingbeginner
質問者

お礼

おお、何という単純なミス(ただ、仕組みについては複雑?)だったんでしょう! メモリサイズを確保するために同じようにそれ以外の変数同様に行っていたため、コピーペーストで最後の部分だけ書き換え忘れたようです! 修正したら、正しく実行できました!ありがとうございます!

その他の回答 (4)

  • chie65535
  • ベストアンサー率43% (8524/19375)
回答No.5

追記の追記。 mallocされたメモリが開放されないまま、次々に新しいメモリが確保されていき、使い終わったメモリが誰にも開放されないままプログラムが終了している(メモリリークしている)が、Nの最大値は1024くらいなので、ほぼ実害は無い。 doubleの値が数千個分メモリリークした所で今のOSは屁でもないので、ユーザーメモリがちょっと減ってオシマイになるだけ。 このプログラムを何千万回も動かすとか、ずっと常駐させて繰り返し動かすとかすれば、実害が出るだろうけど。

codingbeginner
質問者

お礼

他の方への質問の回答までありがとうございます!これくらいでは問題ないとのことで。 ただ、できるだけ解放する癖をつけておきます!

  • chie65535
  • ベストアンサー率43% (8524/19375)
回答No.4

追記。 scanf系関数について http://www.isc.meiji.ac.jp/~re00030/jse/scanf.html scanf系は 浮動小数点(次の3つは同じである) f 入力を浮動小数(float型)と解釈 e,E 入力を浮動小数(float型)と解釈 g,G 入力を浮動小数(float型)と解釈 オプション l long型の整数またはdouble型の浮動小数点を意味する(小文字のエル) って事になっている。 なので、%gって書いたら、floatのポインタが指定されているとして実行するんで、正しく代入されない。 doubleのポインタを指定する場合は、%lf、%le、%lE、%lg、%lGのどれかを指定すること。 「%gで良い」と言う回答は無視すること。

codingbeginner
質問者

お礼

ありがとうございます!分かって書いたつもりなのに指摘されるとそうなのかな?と思ってしまいました。 他の回答も順次チェックしてコメントしていきます。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

とりあえず……malloc()して、そのあとどこで解放していますかね? >for (pow2 = 7; pow2 <= 10; ++pow2){ のループでそれぞれNはいくつになりますかね?

codingbeginner
質問者

お礼

malloc()と同じループの中に、 free(nu); free(Vp); free(chi); free(phi); free(Phi); を入れてみましたが、dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N)の部分をdoubleのままにしていたら今まで同様のエラーが出ました。dcmplxにしたら、freeをいれても実行できました。 この場合、このfreeは必要なんでしょうか?癖をつけておいた方がいいとか。また、書き方としてはこれで問題ないですよね?

  • f272
  • ベストアンサー率46% (8019/17139)
回答No.1

よく見る気はないけど,とりあえず fscanf(fp, "%lg%lg%lg%lg%lg%lg%d", &eta, &s0, &r, &q, &sigma, &t, &pow2); これの%lgはC89やC++ではエラーじゃないのかなあ。C99では無視されるようだけど。 普通に%gにすればいいのに。

関連するQ&A

  • Cのプログラムに変換

    どなたかこのプログラムをCに変化してくれる方いませんか? なんで変換するのとかの質問はいらないです。 ただ純粋に変換してくれる方いませんか? #include <stdio.h> #include <stdlib.h> #include <math.h> #include <complex.h> #define NREPEAT 1000 int sweepout(float complex **a, int size) { int n,m,k; // 前進消去 for(n=0; n<size; n++) { // 軸の選択 { float amax = cabs(a[n][n]);; float aabs; int npivot = n; for(m=n+1; m<size; m++) { if((aabs = cabs(a[m][n]))>amax) { npivot = m; amax = aabs; } } if(aabs == 0.0) return n; if(npivot != n) { // 軸の交換 float complex t; for(k=n; k<=size; k++) { t = a[n][k]; a[n][k] = a[npivot][k]; a[npivot][k] = t; } } } // 消去 { float complex t; t = 1.0/a[n][n]; // 対角要素 a[n][n] <-- 1 for(k=n+1; k<=size; k++) a[n][k] *= t; // 非対角要素 a[m][n] <-- 0 for(m=n+1; m<size; m++) { for(k=n+1; k<=size; k++) a[m][k] -= a[m][n]*a[n][k]; } } } // 後退代入 { float t; for(n=size-1; n>0; n--) { for(m=0; m<n; m++) a[m][size] -= a[n][size]*a[m][n]; } } return -1; } // 乱数を発生する double drand() { double rn; rn = (2*((double)random()))/((double)(RAND_MAX))-1.0; return rn; } main(int argc, char **argv) { int n, m, k, ncount; double complex **a0; float complex **a; double complex t; double d, r; if(argc>1) n = atoi(argv[1]); if(n <=0) n = 3; srandom((argc>2)?atoi(argv[2]):0); a0 = (double complex **)malloc(n*sizeof(double complex *)); for(m=0; m<n; m++) a0[m] = (double complex *)malloc((n+1)*sizeof(double complex)); a = (float complex **)malloc(n*sizeof(float complex *)); for(m=0; m<n; m++) a[m] = (float complex *)malloc((n+1)*sizeof(float complex)); for(ncount=0; ncount<NREPEAT; ncount++) { // 乱数により、配列の係数を決める(double型) for(m=0; m<n; m++) for(k=0; k<=n; k++) a0[m][k] = drand() + 1.0I*drand(); // 係数をfloat型に変換し、配列 a に代入する for(m=0; m<n; m++) { for(k=0; k<n; k++) a[m][k] = (float complex)a0[m][k]; t = 0; for(k=0; k<n; k++) t += a0[m][k]*a0[k][n]; a[m][n] = (float complex)t; } // 連立方程式を解き、数値解を a[][n] に求める sweepout(a,n); // 2乗誤差を求める d = r = 0; for(m=0; m<n; m++) { d += pow(cabs(a[m][n]-a0[m][n]),2); r += pow(cabs(a0[m][n]),2); } printf("%lf\t\n", 0.5*log10(d/r)); } for(m=0; m<n; m++) { free(a0[m]); free(a[m]); } free(a0); free(a); }

  • 【C言語・BLAS】 行列ベクトル積におけるエラー

    今、BLASを使って行列ベクトル積を計算するのにどれくらい時間がかかるか計測しようとしています。 しかし、短いプログラムにも関わらずC用インターフェースのスレッド並列版BLASを呼び出す部分でFloating point exceptionエラーが出てしまいます。 なぜエラーが出るのか全く分からないので、どなたか分かる方ご意見いただけないでしょうか? #define SEED 1 #define N 100 /* extern void dgemv(char transa, int m, int n, double alpha, double *a, int lda, double *x, int incx, double beta, double *y, int incy); */ int main( int argc, char *argv[] ){  char TRANS = 'T';  int INC = 1;  double ALPHA = 1.0;  double BETA = 0.0;  int i, j, n1, n2;  double **matrix;  double *vector;  double *result;  double start_time;  double end_time;  fprintf( stdout, "____performance evaluation start____\n" );  srand(SEED);  matrix = Malloc2DDouble( N, N );  vector = (double *) malloc ( sizeof(double) * N );  result = (double *) malloc ( sizeof(double) * N );  n1 = N; n2 = N;  #pragma omp parallel  {   #pragma omp for private(j)   for( i=0; i<n1; i++ ){    for( j=0; j<n2; j++ ){     matrix[i][j] = ( ( rand() / (double)RAND_MAX ) - 0.5 );    }    vector[i] = ( ( rand() / (double)RAND_MAX ) - 0.5 );    result[i] = 0.0;   }  }  start_time = GetTime();  dgemv( TRANS, n2, n1, ALPHA, matrix[0], n2, vector, INC, BETA, result, INC );  end_time = GetTime();  return EXIT_SUCCESS; }

  • 2つのvoid関数でmallocを使うと2step目でセグメントエラーが出る

    プログラムのmainを見やすくするためにサブルーチンとしてvoid関数を使っているのですが、その中でmallocでメモリを確保して配列を作ろうとするとエラーが出てしまいます。概略を書くと #include <stdio.h> #include <math.h> #include <stdlib.h> //voidの宣言 void a(double* ,double*, double,); void b(double* ,double*, double,); main(){ double *c,*d,e; double *f,*g,h; c=(double *)malloc(sizeof(double)*N) //Nは適当な整数です d,f,gも同様の処理 色々な作業 while(適当回数繰り返します){ a(c,d,e); b(f,g,h); 色々な作業 } } void a (double* c, double* d, double e){ double **i,*j,; int k; i=(double **)malloc(sizeof(double *)*M) //Mは適当な整数です for(k=0;k<=M;k++){ i[k]=(double *)malloc(sizeof(double)*M) //Mは適当な整数です } jも同様にメモリ確保 様々な作業(逆行列の計算など) } void bはaとほとんど同じです。 mallocで二次元配列や配列を作っています。勿論同じ文字は使っていません。 以上のようなプログラムでgccは通ります。でも実行するとwhile内での1step目は上手くいくのですが、2step目のb内での始めの(double *)malloc(sizeof(double)*L)(Lは適当な整数です)で、つまりメモリ確保でセグメントエラーが出ます。両者とも片方を削るとエラーは出ません。1step目は何故上手くいくのか、2ステップ目で何故ダメなのかが分かりません。皆様の御教授をお願いします。

  • 偏微分方程式、差分法

    Fitzhugh-Nagumo方程式 dU/dt = d/dx(dU/dx) + (a-U)(U-1)U-V (d/dx(dU/dx)はUのxに対する二回微分) dV/dt =e(bU-gV) a=0.1, b=0.5, g=1.0, e=0.01 初期条件 (U,V)=(1,0) if x=0 (U,V)=(0,0) if x>0 境界条件 dU/dx=0 at x=0 dV/dx=0 at x=0 を差分して陽解法で解くと添付の答えになるらしいのですが、自分で解いたところ添付の結果のようになりました。答えと一致しないため、プログラム上で何を間違えているのかご指摘頂けると助かります。 #include <stdio.h> #include <stdlib.h> //exsit()で必要 #include <math.h> int main(){ double a,b,g,e; double dt,dx; int x,t; double **u,**v; int i,j,k; a=0.1;b=0.5;g=1.0;e=0.01; x=100;t=5000.; dt=0.001;dx=0.1; FILE *fp; if((fp = fopen("ResultNagumo.txt","w"))==NULL){ printf("Can't open file\n"); exit(2); } u = (double**)malloc(sizeof(double*)*t); v = (double**)malloc(sizeof(double*)*t); for(i=0;i<t;i++){ u[i]=(double*)malloc(sizeof(double)*x); v[i]=(double*)malloc(sizeof(double)*x); } //初期値 u[0][0]=1.0; v[0][0]=0.0; for(i=1;i<x;i++){ u[0][i]=0.0; v[0][i]=0.0; }    //差分計算 for(i=0;i<t-1;i++){ for(j=1;j<x-1;j++){ u[i+1][j] = u[i][j] + dt*((u[i][j+1]-2*u[i][j]+u[i][j-1])/pow(dx,2)+(a-u[i][j])*(u[i][j]-1)*u[i][j]-v[i][j]); v[i+1][j] = v[i][j] + dt*(e*(b*u[i][j]-g*v[i][j])); } //境界条件 u[i+1][0]=u[i+1][1]; v[i+1][0]=v[i+1][1]; u[i+1][x-1]=u[i+1][x-2]; v[i+1][x-1]=v[i+1][x-2]; }   //結果の出力 for(i=0;i<t;i++){ if((i%100)==0){ fprintf(fp,"%d\n",i); for(j=0;j<x;j++){ fprintf(fp,"%2.4e,",u[i][j]); } } } for(i=0;i<t;i++){ free(u[i]); free(v[i]); } free(u);free(v); fclose(fp); getchar(); return 0; }

  • CからVB

    以下のプログラムはC言語で作成されています。 これをVBで作成したいです。 教えてください。 #include <stdio.h> #include <stdlib.h> double *alloc(int r,int n,int m); void input(double *p,int r,int n,int m); void sumup(double *p,int r,int n,int m); int main(void){ int r, n, m; double *p; // 行列サイズ入力 printf("input r n m "); scanf("%d %d %d",&r,&n,&m); // 行列領域取得 p = alloc(r,n,m); // 行列要素入力 input(p,r,n,m); // 行列の和 sumup(p,r,n,m); //終了,行列領域解放 free(p); return 0; } double *alloc(int r,int n,int m){ double *p; printf("MATRIX[r=%d][n=%d][m=%d]\n\n",r,n,m); p = (double*)malloc(sizeof(double)*r*n*m); if( p == NULL){ printf("error! malloc failed.\n"); exit(-1); } return p; } void input(double *p,int r, int n,int m) { int i,j,k; for(i = 0; i < r; i++){ for(j = 0;j < n; j++){ for(k = 0; k < m; k++){ printf("input MATRIX[%d][%d][%d]= ",i,j,k); scanf("%lf",&p[i*(n*m)+j*m+k]); } } } printf("\n"); } // 行列の和 void sumup(double *p,int r,int n,int m){ int i, j, k; // 0.0, not 0!!! double sum = 0.0; printf("sum of %d matrices:\n",r); for(j = 0; j< n; j++){ for(k = 0;k < m; k++){ sum=0; for(i = 0;i < r;i++){ sum += p[i*(n*m)+j*m+k]; } printf("\n%2f",sum); } } printf("\n"); }

  • 配列のエラーに関して

    java言語を用いて,Householder変換を用いた固有値の数値計算に挑戦してみました.しかし,次のようなエラーが発生し上手くいきません.どなたかこの問題を解決するためにお力をかしていただけないでしょうか. ----------エラー内容-------------------------------------------------------------------------------- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at Out.Mhouse(House.java:90) at House.main(House.java:10) ---------------------------------------------------------------------------------------------------- //Householder変換 public class House{ public static void main(String[] args){ double[][] A = new double[3][3]; int n = A.length; Out out = new Out(); for(int i = 0;i < n;i++){ for(int j = 0;j < n;j++){ if(j < n-1){ System.out.print(out.Mhouse(A)[i][j] + " "); }else if (j == n-1) System.out.println(out.Mhouse(A)[i][j]); }; }; }; }; class Out{ double[][] outpro(double[] x){ int n; n = x.length; double[][] A = new double[n][n]; for(int i = 0;i < n;i++ ){ for(int j = 0;j < n;j++){ A[i][j] = x[i] * x[j]; } } return A; }; double[][] Msca(double a,double[][] A){ int n = A.length; for(int i = 0;i < n; i++){ for(int j = 0;j < n;j++){ A[i][j] = a * A[i][j]; } } return A; }; double selfpro(double[] x){ double a = 0; int n = x.length; for(int i = 0;i < n; i++){ a = a + x[i] * x[i]; }; return a; }; double[] minus(double[] x, double[] y){ int n = x.length; double[] z = new double[n]; for(int i = 0;i < n;i++){ z[i] = x[i] - y[i]; }; return z; }; double[][] house_1(double[] x){ int n = x.length; double[][] A = new double[n][n]; for(int i=0;i < n;i++){ for(int j = 0;j < n;j++){ if(i == j){ A[i][j] = 1 - Msca(2/selfpro(x),outpro(x))[i][j]; }else{ A[i][j] = - Msca(2/selfpro(x),outpro(x))[i][j]; }; }; }; return A; }; double[][] house_2(double[] x){ double[][] z = new double[1][1]; z[1][1] = 1 - 2; return z; }; double[][] Mhouse(double[][] A){ int n = A.length; double[][] H = new double[n][n]; for(int i = 0;i < n;i++){ double[] x = new double[n-i]; double[] y = new double[n-i]; double[][][] L = new double[i][n-i][n-i]; for(int j = 0;j < n-i;j++){ x[j] = A[i][i+j]; if(j == 0){ y[j] = 1; }else{ y[j] = 0; }; x[j] = y[j] - x[j]; }; if(i < n-1){ L[i] = house_1(x); for(int k = 0;k < n-i;k++){ for(int l = 0;l < n-i;l++){ H[i+k][i+l] = L[i][k][l]; }; }; }else if(i == n-1){ L[i] = house_2(x); for(int k = 0;k < n-i;k++){ for(int l = 0;l < n-i;l++){ H[i+k][i+l] = L[i][k][l]; }; }; }; }; double[][] B = new double[n][n]; for(int i = 0;i < n;i++){ for(int j = 0;j < n;j++){ for(int k = 0;k < n;k++){ B[i][j] = H[i][k] * A[k][j]; }; }; }; return A; }; };

    • ベストアンサー
    • Java
  • セグメントエラー

    #include <stdio.h> #define S 10.0 #define L 10.0 void solve(int m,double a[][10],double f[]); main() { double t,me[10][10],fe[10]; int i,x; t=(S*L)/420; me[0][0]=t*156;me[0][1]=t*22*L;me[0][2]=t*54;me[0][3]=t*(-13)*L; me[1][0]=me[0][1];me[1][1]=t*4*L*L;me[1][2]=t*13*L;me[1][3]=t*(-3)*L*L; me[2][0]=me[0][2];me[2][1]-me[1][2];me[2][2]=t*156;me[2][3]=t*(-22)*L; me[3][0]=me[0][3];me[3][1]=me[1][3];me[2][3]=me[3][2];me[3][3]=t*4*L*L; for(i=0;i<4;i++){ fe[i]=1.0; } x=4; solve(x,me,fe); } void solve(int m,double a[][10],double f[]) { /* m=number of unknowns */ int i,j,k; double aa; /* forward elimination */ for(i=0;i<m-1;i++){ for(j=i+1;j<m;j++){ aa=a[j][i]/a[i][i]; f[j]-=aa*f[i]; for(k=i+1;k<m;j++){ a[j][k]-=aa*a[i][k]; } } } /* backward substitution */ f[m-1]/=a[m-1][m-1]; for(i=m-2;i>=0;i--){ for(j=i+1;j<m;j++){ f[i]-=a[i][j]*f[j]; } f[i]/=a[i][i]; } } 以上のようなプログラムについて、コンパイルはできるのですが、実行時に「セグメントエラー」と出てしまいます。たぶん配列の引渡しに原因があるようなのですが、どなたか詳しい原因(対処法)をご教授願いたいと思います。

  • fprintfでの文字化け

    Cで作ったプログラムなのですが最後の部分でファイルに出力すると数字が 文字化けして出てきます(‰など)その原因を教えて頂ければ嬉しいです 他にも何かあれば教えてください プログラミングは詳しくないのでゴロゴロ見つかるかもしれません 【プログラム】 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> int a,i,j,k,t; double p,p1,b; int X[999][1000],Y[999][1000]; int s0,s1,delta; int main(void) { int**X = calloc(sizeof(int),sizeof(int)*1000); int**Y = calloc(sizeof(int),sizeof(int)*1000); FILE *output; output=fopen("monte.dat","w"); b = 0.01; /*逆温度*/ srand((unsigned int)time(0)); /*メモリの確保*/ if( X == NULL ){ exit( EXIT_FAILURE ); } for(i=0; i<=999; ++i){ /* 各列分の領域を割り当てる */ X[i] = (int*)calloc(sizeof(int),sizeof(int)*1000); } if( Y == NULL ){ exit( EXIT_FAILURE ); } for(i=0; i<=999; ++i){ /* 各列分の領域を割り当てる */ Y[i] = (int*)calloc(sizeof(int),sizeof(int)*1000); } /*終わり*/ /*初期配列の設定*/ for(i=0;i<1000;i++){ X[0][i]=a; a = (int)((rand() / ((double)RAND_MAX+1.0)) * 2);//debag } /*終わり*/ for(t=0;t<2;t++){ //debag /*配列中a番目を抽出*/ a = 10; //debag /*終わり*/ /*a番目のスピンを逆にした配列作成*/ for(j=0;j<1000;j++){ Y[t][j] = X[t][j]; } Y[t][a] = (X[t][a]+1)%2; /*終わり*/ /*遷移確率p1計算*/ s0=0; s1=0; for(k=0;k<1000;k++){ s0=s0+pow(-1,X[t][k]+X[t][k+1]);//(11),(00)なら値1 s1=s1+pow(-1,Y[t][k]+Y[t][k+1]);//(10),(01)なら値-1 } delta = -s1 + s0; p1 = 0.5 * (1 - tanh(0.5 * b * delta)); printf("%d %d %d %f ",s0,s1,delta,p1); //←この時点ではX[t][]は正しく出力する /*終わり*/ /*新しい配列(i番目の符号を交換するか)*/ p = (double)((rand() / ((double)RAND_MAX+1.0)) * 1); for(j=0;j<1000;j++){ X[t+1][j] = X[t][j]; } if(p<=p1){ X[t+1][a] = (X[t][a]+1)%2; printf("交換したよ! %d → %d\n",X[t][a],X[t+1][a]); } else{ X[t+1][a] = X[t][a]; printf("交換しないよ!\n"); } /*終わり*/ } /*記入*/ for(i=0;i<1000;i++){ fprintf(output,"%d ",X[0][i]); //←ここが文字化けする } fprintf(output,"\n"); for(i=0;i<1000;i++){ fprintf(output,"%d ",Y[0][i]); //←出力されない } /*終わり*/ fclose(output); return 0; } 【プログラム終】

  • 上三角行列の解を出力するプログラム

    /*下記のプログラムで”1回目”という部分以降の繰り返し計算がうまくいきません.エラーは出ませんが,何が間違っているか,お気づきの点を教えてください,よろしくお願いします(..) */ #include <stdio.h> #include <stdlib.h> #include <math.h> int main(){ FILE *fp; //*fp fopen("kadai2.dat","w"); //数値結果エラー表示 if((fp=fopen("kadai2.dat","w"))==NULL){ printf("error\n"); exit(1); } int i,j,k; double r=2,ta=1000,tb=0;//r,ta,tb const int N=10;//N const int T=1;//N const int m=N-1;//mは(N-1)とりあへず一定にしないと定まらないみたい const int n=N-1;//n=N-1 とりあへず一定にしないと定まらないみたい const int t=T;//n=N-1 とりあへず一定にしないと定まらないみたい //行列定義aa,xx double a[m+2][n+2],**aa,a1,x1; double x[n+2][t],**xx; aa=( double **) malloc((unsigned) m*sizeof(float*)); for(i=0;i<=m-1;i++){ aa[i]=a[i]; } xx=( double **) malloc((unsigned) n*sizeof(float*)); for(i=0;i<=n-1;i++){ xx[i]=x[i]; } //xx[n][t]初期化 x[0][],x[10][]以外 for(i=1;i<=n+1;i++){ x[i][0]=0; } //huyou double b[n+2][t],**bb; bb=( double **) malloc((unsigned) m*sizeof(float*)); for(i=0;i<=m-1;i++){ bb[i]=b[i]; } //************************************ 入れなおしでx完成 //kの繰り返し開始 for(k=0;k<=T;k++){ //aaに初期値 初期化 for(j=0;j<=N;j++){ for(i=0;i<=N;i++){ a[j][i]=0; } } //aaに値代入 for(i=0;i<=N-1;i++){ a[i][i]=1+2*r; a[i+1][i]=-r; a[i][i+1]=-r; } //xx[n][t]初期化 x[0][],x[10][] x[0][k]=ta; x[10][k]=tb; //xx[n][t]値代入 j x[1][k]=x[1][k]+r*x[0][k]; x[N-1][k]=x[N-1][k]+r*x[10][k]; //************************************計算部 //printf("*********************** %d\n",k); //1回目 for(j=1;j<=N-2;j++){ for(i=1;i<=N-1;i++){ a[j+1][i]=a[j+1][i]-a[j][i]*a[j+1][j]/a[j][j]; } x[j+1][k]=x[j+1][k]-x[j][k]*a[j+1][j]/a[j][j]; } for(j=1;j<=N-1;j++){ for(i=1;i<=N-1;i++){ printf("%4.2fl",a[j][i]); } printf("\n"); } //2回目 for(j=1;j<=N-2;j++){ for(i=1;i<=N-1;i++){ a[N-1-j][i]=a[N-1-j][i]-a[N-j][i]*a[N-1-j][N-j]/a[N-j][N-j]; } x[N-1-j][k]=x[N-j-1][k]-x[N-1-j][k]*a[N-1-j][N-j]/a[N-j][N-j]; } //3回目 for(i=1;i<=N-1;i++){ x[i][k]=x[i][k]/a[i][i]; } //答え出てきたら //ファイルに結果放り込む※時間変化表示 n x t for(i=0;i<=N;i++){ fprintf(fp,"%d %10.5fl %d\n",i,x[i][k],k); //printf("%d %10.7g %d\n",i,x[i][k],k); } //出てきたxを次の時間用に入れなおし for(i=0;i<=8;i++){ x[i][k+1]=x[i][k]; } }//kの繰り返し終了 fclose(fp); return 0; }

  • FFTのソースについて

    512個のデータに対してFFTをかけ、変換後の絶対値を得たいのですが矢印の部分でプログラムがとまり、特にエラーメッセージも出ません。 原因がわかりません。申し訳ありませんが、よろしくお願いします。 void FFT(int x[], int y[]) {    int d, dn, pow, m, j1, j2, exp2, j , k, ndv2, t, flags= 1;    int n_data = 0, dnumb = 512, nf, jk;    double w, arg, c, s, t1, t2, t0, dt, ana, anb, answer;    double [] xr = new double[512];    double [] xi = new double[512]; dn=dnumb; w=6.283185303/dnumb; pow=exp2(dnumb); *2の何乗かを計算するメソッドです for(t = 0; t < 512; t++){ if(t < 500) xr[t] = x[t]; else xr[t] = xr[499]; xi[t] = 0; } for(int i=1; i<=pow ; i++) { m=dn; dn=dn/2; arg=0; for(int j=1; j<=dn; j++) { c=Math.cos(arg); s=-flags*Math.sin(arg); arg=arg+w; k=m; while(k<=dnumb) { j1=k-m+j; j2=j1+dn; →→→→→→→  t1=xr[j1]-xr[j2]; t2=xi[j1]-xi[j2]; xr[j1]=xr[j1]+xr[j2]; xi[j1]=xi[j1]+xi[j2]; xr[j2]=c*t1+s*t2; xi[j2]=c*t2-s*t1; k=k+m; } } w=2*w; } j=1; ndv2=dnumb/2; for(int i=1; i<=(dnumb-1); i++) { if(i<j) { t1=xr[j]; t2=xi[j]; xr[j]=xr[i]; xi[j]=xi[i]; xr[i]=t1; xi[i]=t2; } k=ndv2; while(k<j) { j=j-k; k=k/2; } j=j+k; } for(t = 0; t < 512; t++){ ana = Math.pow(xr[t], 2); anb = Math.pow(xi[t], 2); answer = Math.pow(ana + anb, 0.5); } if (flags==1) { for(int j=1; j<=dnumb; j++) { xr[j]=xr[j]/dnumb; xi[j]=xi[j]/dnumb; } } }

    • ベストアンサー
    • Java

専門家に質問してみよう