Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Używanie funkcji zwracającej wartości w macierzy

Ostatnio zmodyfikowano 2019-06-11 20:30
Autor Wiadomość
Alfi1092
Temat założony przez niniejszego użytkownika
Używanie funkcji zwracającej wartości w macierzy
» 2019-06-03 14:05:49
Cześć.
Pracuję obecnie na Borland C++ Builderze 6. Stworzyłem sobie następującą funkcję:
W pliku .cpp:
C/C++
//Pochodna cząstkowa liniowa
float * pochCzastkowaLiniowa( float XP, float YP, float XK, float YK )
{ float DelX = XK - XP;
    float DelY = YK - YP;
    float L = sqrt( pow( DelX, 2 ) + pow( DelY, 2 ) );
    float PochXK = DelX / L; float PochXP = - PochXK;
    float PochYK = DelY / L; float PochYP = - PochYK;
   
    float Poch[] = { PochXP, PochYP, PochXK, PochYK };
    return Poch;
}

W pliku .hpp:
C/C++
float * pochCzastkowaLiniowa( float XP, float YP, float XK, float YK );

Sama funkcja kompiluje się poprawnie i raczej jest poprawna, ale mam problem ze zrozumieniem jak użyć jej w kodzie.
To co najłatwiejsze i przyszło mi jako pierwsze do głowy oczywiście nie działa:
C/C++
float a = 1, b = 2, c = 3, d = 4;
float Bla[ 4 ] = pochCzastkowaLiniowa( a, b, c, d );

Ciężko jest mi znaleźć w internecie jakikolwiek temat pokazujący mi to łopatologicznie.
Z góry dziękuję za wszelakie wsparcie.

Pozdrawiam, Alfi
P-174746
pekfos
» 2019-06-03 14:17:03
C/C++
float Poch[] = { PochXP, PochYP, PochXK, PochYK };
return Poch;
To jest błędne. Zwracasz adres lokalnej tablicy, która przestanie istnieć po zakończeniu funkcji. Jeśli chcesz zwracać tablicę o z góry znanym rozmiarze, to zwracaj std::array<>. Lub nie zwracaj tablicy w ogóle, tylko przekaż wskaźnik na tablicę do funkcji i niech funkcja wypełnia tablicę daną z zewnątrz.
P-174747
Alfi1092
Temat założony przez niniejszego użytkownika
» 2019-06-05 06:05:51
Chciałbyś może podpowiedzieć jak to zrobić prawidłowo?
Byłbym wdzięczny
P-174753
pekfos
» 2019-06-05 09:32:25
1. Zwracanie std::array<> (analogicznie dla std::vector<>)
C/C++
#include <iostream>
#include <array>

std::array < float, 4 > f()
{
    return { 1.f, 2.f, 3.f, 4.5 };
}

int main()
{
    std::array < float, 4 > x = f();
    std::cout << x[ 0 ] << ' ' << x[ 1 ] << '\n';
}
2. 'Zwracanie' w stylu C
C/C++
#include <iostream>

void f( float * tab )
{
    tab[ 0 ] = 1.f;
    tab[ 1 ] = 2.f;
    //..
}

int main()
{
    float x[ 4 ];
    f( x );
    std::cout << x[ 0 ] << ' ' << x[ 1 ] << '\n';
}
3. Przy czym wydaje się, że pytasz o zwracanie tablic tylko po to by zrobić hack na zwracanie 4 wartości z funkcji. Są na to lepsze rozwiązania.
C/C++
#include <iostream>

struct S
{
    int a, b, c, d;
};

S f()
{
    S s;
    s.a = 1.f;
    s.b = 2.f;
    //..
    return s;
}

int main()
{
    S x = f();
    std::cout << x.a << ' ' << x.b << '\n';
}
4. albo
C/C++
#include <iostream>
#include <tuple>

std::tuple < float, float, float, float > f()
{
    return std::make_tuple( 1.f, 2.f, 3.f, 4.f );
}

int main()
{
    float a, b, c, d;
    std::tie( a, b, c, d ) = f();
    std::cout << a << ' ' << b << '\n';
}
P-174754
Alfi1092
Temat założony przez niniejszego użytkownika
» 2019-06-11 18:13:46
Dziękuję Ci serdecznie za udzielone odpowiedzi :)
A jeszcze mam jedno pytanie. Byłbyś w stanie mi wskazać jakąś gotową bibliotekę do operacji na macierzach? Mnożenie przez siebie 3 macierzy, wyznaczniki itp.

Pozdrawiam
P-174787
jankowalski25
» 2019-06-11 20:30:49
P-174788
« 1 »
  Strona 1 z 1