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

Zwracanie tablicy struktur z funkcji

VPS Starter Arubacloud
0 głosów
572 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 (269,120 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 (269,120 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 (269,120 p.)
Ciesze się że mogłem pomóc :D

Podobne pytania

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

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...