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

Funkcja zwracająca tablicę struktur (c++)

Ostatnio zmodyfikowano 2016-05-24 09:15
Autor Wiadomość
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.

C/C++
Dariusz Informatyk braketru 0
Kamil Slusarz yobro11 1
Dawid Malarz whatsup 0
Marcin Tancerz dunno994 2

tworzę strukturę:

C/C++
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):

C/C++
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:

C/C++
int main()
{
    int wiersze;
    wiersze = zliczaj();
    zpdw dane[ wiersze ];
    dane[ wiersze ] = open( wiersze ); //wywolanie funkcji ktora uzupelnia strukture
    cout << dane[ 3 ].stanowisko; //tutaj proba sprawdzenia czy zczytal wartosci, wywala błąd, a raczej poprostu program klęka
    //menu();
    //wyswietl();
   
    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]
P-148516
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.
P-148517
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
C/C++
//totalna sieczka
#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 ] << " ";
   
}
P-148527
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.
C/C++
int * fun()
{
    static int tab[ 150 ]; //musi być statyczna inaczej jest możliwość że zostanie usunięta i zwrócony wskaźnik będzie nieaktualny
   
    return tab;
}
Lub dynamicznie alokowana
C/C++
int * fun()
{
    return new int[ 150 ]; //taka też jest możliwość gdyż pamięć alokowana nie jest automatycznie zwalniana i zwrócony wskaźnik jest aktualny
}
P-148532
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 ! ;)
P-148533
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.
P-148535
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
P-148537
« 1 »
  Strona 1 z 1