Użycie wskaźników w parametrze funkcji – zmiana kodu

0

Chciałbym użyć wskaźników w parametrze funkcji, jednak pogubiłem się w tym kompletnie. Może ktoś pomóc zmienić kilka linijek?


#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

struct bibliotka
{
    string ksiazka, id;
};

bibliotka stworz(string ksiazka, string id)
{
    bibliotka nowa = {ksiazka,id};
    return nowa;
}

int main(void)
{
    string k,id;
    unsigned int x,j;
    vector <bibliotka> bib (1);

    bib.at(0).ksiazka="Potop";
    bib.at(0).id="HS001";

    cout<<"Biblioteka"<<endl;

    do{
        cout <<"\n1. Dodaj wyporzyczenie\n";
        cout <<"2. Usun ostatnie wypozyczenie\n";
        cout <<"3. Wyswietl katalog wypoyczen\n";
        cout <<"4. Wyjscie\n";
        cout <<"\nPodaj numer operacji: ";
        cin>>x;

        switch (x)
        {
          case 1:
            cout<<"\nTytul: ";
            cin>>k;
            cout<<"ID ksiazki: ";
            cin>>id;

            bib.push_back(stworz(k,id));
            break;
          case 2:
              if(bib.size()>0)
            {
                bib.pop_back();
            }
            else
            {
                cout<<"Brak wypozyczac\n";
            }

            break;
          case 3:
            for(j=0; j<bib.size(); j++)
                {
                    cout<<"\nTytul: "<<bib.at(j).ksiazka<<endl;
                    cout<<"ID: "<<bib.at(j).id<<endl;
                }
              break;
          case 4:
              break;
          default:
            cout<<"Zly znak operacji!\n";
            break;
        }

    }while(x!=4);

return 0;
}

0

**EDIT: Ten post nie ma sensu. Można jak najbardziej stworzyć strukturę w funkcji i ją zwrócić **

Musisz poprawić tą funkcję:

bibliotka stworz(string ksiazka, string id)
{
    bibliotka nowa = {ksiazka,id};
    return nowa;
}

Dlatego że po wywołaniu tej funkcji tej "nowej" już nie będzie (tzn. może być ale ten obszar pamięci może być użyty przez coś innego) - Undefined Behaviour.

Możesz zrobić tak, aby funkcja alokowała pamięć i zwracała wskaźnik, tylko musisz pamiętać o zwolnieniu pamięci.

0

Proszę o sprawdzenie czy poprawnie użyłem mechanizmu i sensu działania wskaźników( pomijam już fakt niedociągnięcia przy wprowadzaniu danych, ale tym zajmę się później ).

#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

struct bibliotka
{
    string ksiazka, id;
};

bibliotka stworz(string *ksiazka, string *id)
{
    bibliotka nowa = {*ksiazka,*id};
    return nowa;
}

int main(void)
{
    string k="napis1";
    string id="napis2";

    string *wsk_k=&k;
    string *wsk_id=&id;

    unsigned int x,j;
    vector <bibliotka> bib (1);

    bib.at(0).ksiazka="Potop";
    bib.at(0).id="HS001";

    cout<<"Biblioteka"<<endl;

    do{
        cout <<"\n1. Dodaj wyporzyczenie\n";
        cout <<"2. Usun ostatnie wypozyczenie\n";
        cout <<"3. Wyswietl katalog wypoyczen\n";
        cout <<"4. Wyjscie\n";
        cout <<"\nPodaj numer operacji: ";
        cin>>x;

        switch (x)
        {
          case 1:
            cout<<"\nTytul: ";
            cin>>k;
            cout<<"ID ksiazki: ";
            cin>>id;

            bib.push_back(stworz(wsk_k,wsk_id));
            break;
          case 2:
              if(bib.size()>0)
            {
                bib.pop_back();
            }
            else
            {
                cout<<"Brak wypozyczac\n";
            }

            break;
          case 3:
            for(j=0; j<bib.size(); j++)
                {
                    cout<<"\nTytul: "<<bib.at(j).ksiazka<<endl;
                    cout<<"ID: "<<bib.at(j).id<<endl;
                }
              break;
          case 4:
              break;
          default:
            cout<<"Zly znak operacji!\n";
            break;
        }

    }while(x!=4);

return 0;
}

1

Wskaźnikowo wygląda dobrze, choć nie jest to potrzebne bo równie dobrze możesz przekazać string od razu, niż poprzez wskaźnik.

Przepraszam również za wprowadzenie w błąd w poprzednim poście - możesz jak najbardziej zwracać strukturę bez żadnych wskaźników itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1