Funkcja zwracająca tablicę struktur (c++)
Ostatnio zmodyfikowano 2016-05-24 09:15
chacken Temat założony przez niniejszego użytkownika |
Funkcja zwracająca tablicę struktur (c++) » 2016-05-23 16:03:20 Hej uczę się powoli c++, utrudniając sobie zadania z różnych książek o c++. Jednak natrafiłem na pewny problem. Mianowicie, niepotrafię zwrócić z funkcji tablicy struktór: Mam plik txt z imionami, pseudonimami, stanowiskami, oraz 'preferencjami' danej osoby np. Dariusz Informatyk braketru 0 Kamil Slusarz yobro11 1 Dawid Malarz whatsup 0 Marcin Tancerz dunno994 2 tworzę strukturę: struct zpdw { string imie; string stanowisko; string pseudonim; int preferencje; }; W osobnej funkcji void zliczaj() zliczam wiersze w pliku tekstowym (funkcja zwraca ilość wierszy) Następnie wywołuję funkcję która wypełnia strukturę (w = ilosc wierszy): zpdw open( int w ) { string a; char filename[ arsize ]; ifstream plik; plik.open( "dane.txt" ); if( !plik.is_open() ) { cout << "Otwarcie pliku nie powiodlo sie" << endl; exit( EXIT_FAILURE ); } zpdw dane[ w - 1 ]; plik.seekg( 0 ); for( int i = 0; i < w - 1; i++ ) { plik >> dane[ i ].imie; plik >> dane[ i ].stanowisko; plik >> dane[ i ].pseudonim; plik >> dane[ i ].preferencje; } plik.close(); return * dane; } Struktura jest wypełniana prawidłowo, jednak do danych mam dostęp tylko z poziomu funkcji. W jaki sposób zwrócić całą tablicę struktur? Różnie już próbowałem obecnie zatrzymałem się na takiej wersji: int main() { int wiersze; wiersze = zliczaj(); zpdw dane[ wiersze ]; dane[ wiersze ] = open( wiersze ); cout << dane[ 3 ].stanowisko; return 0; } Wiem że jak zwrócę samą strukturę nie w tablicy to działa ale zapisane są tam tylko wartości dotyczące pierwszej osoby =\ Czy da się to jakoś rozwiązać w prosty sposób? Z góry dziękuję ;) [/i] |
|
Gibas11 |
» 2016-05-23 16:09:03 Zwróć albo std::vector albo shared_ptr. zpdw dane[ w - 1 ]; Lepiej nie alokować w ten sposób tablic o nieznanym rozmiarze. |
|
mateczek |
» 2016-05-23 20:42:41 zpdw dane[ w - 1 ]; Lepiej nie alokować w ten sposób tablic o nieznanym rozmiarze.
|
Zwłaszcza w funkcji gdzie przecież tak alokowana tablica to dane tymczasowe. A nazwa tablicy to przecież tylko wskaźnik #include <iostream> using namespace std; int * func() { int tabl[ 150 ]; for( int i = 0; i < 150; i++ ) tabl[ i ] = i; return tabl; } int main() { int * w = func(); for( int i = 0; i < 150; i++ ) cout << w[ i ] << " "; }
|
|
1aam2am1 |
» 2016-05-23 22:42:13 mateczek masz błąd w swoim programie, jeżeli tak chcesz zwrócić tablicę to powinna ona być statyczna. Edit. int * fun() { static int tab[ 150 ]; return tab; }
Lub dynamicznie alokowana int * fun() { return new int[ 150 ]; }
|
|
chacken Temat założony przez niniejszego użytkownika |
Dzięki ;) » 2016-05-24 00:11:04 Nie sądziłem że będzie tak szybki odzew ;) Już wiem gdzie miałem błąd, wystarczyło dynamicznie zaalokowac pamięć i zwrócić wskaźnik na tą tablice struktur, a nie tylko stworzyć obiekt. Konkretnie, zamieniłem zpdw dane[ w - 1 ]; na zpdw * dane = new zpdw[ w - 1 ]; i zwróciłem 'dane' do wskaźnika w mainie ;) Z góry dzięki ! ;) |
|
carlosmay |
» 2016-05-24 02:03:34 @1aam2am1 jeżeli tak chcesz zwrócić tablicę to powinna ona być statyczna. |
pewnie tak miało być: jeżeli tak chcesz zwrócić tablicę to nie powinna ona być statyczna. |
|
|
mateczek |
» 2016-05-24 09:15:28 @up trochę nieporozumień (niedopowiedzeń) w wątku ale wszystko się wyjaśniło :) Autor postu, mimo wszystko, wpadł jak poprawnie zadeklarować tablicę :P |
|
« 1 » |