0

多次元配列を使用していますが、例外が発生します。多くの検索を行いましたが、使用しているのと同じ答えが見つかりました。matriz[i] = new double [n]を割り当てようとすると、例外がジャンプします。コメント付きのソリューションとコメントなしのソリューションの両方を試しましたが、運がありませんでした。

void interpol(double *arr_x, double *arr_y, int n, double *results) {
    //double** matriz = new double*[n];
    double** matriz;
    matriz = (double**) malloc(n * sizeof(double*));
    for(int i = 0; i < n; i++){    
        //matriz[i] = new double[n+1];
        matriz[i] = (double*) malloc(n+1 * sizeof(double));
        for(int j = 0; j < n; j++) {
            matriz[i][j] = pow(arr_x[i],j);
        }
        matriz[i][n] = arr_y[i];
    }
    gaussiana(matriz, n, results);
}

- - 編集 - -

この関数の外部でテストしたので、関数gaussianaは正常に機能しています。例外は次のいずれかでスローされます。//matriz[i]=new double [n]; matriz [i] =(double *)malloc(n * sizeof(double));

nが10を超えることはありません。

スローされる例外は次のとおりです。

Interpolacion.exeの0x00071c4dでのファーストチャンス例外:0xC0000005:アクセス違反の読み取り場所0x00000000。Interpolacion.exeの0x774b15deで未処理の例外:0xC0000005:アクセス違反の読み取り場所0x00000000。プログラム'[8012]Interpolacion.exe:Native'がコード-1073741819(0xc0000005)で終了しました。

----編集----私はついにそれを機能させました、問題はmatrizにありませんでした、しかしarr_x / arr_yで、外部ルーチンはデータを間違って送信していました(奇妙なことにエラーとスタックトレースは常に私に新しいdoubleを参照しました[n]割り当て)

4

2 に答える 2

1

ルートを使用する場合はstd::vector、以下のようなものを使用できます(テストされていない、ガイドとして表示されています)。とstd::vector<std::vector<double> >は互換性がないため、新しいタイプを受け入れるように関数を書き直す必要がある場合があることに注意しdouble **てください。gaussiana

// Include the header!
#include <vector>


// Be careful about the use of "using namespace std", I'm only using it here
// because it's a small example
using namespace std;

vector<vector<double> > matriz;

for (int i = 0; i < n; i++)
{
    // Create a new vector "v" with n+1 elements
    vector<double> v(n + 1);

    // fill this vector
    for (int j = 0; j < n; j++)
        v[j] = pow(arr_x[i], j);
    v[n] = arr_y[i];   

    // add it to the matrix
    matriz.push_back(v);
}
于 2012-04-12T06:57:19.590 に答える
0

コードに例外の原因となるものは何もありません。gaussiana()トラブルの原因になっているに違いありません。その行をコメントアウトして、プログラムがまだ失敗するかどうかを確認してください。

の範囲を知っておくと便利ですn。最新の32ビットまたは64ビットマシンで比較的小さい(<1000)限り、malloc()失敗することはありません。ただし、プログラムが制限されたメモリで実行されている場合、またはプログラムnが大きい場合は、一部mallocのが失敗する可能性があります。NULLが返されるかどうかのチェックがないため、プログラムは、ポインターを逆参照しようとすると、SEGFAULTingによって問題を示します。

関数が複数回呼び出されると、メモリリークによってヒープが大幅に不足し、malloc()失敗する可能性があります。

于 2012-04-12T06:14:02.810 に答える