• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zwracanie tablicy struktur z funkcji

0 głosów
698 wizyt
pytanie zadane 2 czerwca 2017 w C i C++ przez mibdbz Gaduła (4,300 p.)

Mój problem polega na tym, że nie potrafię zwrócić tablicy struktur z funkcji zpliku do funkcji main. Program sie kompiluje, ale wysypuje się w trakcie trwania.

#include <iostream>
#include <fstream>
#include <cstdlib> // zalaczam potrzebne biblioteki

using namespace std;

struct wczytywanie // tworzenie struktury na potrzeby produktow
{
    string nazwa;
    float WW;
    float WBT;
};

string menu(int w); //naglowek funkcji menu, ktora okresla jaki plik chce otworzyc user
wczytywanie* zpliku(string); // naglowek funkcji zpliku, ktora wykonuje odczyt z pliku

wczytywanie* tab;

int main()
{
    int wybor_menu_glowne;


    cout << "--------------MENU GLOWNE--------------"<< endl;
    cout << endl;
    cout << "1. Warzywa"            << endl;
    cout << "2. Owoce"              << endl;
    cout << "3. Pieczywo"           << endl;
    cout << "4. Produkty zbozowe"   << endl;
    cout << "5. Produkty miesne"    << endl;
    cout << "6. Produkty mleczne"   << endl;
    cout << "7. Ryby i owoce morza" << endl;
    cout << "8. Cukier i slodycze"  << endl;
    cout << "9. Inne, tluszcze"     << endl;
    cout << "Co wybierasz: ";
    cin >> wybor_menu_glowne;

    system("cls");




  cout <<  zpliku(menu(wybor_menu_glowne)); // funkcja "zpliku" z argumentem, czyli funkcja "menu" ktora zwraca string z nazwa pliku






    return 0;
}

wczytywanie* zpliku(string tytul) // pobiera string z funkcji "menu"
{
    fstream plik;
    wczytywanie produkty[50];// nie umiem jeszcze zrobic dynamicznej alokacji pamieci w taki sposob aby nie marnowac pamieci na 50 komorek w tablicy


    plik.open(tytul.c_str(), ios::in); // otwarcie pliku i zamiana z char na string

    if(plik.good()==false) // sprawdzenie czy plik istnieje
    {
        cout << "Nie udalo sie otworzyc pliku!";
        exit(0);
    }
    string linia; int licznik = 0; int nr_linii = 1;
    while(getline(plik, linia))
    {
         switch(nr_linii)
        {
            case 1: produkty[licznik].nazwa = linia;              break;  //
            case 2: produkty[licznik].WW = atof(linia.c_str());   break;  // pobieranie kazdej z linii do zmiennych
            case 3: produkty[licznik].WBT = atof(linia.c_str());  break;  //
        }
        if(nr_linii==3) {nr_linii=0; licznik++;}
        nr_linii++;
    }
    plik.close(); // zamkniecie pliku

    for(int i = 0; i < licznik; i++)
    {
        tab[i].nazwa    = produkty[i].nazwa;
        tab[i].WW       = produkty[i].WW;
        tab[i].WBT      = produkty[i].WBT;
    }

return tab;
}

string menu(int w) // funkcja zwracaja menu
{
    switch(w)
    {
        case 1: return "warzywa.txt";           break;
        case 2: return "owoce.txt";             break;
        case 3: return "pieczywo.txt";          break;
        case 4: return "produkty zbozowe.txt";  break;
        case 5: return "produkty miesne.txt";   break;
        case 6: return "produkty mleczne.txt";  break;
        case 7: return "ryby i owoce morza.txt";break;
        case 8: return "cukier i slodycze.txt"; break;
        case 9: return "inne tluszcze.txt";     break;
        default : exit(0);
    }
}

Nie wiem na czym polega problem. Czy źle coś zrobiłem w samej funkcji czy źle ją wywołuję w main.

komentarz 28 grudnia 2017 przez JuniorPL Użytkownik (770 p.)

