2016-06-26 1 views
-2

この質問は完全に書き直されました。もう一度全文を読むことを検討してください。クラッシュがstd :: arrayを渡すと接続しました


標準の配列を使用するプログラムに問題があります。以下のコードは、完全なプログラムであり、可能な限り削除され、エラーを再現しています。

問題がどこにあるのか理解できませんでした。読んでいただけるように、コメント1、2(両方とも同時に)と3つのコードのすべてが削除されると、プログラムはクラッシュせずに実行されます。

さらに、コストNを3に設定するか、配列の他の値の組み合わせを使用すると、すべてプログラムが完了するまで実行されます。 0で除算してもすべての失敗点について説明することはできません(注釈3を参照)。

#include <iostream> 
#include <array> 
#include <math.h> 

#define N 4 

void f1(std::array<std::array<float, N>, N> a, std::array<float, N> b, std::array<float, N>& c); 
void f2a(std::array<std::array<float, N>, N>& a, std::array<float, N>& b, std::array<float, N>& d); 
void f2b(std::array<std::array<float, N>, N>& a, std::array<float, N>& b, std::array<float, N>& d, int i); 
void f3(std::array<std::array<float, N>, N> a, std::array<float, N> b, std::array<float, N>& c); 

int main() 
{ 
    std::array<std::array<float, N>, N> a = { { { 1, 1, 0, 3 },{ 2, 1, -1, 1 },{ 3, -1, -1, 2 },{ -1, 2, 3, -1 } } }; 
    std::array<float, N> b = { 4, 1, -3, 4 }; 
    std::array<float, N> c; 

    f1(a, b, c); 

    std::cin.get(); 

    return 0; 
} 

void f1(std::array<std::array<float, N>, N> a, std::array<float, N> b, std::array<float, N>& c) 
{ 
    std::array<float, N> d; 

    for (int i = 0; i < N; i++) 
    { 
     d[i] = fabs(a[i][0]); 

     for (int j = 1; j < N; j++) 
     { 
      if (fabs(a[i][j] > d[i])) 
      { 
       d[i] = fabs(a[i][j]); 
      } 
     } 
    } 

    //switching b and d 
    f2a(a, b, d); 

    f3(a, b, c); 

} 

void f2a(std::array<std::array<float, N>, N>& a, std::array<float, N>& b, std::array<float, N>& d) 
{ 
    for (int i = 0; i < (N - 1); i++) 
    { 
     f2b(a, b, d, i); 
    } 
} 

void f2b(std::array<std::array<float, N>, N>& a, std::array<float, N>& b, std::array<float, N>& d, int i) 
{ 
    float float1, float2; 
    int p = i; 

    float1 = fabs(a[i][i]/d[i]); 

    for (int ii = (i + 1); ii < N; ii++) 
    { 
     float2 = fabs(a[ii][i]/d[ii]); 

     if (float2 > float1) 
     { 
      float1 = float2; 
      //11 
      p = ii; 
     } 
    } 

    if (p != i) 
    { 
     //2 
     THE MISTAKE IS HERE, WHERE i IS WRITTEN FOR ii 
     for (int ii = i; i < N; i++) 
     { 
      float2 = a[p][ii]; 
      a[p][ii] = a[i][ii]; 
      a[i][ii] = float2; 
     } 

     //2 
     float2 = b[p]; 
     b[p] = b[i]; 
     b[i] = dummy; 
    } 

} 

void f3(std::array<std::array<float, N>, N> a, std::array<float, N> b, std::array<float, N>& c) 
{ 
    //3 
    c[0] = 0; 
} 
+3

あなたのコードはコンパイルされないので、クラッシュする可能性は低いです。 [mcve]を投稿してください。 – juanchopanza

+0

してください。もう一度試してください – maja

+1

あなたのコードではクラッシュする可能性は低いです。それは本当にあなたの[mcve]ですか? – juanchopanza

答えて

0

この質問は、コードの入力ミスに関するものです。見つけにくいものの、問題は全く面白くありませんでした。

関連する問題