私は "2 x反復"サイズの3つの行列を満たす必要があるシミュレーションを実行しようとしていました。これは(反復=)10^8列と2行です。私はまた、サイズ10^8のベクトルtで動作します。動的メモリ割り当てを使用して、私は次のコードを書いた:ダイナミックメモリ割り当てを使用してCで行列を扱うには?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define T 10000
#define dt 0.0001
#define iterations (T/dt)
/*(more code)*/
int main(){
int i, j;
double *t;
double (*x)[2], (*y)[2], (*c)[2];
t=(double *) malloc((iterations-1)*sizeof(double));
x=(double (*)[2]) malloc((2*(iterations))*sizeof(double));
y=(double (*)[2]) malloc((2*(iterations))*sizeof(double));
c=(double (*)[2]) malloc((2*(iterations))*sizeof(double));
for(i=0; i=1; i++){
x[i][0]=50+500*i;
y[i][0]=300;
c[i][0]=15;
}
for(j=0; j<=iterations-2; j++){
t[j+1]=t[j]+dt;
/*(more code)*/
printf("%G %G %G %G %G %G\n",x[0][j+1],x[1][j+1],y[0][j+1],y[1][j+1],c[0][j+1],c[1][j+1]);
}
return 0;
}
ダイナミックメモリ割り当ては正しく書かれていますか?私は実際に、サイズ "反復"のベクトルtとサイズ "2 x反復"の3つの行列を持っていますか?
そして、行列の各要素を塗りたい場合、たとえば行列xの位置(1,4)に50を入れたいとしたら、x [1] [4] = 50? (最初の "for"のように)
問題は、プログラムを実行するとエラーが発生するということです。セグメント化エラーです。次に、デバッガを使用して次のようになります。
プログラム受信信号SIGSEGV、セグメンテーションフォルト。
X [0] [0] = 50
エラーと最適化を除いて、単純に2つの変数 'x1'と' x2'を使用すると、読みやすさが大幅に向上します。 – Phillip
1) 'malloc'&friendsの結果をキャストしないでください。 2)マジックナンバーを使用しないでください。 3)これはコードレビューサービスではありません。あなたの**具体的な**問題は何ですか? 4)注意: 'sizeof(* x)'等は配列中の1つのエントリのサイズをいつものように与えます。 – Olaf
1つの行列の代わりに2つのベクトルを書きますか?膨大な量のデータと多数のデータを扱っているので、本当に最適なコードが必要です。最初はOctaveで同じシミュレーションを書いていましたが、パラメータに特定の値を設定すると、プログラムは約8時間実行された後にハングアップしました... 特定の問題は、プログラムを実行するとエラーセグメンテーションフォールト( 'コア'が拒否される)が発生するということです –