我一直在做一個非常簡單的有限差分代碼,它解決了一維對流方程。 它似乎工作得很好,但如果我增加我使用的數組的大小,我會得到一個分段錯誤錯誤。當我減少時間步或者增加時間間隔時會發生這種情況。 該代碼是由於數組大小而導致分割錯誤?
#include <math.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <cmath>
using namespace std;
int main(){
double xi = 0.0;
double xf = 10.0;
double ti = 0.0;
double tf = 1.0;
的時間間隔,如果是等於1的代碼工作正常。
double x,t;
double dt = 0.1;
double dx = 0.1;
int nstep_x = (xf - xi)/dx;
int nstep_t = (tf - ti)/dt;
double f[nstep_x][nstep_t];
double ex[nstep_x][nstep_t];
// Parameters
const double v = 0.05;
const double D = 0.0001;
const double pi = 3.141592654;
ofstream salida;
salida.open("out");
for (int i = 0 ; i <= nstep_x; i++){
x = xi + dx*i;
f[i][0] = 0.5*sin(pi*x); //Initial conditions
salida << x << " " << 0 << " " << f[i][0] << endl;
}
salida << endl;
for (int n = 0; n <= nstep_t ; n++){
t = ti + n*dt;
for (int i = 1; i <= nstep_x; i++){
x = xi + dx*i;
f[i][n+1] = f[i][n] - ((v*dt)/(2*dx))*(f[i+1][n] - f[i-1][n]); //CONV|SOC
ex[i][n] = 0.5*sin(pi*x - v*t);
salida << x << " " << t << " " << ex[i][n] << " " << f[i][n] << endl;
}
salida << endl;
salida << endl;
}
}
我認爲這不是循環中的數組邊界問題,因爲代碼適用於「小」數組。 我想我一定是做錯了數組處理,但我找不到錯誤。
請注意,'f'和'ex'都是可變長度數組,並且在C++中不是標準的。 – NathanOliver
假設你的編譯器有一個允許[可變長度數組]的擴展(https://en.wikipedia.org/wiki/Variable-length_array),發生崩潰時'nstep_x'和'nstep_t'的值是什麼?而且您知道頂級索引是'nstep_x - 1'(檢查你的循環條件)? –
'n <= nstep_t':我打賭你想'n
malat