2016-06-26 3 views
-2

이 질문은 완전히 다시 작성되었습니다. 다시 한 번 전체 텍스트를 검토해보십시오.충돌을 std :: array 전달에 연결했습니다.


표준 배열을 사용하는 프로그램에 문제가 있습니다. 아래 코드는 전체 프로그램을 가능한 한 제거하고 여전히 오류를 재현하는 것입니다.

어디에 문제가 있는지 알 수 없습니다. 읽을 수 있듯이, 주석 1, 2 (동시에)와 3은 모든 코드 신호 조각을 제거하면 프로그램이 충돌하지 않고 실행됩니다.

또한 costant 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

이 질문은 코드의 타이핑 오류에 관한 것입니다. 위치를 찾기가 어렵지만 문제는 완전히 흥미롭지 않았습니다.

관련 문제