2017-11-15 3 views
-1

だからこんにちは。デバッグがスムーズに実行されている間に奇妙なプログラムがクラッシュする(Elipse C++)

私は大学で私のアルゴリズムの数学の授業のためのプログラムを書いていると私は、MinGWの6.3.0でEclipseのOxygen.1aリリース(4.7.1a)に勝利7(x64の)を使用しています。

私が構築し、それは窓が「Abgabe3.exeは動作を停止]をしかし、私は、プログラム全体をトラフステップと、それはエラーなしで終了し、デバッガおよびブレークポイントを使用して問題を発見しようとすると主張してcrahesプログラムを実行するたびに...

問題のある関数で使用されていないものはすべて取り除き、すべてを別々のファイルにコピーして、正確な問題が発生しました。 誰かが私の側で何が起こったかの手がかりを持っているかもしれません。 ^^

#include <math.h>  /* pow, sqrt */ 
#include <iostream>  /* cin, cout */ 
#include <new>   /* new */ 
#include <string>  /* string */ 
#include <stdlib.h>  /* srand, rand */ 
#include <time.h>  /* time */ 

using namespace std; 


void NORM(double* res, double* x, int n){ 
    res[0] = 0.0; 
    for(int i = 0; i < n; i++){ 
     res[0] += pow(x[i], 2); 
    } 
    res[0] = sqrt(res[0]); 
} 

void initRand(double* x, int n){ 
    srand (time(NULL) * rand()); 
    for(int i = 0; i < n; i++){ 
     x[i] = (((double) rand())/((double) RAND_MAX)); 
    } 
} 

void createArray(double* &x, int n){ 
    if (n > 0){ 
     x = new double[n]; 
     initRand(x, n); 
    } 
} 

void printArray(double* x, int n){ 
    if (x != NULL){ 
    cout<<"(\n"; 
    for(int i = 0; i < n; i++){ 
     if(i+1 == n) cout<<x[i]; 
     else if ((i % 5) == 0) cout<<x[i]; 
     else if (((i+1) % 5) == 0){ 
      cout<<", "<<x[i]<<"\n"; 
     } 
     else { 
      cout<<", "<<x[i]; 
     } 
    } 
    cout<<"\n)\n"; 
    } 
    else cout<<"\nError: pointer = NULL\n"; 
} 

unsigned long long int bin(unsigned int n, unsigned int k){ 
    unsigned long long res = 1; 
    if(k == 0) return 1; 
    else if(n >= k){ 
     for(unsigned long long int i = 1; i <= k; i++){ 
      res *= (n + 1 - i)/i; 
     } 
    } 
    else return 0; 
    return res; 
} 

void newArray(double** x, unsigned int v, unsigned int n){ 
    for(unsigned int i = 0; i < v; i++){ 
     double* ptr = x[i]; 
     createArray(ptr,n); 
     x[i] = ptr; 
    } 
} 

void experiment(double** vektorArray){ 
    unsigned int n = 10, v = 20; 
    cout<<"Dimension n = "<<n<<"\nAnzahl Versuche v = "<<v<<endl; 
    //Erstellen der Vektoren 
    cout<<"Erstellen - starte\n"; 

    vektorArray = new double*[n]; 
    newArray(vektorArray, v, n); 

    cout<<"Erstellen - fertig\n"; 

    for(unsigned int i = 0; i < v; i++){ 
     if(i%10 == 0) printArray(vektorArray[i], n); 
    } 
} 
int main(int argc, char** argv){ 
    double** vektorArray = NULL; 
    experiment(vektorArray); 
    return 0; 
} 
+0

無関係:乱数ジェネレータがシードされる前に乱数ジェネレータに乱数をシードするのは少し奇妙です。 'srand(time(NULL)* rand());'は ''ライブラリの使用がうまく行かないことをあなたにとっては大いに役立つと思います。 – user4581301

+0

無関係: 'pow'はpiのような狂気のようなものを計算するように設計されています。広場にそれを使用することは、大過剰です。あなたはたいていいつも 'x * x'の方が良いです。 – user4581301

+0

時間をかけて播種するときに問題が発生しました(NULL)。ベクターだけが同じように生成され、この奇妙なsranを思いつきました。^^正方形を計算するためにpowを使用しません! :D – Tignite

答えて

2
vektorArray = new double*[n]; 

サイズnのアレイを作成し、それv有するアレイ

void newArray(double** x, unsigned int v, unsigned int n) 
{ 
    for (unsigned int i = 0; i < v; i++) 
    { 
     double* ptr = x[i]; 
     createArray(ptr, n); 
     x[i] = ptr; 
    } 
} 

for (unsigned int i = 0; i < v; i++) 
{ 
    if (i % 10 == 0) 
     printArray(vektorArray[i], n); 
} 

インデックス。あなたの変数を超えているように見えます。これをより明確にするために、変数をよりわかりやすく説明的な名前にすることを強く推奨します。

+0

彼らは非descictiveであること以外に、彼らは正しいです。ベクトルのカウンターとして、n次元のベクトルとv(ドイツ語の "versuche" = trial)が必要です。配列自身は 'createArray(ptr、n);で作成されます。 printArray(vektorArray [i]、n);で印刷されます。変数は問題ではありません。 – Tignite

+0

@Tignite彼らは正しいかもしれませんが、あなたの使い方は間違っています。 'vektorArray'には10スロットが割り当てられます。 'for(unsigned int i = 0; i user4581301

+0

私はあなたの最初の見積もりを見落とし、「新しいダブル[n]」に気付かなかった!私は修正し、私は家に帰った後にそれを試してみますが、なぜこれがエラーを引き起こさないのか理解できません。 – Tignite