Witam, mam podobny problem chciałbym przekazać tablice struktur do innej funkcji ale nie mogę skompilować kodu.

struct Zdjecia
{
	string Nazwa;
	string Data;
	string Miejsce;
//	uint8_t Zdjecia[4][4][3];
};

string tworzenie_opisu(int LiczbaZdjec)
{
	int pp = 0;
	

	Zdjecia *tab = new Zdjecia[LiczbaZdjec];
	cout << "Podaj nazwe zdjecia: ";
	cin >> tab[pp].Nazwa;
	pp++;
////////////////////////////////////////////////
	
	cout << "Podaj miejsce: ";
	cin >> tab[pp].Nazwa;
	pp++;
////////////////////////////////////////////////
	
	cout << "Podaj date: ";
	Zdjecia *tab3 = new Zdjecia[LiczbaZdjec];
	cin >> tab[pp].Nazwa;
	pp++;
	
	
		return tab.Nazwa
	
}

void wyswietalnie_opisu(int LiczbaZdjec)
{

	cout << "Nazwa fotografi: " << tworzenie_opisu( LiczbaZdjec) << endl;
}

 

1 odpowiedź

+3 głosów
odpowiedź 2 czerwca 2017 przez Wiciorny Ekspert (281,250 p.)
wybrane 2 czerwca 2017 przez mibdbz
 
Najlepsza

Na przykładzie: 


struct punkty{
  int x, y;
  char nazwa;
};

 moim zdaniem zamiast tworzyc dynamicznie, utworzyłbym klasyczną tablice. punkty tab[1000]; /potem przypisujesz jak u siebie

po przypisaniach 

Teraz zależnie od tego jaki element chcesz uzyskać i co wypisać 

cout<<"Dane pierwszego punktu: "<<tab[0].x<<" "
  <<tab[0].y<<" "<<tab[0].nazwa<<endl;

 

Przy założeniu że "chciałbys cała strukture zwrócic z tablicy, jest gorzej "

może się przyda przykład zwracania samej struktury 

void oblicz_objetosc(struct pudlo* box)
{
    box->objetosc = box->wysokosc * box->szerokosc * box->dlugosc;
}
 
int main()
{
  struct pudlo box;
  ...
  oblicz_objetosc(&box);
}

 

komentarz 2 czerwca 2017 przez mibdbz Gaduła (4,300 p.)
Chyba się nie zrozumieliśmy. Struktura działa, wiem że dane z pliku zapisują się pod właściwymi polami w tablicy struktur w funkcji "zpliku". Potrafię je nawet wypisać w funkcji main zamieniając funkcję "zpliku" na void. Ale w ten sposób nie jestem w stanie pracować na zwracanych danych.
komentarz 2 czerwca 2017 przez Wiciorny Ekspert (281,250 p.)

rozwiń tę myśl bo nie bardzo rozumiem 

z funkcji zpliku do funkcji

 

komentarz 2 czerwca 2017 przez mibdbz Gaduła (4,300 p.)
Już wiem. Twoje przykłady i to że mam nie używać wskaźników bardzo pomogły. Dzięki Tobie wszystko śmiga jak trzeba. Właśnie o takie naprowadzenie mi chodziło. Bardzo dziękuję za szybką odpowiedź.
komentarz 2 czerwca 2017 przez Wiciorny Ekspert (281,250 p.)
Ciesze się że mogłem pomóc :D

Podobne pytania

0 głosów
2 odpowiedzi 4,076 wizyt
pytanie zadane 17 listopada 2016 w C i C++ przez intensick Początkujący (420 p.)
0 głosów
1 odpowiedź 2,841 wizyt
pytanie zadane 26 listopada 2020 w C i C++ przez mik53r Nowicjusz (150 p.)
0 głosów
1 odpowiedź 997 wizyt
pytanie zadane 25 kwietnia 2020 w C i C++ przez Anahan89 Obywatel (1,320 p.)

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...