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: 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: 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: 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 |
|
pekfos |
» 2019-06-03 14:17:03 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. |
|
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 |
|
pekfos |
» 2019-06-05 09:32:25 1. Zwracanie std::array<> (analogicznie dla std::vector<>) #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 #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. #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 #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'; } |
|
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 |
|
jankowalski25 |
» 2019-06-11 20:30:49 |
|
« 1 » |