Wskaźnik na wektor - wypisywanie elementów
Ostatnio zmodyfikowano 2017-01-05 17:36
begginer Temat założony przez niniejszego użytkownika |
Wskaźnik na wektor - wypisywanie elementów » 2017-01-05 13:57:29 Witam, pisze program ktory zawiera funkcje zwracajaca wskaznik do wektora o elementach strukturalnych.. Nastepnie w main'ie probuje wypisac jakis element danego wektora, lecz nie bardzo wiem jak to zrobic za pomoca wskaznika. Dodam, ze dana funkcja musi posiadac tylko 1 argument - wielkosc wektora. #include <iostream> #include <vector> using namespace std; struct complex { float rzecz; float uroj; }; vector < complex >* generuj( int n ) { vector < complex > y; for( int i = 1; i <= n; i++ ) { complex x; x.rzecz = i; x.uroj = i + 1; y.push_back( x ); } vector < complex >* p; p = & y; return p; } int main() { int n = 10; vector < complex > * x = generuj( n ); cout <<( * x )[ 0 ].rzecz; cin.ignore(); }
|
|
michal11 |
» 2017-01-05 14:03:41 Nie możesz z funkcji zwrócić adresu zmiennej lokalnej ponieważ ta zmienna po wyjściu z funkcji jest niszczona, czyli masz adres na coś czego już nie ma, zwróć normalnie przez wartość i będzie dobrze. A jeżeli koniecznie musi to być wskaźnik to użyj dynamicznej alokacji (smart pointery). |
|
Gibas11 |
» 2017-01-05 14:03:50 Zwracasz wskaźnik na zmienną lokalną, która przestaje istnieć po zakończeniu funkcji. Przekaż vector jako parametr przez referencję i użyj std::complex <> z biblioteki standardowej. Tak na szybko: #include <iostream> #include <complex> #include <vector>
void generuj( std::vector < std::complex < int >>& vector, int n ) { for( int i = 1; i <= n; i++ ) { vector.push_back( { i, i + 1 } ); } }
int main() { std::vector < std::complex < int >> liczby; generuj( liczby, 10 ); std::cout << liczby[ 0 ] << std::endl; return 0; } |
|
michal11 |
» 2017-01-05 14:06:37 @up Dodam, ze dana funkcja musi posiadac tylko 1 argument - wielkosc wektora. |
także twoje rozwiązanie raczej nie przejdzie. |
|
Gibas11 |
» 2017-01-05 14:12:48 @UP O, rzeczywiście, no to jak mówiłeś, najlepiej przez wartość albo smart pointerem. |
|
begginer Temat założony przez niniejszego użytkownika |
» 2017-01-05 14:18:45 EDIT: Sprawdzilem taka sama sytuacje ale zamiast wektora jest zwykly int, i wszystko dziala: #include <iostream> #include <vector> using namespace std;
int * generuj( int n ) { int y = n; int * p; p = & y; return p; } int main() { int * x = generuj( 10 ); cout << * x; cin.ignore(); }
|
|
Gibas11 |
» 2017-01-05 14:42:04 Przypadek. //edit: To już nie zadziała: #include <iostream> #include <vector> using namespace std;
int * generuj( int n ) { int y = n; int * p; p = & y; return p; }
void func() { int a = 2; std::cout << a << std::endl; }
int main() { int * x = generuj( 10 ); func(); cout << * x; cin.ignore(); } |
|
mokrowski |
» 2017-01-05 15:31:46 @begginer, koledzy napisali. To że działa to w tym przypadku to raczej "nieszczęście" :-/ Jeśli nie znasz wskaźników inteligentnych i nie znasz zagadnień new/delete to: #include <iostream> #include <vector>
using namespace std;
struct complex { float rzecz; float uroj; };
vector < complex >* generuj( size_t n ) { static vector < complex > y; y.reserve( n ); for( size_t i = 0; i < n; ++i ) { complex x; x.rzecz = i; x.uroj = i + 1; y.push_back( x ); } return & y; } int main() { size_t n = 10; vector < complex > * x = generuj( n ); for( size_t i = 0; i < n; ++i ) { cout << "Struktura: rzecz = " <<( * x )[ i ].rzecz << " uroj = " <<( * x )[ i ].uroj << endl; } }
Tu jak wyżej nie ukrywam rozwiązanie "jakie wymagania, takie rozwiązanie" :-/ Jak znasz zagadnienia new/delete to: #include <iostream> #include <vector>
using namespace std;
struct complex { float rzecz; float uroj; };
vector < complex >* generuj( size_t n ) { vector < complex > * y = new vector < complex >(); y->reserve( n ); for( size_t i = 0; i < n; ++i ) { complex x; x.rzecz = i; x.uroj = i + 1; y->push_back( x ); } return y; } int main() { size_t n = 10; vector < complex > * x = generuj( n ); for( size_t i = 0; i < n; ++i ) { cout << "Struktura: rzecz = " <<( * x )[ i ].rzecz << " uroj = " <<( * x )[ i ].uroj << endl; } delete x; }
|
|
« 1 » 2 |