2012-04-12 12 views
0

多次元配列で作業していますが、例外が出ますが、私は多くを検索しましたが、私が使用している答えは同じですが、例外はmatriz [i] = new二倍[n]。私はコメントなしとコメントなしの両方のソリューションを運がないと試みました。私は、この関数の外でテストしているので、C++の動的行列

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); 
} 

--- EDIT ---

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

Interpolacion.exeで0x00071c4dの初回例外:0xc0000005で: アクセス違反読み取り場所0x00000000の

nがスローされた10以上

例外があることはありません。 Interpolacion.exeの0x774b15deで未処理の例外が発生しました。0xC0000005:0x00000000の場所を読み取るアクセス違反。 プログラム '[8012] Interpolacion.exe:Native'がコード-1073741819(0xc0000005)で終了しました。

---- EDIT ---- 私は最終的にそれが働いてしまった、問題はマトリズではなく、arr_x/arr_y、外部ルーチンがデータを送信間違った(奇妙なエラーとスタックトレースではなかったです

+2

?それ以外の場合は、配列の境界を越えて実行することができます。とにかく、これはひどいコードです。長方形の行列が必要な場合は、平坦化された1次元配列、あるいはBoost.MultiArrayのようなものを使用するとよいでしょう。裸のポインタは、一般的にC++では悪いスタイルです。 –

+0

この関数を呼び出すときのnの値は何ですか?私は255より多いと確信しています。 –

+0

@KerrekSB申し訳ありませんが255ビットは私が走ったテストでしたが、私はnで試しました。 Boost.MultiArrayをお試しいただきますようお願い申し上げます。 –

答えて

1

std::vectorルートを使用する場合は、以下のようなものを使用できます(テストされていない、ガイドとしてのみ示されています)。 `255`実際には 'N'であるべき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); 
} 
+0

ありがとう!私は今日このソリューションを試してみますが、最終的には問題はありませんでしたが、問題はmatrizではなくarr_xで外部ルーチンがデータを間違って送信していました(奇妙なことにエラーとstacktraceは常に新しいdouble [割り当て) –

0

例外の原因となるコードには何も表示されません。問題を引き起こすのはgaussiana()である必要があります。その行をコメントアウトして、プログラムがまだ失敗していないかどうか確認してください。

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

関数が複数回呼び出された場合、メモリリークにより重大なヒープ不足が発生し、malloc()が失敗する可能性があります。

+1

最新のオペレーティングシステムでは、十分なメモリが残っていなくても、 'malloc'は有効なポインタを返します(オーバーコミットなどと呼ばれていると思います)。 – dreamlax

+0

@dreamlax:これを実行するオペレーティングシステムは何ですか? 'malloc()'のエラー処理は元のC言語ではっきりと指定されていました。 – wallyk

+0

Linuxはそれを行います。私が使用していたディストリビューションは覚えていませんが、2GBのRAMがあり、 'malloc()'から2GBのメモリを要求し、動作しました。各ページに1バイトずつ)。プロセスは "OOM Killer"によって殺されました。 – dreamlax