-1

에 대한 호출에 대해 일치하는 함수가 없습니다. C++에 매우 익숙하며 jacobi 메서드에 대해 지정된 반복 횟수를 수행하는 함수 "jacobi"를 호출하려고합니다 (또는 적어도 그렇게 할 수 있기를 바랍니다). 내가 'jacobi'라고 부르는 줄에서 "일치하는 함수가"jacobi "에 호출되지 않습니다. 다른 게시물을 읽었으며이 코드를 내 코드에 적용하려고했지만 실패했습니다. .이 문제를 일으키는 내 코드에 다른 문제가 언급 한 바와 같이 나는 아주 새로운 C++에서 그래서 어떤 도움을 주시면 감사하겠습니다 오전 나를 위해 그것을 무너 뜨리는하시기 바랍니다있다오류 :

#include <iostream> 
using namespace std; 

void jacobi (int size, int max, int B[size], int A[size][size], int init[size], int x[size]){ 

    //// 
    //// JACOBI 
    //// 

    int i,j,k,sum[size]; 
    k = 1; 
    while (k <= max) // Only continue to max number of iterations 
    { 

     for (i = 0; i < size; i++) 
     { 
      sum[i] = B[i]; 

      for (j = 0; j < size; j++) 
      { 

       if (i != j) 
       { 
        sum[i] = sum[i] - A[i][j] * init[j]; // summation 
       } 
      } 
     } 
     for (i = 0; i < size; i++) ////HERE LIES THE DIFFERENCE BETWEEN Guass-Seidel and Jacobi 
     { 
      x[i] = sum[i]/A[i][i]; // divide summation by a[i][i] 
      init[i] = x[i]; //use new_x(k+1) as init_x(k) for next iteration 
     } 
     k++; 
    } 

    cout << "Jacobi Approximation to "<<k-1<<" iterations is: \n"; 
    for(i=0;i<size;i++) 
    { 
     cout <<x[i]<< "\n"; // print found approximation. 
    } 
    cout << "\n"; 

    return; 
} 

int main(){ 
    // User INPUT 
    // n: number of equations and unknowns 
    int n; 
    cout << "Enter the number of equations: \n"; 
    cin >> n; 

    // Nmax: max number of iterations 
    int Nmax; 
    cout << "Enter max number of interations: \n"; 
    cin >> Nmax; 

    // int tol; 
    // cout << "Enter the tolerance level: " ; 
    // cin >> tol; 

    // b[n] and a[n][n]: array of coefficients of 'A' and array of int 'b' 
    int b[n]; 
    int i,j; 
    cout << "Enter 'b' of Ax = b, separated by a space: \n"; 
    for (i = 0; i < n; i++) 
    { 
     cin >> b[i]; 

    } 

    // user enters coefficients and builds matrix 
    int a[n][n]; 
    int init_x[n],new_x[n]; 
    cout << "Enter matrix coefficients or 'A' of Ax = b, by row and separate by a space: \n"; 
    for (i = 0; i < n; i++) 
    { 
     init_x[i] = 0; 
     new_x[i] = 0; 
     for (j = 0; j < n; j++) 
     { 
      cin >> a[i][j]; 
     } 
    } 
    jacobi (n, Nmax, b, a, init_x, new_x); 
} 
+1

매개 변수로 배열을 전달할 수 없으며 대부분 참조 또는 포인터를 전달할 수 있습니다. 매개 변수 인'int B [size]'문법은 불행한 거짓말이며, 사실상'int * B'만이 유효합니다. –

+0

@UlrichEckhardt가 말한 것에 덧붙여,이 문제는 매개 변수'int A [size] [size] '에 있습니다. 그것은 "길이가'size' 인 int 배열이나 int (*) [size]'에 대한 포인터로 조정됩니다. 그런 다음 호환되지 않는 인수로 호출합니다. 또한 가변 길이 배열 (VLA)은 비표준 컴파일러 확장입니다. – juanchopanza

+1

진술 : 프로그램의 모든 줄을 차례로 제거해보십시오. 대부분을 오류를 변경하지 않고 제거 할 수 있습니다 (예 : 'jakobi()'의 전신. 당신은 최소한의 예를 제시해야합니다. –

답변

0

문제 :.

있습니다 배열의 사용과 관련된 몇 가지 문제 :

  • 배열을 값으로 매개 변수로 전달할 수 없습니다. 크기는
  • 당신은 사물의 모든 종류의 작업을 수행하는 방법이 있습니다 물론 C++

에 가변 길이의 배열을 정의 할 수 없습니다 변수 경우

  • 당신은 매개 변수로 다차원 배열을 전달할 수 없습니다, (동적 할당, 포인터 사용)을 사용하고 추가 작업 (특히 다차원 배열 요소 액세스)이 필요합니다.

    다행히도 훨씬 쉬운 해결책이 있습니다!

    솔루션 :

    vector 가야 코드의 종류 :이 가변 길이를 관리하고 값에 의해 전달 될 수 있습니다. 모든 벡터가의이라는 벡터 변수의 크기가 될 수 있으며,이 jacobio 구현은 가정

    void jacobi(int size, int max, vector<int> B, vector<vector<int>> A, vector<int> init, vector<int> x) { 
        int i, j, k; 
        vector<int> sum(size); // vector of 'size' empty elements 
    
        // The rest of the function will work unchanged 
        ... 
    } 
    

    주의 그러나 다음 jacobi() 함수의

    , 당신이해야 할 모든 정의를 변경하는 것입니다 예상 크기. 전문가 수준의 코드에서는 그 경우인지 확인해야합니다.

    main() 구현의 경우 코드는 거의 변경되지 않습니다.

    ... 
    vector<int> b(n); // creates a vector that is initialized with n elements. 
    ... 
    vector<vector<int>> a(n,vector<int>(n)); // same idea for 2 dimensional vector (i.e. a vector of vectors) 
    vector<int> init_x(n), new_x(n); // same principle as for b 
    ...