Incompatible types in assignment of ‘double’ to ‘double [1000]’

0

Cześć, mam w kodzie taki błąd incompatible types in assignment of ‘double’ to ‘double [1000]’ który pojawia się przy przekazywaniu tablicy do funkcji.

Kod:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <chrono>

#define N 1000

double thomasAlgorithm(double A[N][N], double G[N])
{
    double b, y, B[N], Y[N], U[N];

    b = -1.0 * (A[1][0] / A[0][0]);
    B[0] = b;

    y = G[0] / A[0][0];
    Y[0] = y;

    for (int i = 1; i < N - 1; i++)
    {
        b = -1.0 * ((A[2][i]) / ((A[0][i]) * B[i - 1] + A[1][i]));
        B[i] = b;

        y = (G[i] - A[0][i] * Y[i - 1]) / (A[0][i] * B[i - 1] + A[1][i]);
        Y[i] = y;
    }
    B[N - 1] = 0;
    Y[N - 1] = 0;

    U[N - 1] = Y[N - 1];
    for (int j = N - 2; j > 0; --j)
    {
        U[j] = B[j] * U[j + 1] + Y[j];
    }
            return *U;
}

int main()
{    
double A[3][N];
    double X[N], D[N];  // wektor 'x', wektor 'd'
    double h = 2.0 / N; // wzor na h

    /* WPROWADZENIE WARTOŚCI DO MACIERZY Ax=d */

    for (int n = 0; n < N; n++)
    {
        A[0][n] = 1.0;
        A[1][n] = 4.0;
        A[2][n] = 1.0;
    }

    for (int n = 0; n < N - 1; n++)
    {
        D[n] = (6.0 / h * h) * (f(-1.0 + n * h) - 2 * (f(-1.0 + (n + 1) * h)) + f(-1.0 + (n + 2.0) * h));
    }

    /* WPROWADZENIE WARTOŚCI DO MACIERZY Bu=v*/

    double B[3][N];
    double U[N], V[N];  // wektor 'u', wektor 'v'
    double y=1;

    for(int p=0;p<N;p++)
    {
        B[0][p]=0;
        B[1][p]=0;
        B[2][p]=0;
        U[p]=0;
        V[p]=0;
    }

    B[0][0]=A[1][0]-y;//wyjątek
    B[1][0]=A[2][0];
    for (int n = 1; n < N-1; n++)
    {
        B[0][n] = A[0][n];
        B[1][n] = A[1][n];
        B[2][n] = A[2][n];
    }
    B[0][N]=A[0][N];//wyjątek
    B[1][N]=A[1][N]-((A[2][N]*A[0][0])/y);

    U[0]=y;
    U[N]=A[2][N];

    V[0]=1;
    V[N]=A[0][0]/y;


    double Y[N], Q[N];
    Y=thomasAlgorithm(B, D);//error: incompatible types in assignment of ‘double’ to ‘double [1000]’
    Q=thomasAlgorithm(B, U);//error: incompatible types in assignment of ‘double’ to ‘double [1000]’
}

Może ktoś mi podpowiedzieć co robię źle i co zmienić żeby całość działała poprawnie ?

3

Co przekazujesz: double B[3][N];
Czego oczekuje funkcja: double A[N][N]

W każdym razie, nie używaj tablic C do przekazywania danych: to nie działa tak jak myślisz i/lub jest bardzo kosztowne.

Najprościej użyj std::vector i przekaż go przez const referencję.

0
kq napisał(a):

Co przekazujesz: double B[3][N];
Czego oczekuje funkcja: double A[N][N]

W każdym razie, nie używaj tablic C do przekazywania danych: to nie działa tak jak myślisz i/lub jest bardzo kosztowne.

Najprościej użyj std::vector i przekaż go przez const referencję.

Muszę zostać przy tablicach, zmieniłem double thomasAlgorithm(double A[3][N], double G[N]) na double thomasAlgorithm(double A[3][N], double G[N]) ale dalej jest ten sam błąd

0
Baxing napisał(a):

Może ktoś mi podpowiedzieć co robię źle i co zmienić żeby całość działała poprawnie ?

Jesli "poprawnie" == "kompiluje sie" to wystarczy nie robic tego co kompilator grzecznie mowi ze jest zle, czyli nie przypisywac double (rezultat funkcji) do tablicy doubli (double Y[N], Q[N];).

1

To co napisałeś nie może działać poprawnie, wewnątrz thomasAlgorithm deklarujesz U na stosie,
Na końcu zwracasz pierwszy element tablicy która po powrocie z funkcji już nie istnieje,
Zaś w main() próbujesz ten pierwszy element tablicy (czyli wartość U[0]) wpisać do tablicy 'Y[]'
To nie zadziała z definicji.

Rozważ zmianę kolejności wymiarów, oraz przekazanie tablicy dla wyników:

void thomasAlgorithm(double U[],double A[][3], double G[],size_t n) // dalej w kodzie nie deklaruj U
// odpowiednio:
    double A[N][3];
    static const double Astart[3]={1.0, 4.0, 1.0};
    for (int n = 0; n < N; ++n) memcpy(&A[n][0],&Astart[0],sizeof(Astart));

1 użytkowników online, w tym zalogowanych: 0, gości: 1