dynamiczny przydzial pamieci

0

witam. mam utworzyc dwie struktury Zaglowka i Wykaz. Maja taka postac:

struct Zaglowka {
	
	string nazwa;
	float p_zagla;
	int l_koi, r_budowy, cena;
	
};

struct Wykaz {
	unsigned ilosc;
	Zaglowka *id;
	
}; 

Mam napisać funkcje która będzie sczytywać zawartosc z pliku , ktorego nazwa podana jest jako parametr wywolania programu i umieszczac je w tablicy struktur (tak to chyba sie nazywa). Zawartosc pliku:

4
Desperados 100.3 5 1999 290
Siekiera 100.1 9 2008 490
Szatan 19.0 2 1999 1998
Torpeda 290.0 10 2009 990

Najpierw zczytuje ilosc zaglowek i umieszczam je w Wykaz -> ilosc. Potem przekazuje do funkcji wskaźnik i mam umieścic wszystkie dane z pliku w zmiennej aby odwolywac sie do danej zagowki np tak:

zaglowka.id[0].nazwa;

Problem polega na tym, że nie potrafie stworzyć funkcji wczytaj ktora bedize to umieszczala w zmiennej typu Wykaz. Bardzo ważny jest dynamiczny przydzial pamięci.To jest to co do tej pory napisalem:

bool wczytaj(char *nazwa, Wykaz &lista) {
	
	ifstream plik(nazwa);
	

	
	
	
	while(plik.good()) {
	
	plik >> lista.ilosc;
	
	cout << lista.ilosc;
	
	
	//lista.id = new Wykaz [lista.ilosc];
		
	
	for(int i=0; i<lista.ilosc; i++) {
		
		
		//plik >> lista.id[i].nazwa;
		

		 
		
		
	}
	
	
	
	return true;
	
	
	
}

return false;
} 

Będe wdzięczny za każdą pomoc czy podpowiedz. Pozdrawiam

0

o_O?

lista.id = new Zaglowka[lista.ilosc];

bo przecież Żaglówki tam chcesz mieć.

0

przeszlo dziekuje :)

0

mam kolejne pytanie. Chcialbym napisac funkcje drukuj ktora bedzie dzialac przy takim kodzie:

drukuj(lista.id[2]);

wtedy wypisze np nazwe zaglowki o id 2.

napisalem taka funkcje:

string drukuj(Wykaz &zaglowka, int numer) {
	
	return zaglowka.id[numer].nazwa;
	
}

ale przyjmuje ona dwa argumenty

0

Robisz sobie jaja?

string getName(Zaglowka& zaglowka) {
        return zaglowka.nazwa;
}

Ty w ogóle widzisz co masz w tych strukturach? Gdzie ty chciałeś jakieś id wyciągać z ŻAGLÓWKI?

0

z jakiej zaglowki ?
napisalem cos takiego:

Wykaz &zaglowka

przciez typ to Wykaz a struktrura Wykaz posiada id.

jak mam wywowac ta twoja funkcje ?

0

Ty w ogóle myślisz o tym co robisz czy wstawiasz losowe kawałki kodu?

string getName(Zaglowka& zaglowka) {
        return zaglowka.nazwa;
}

Przeciez skoro wywołujesz drukuj(lista.id[2]); to znaczy ze argumentem funkcji jest ZAGLOWKA (bo lista.id[2] to jest zaglowka a nie Wykaz).
Zmieniłem nazwę funkcji bo drukuj() nijak nie oddaje tego co ta funkcja robi.

0

lista ma być wlasnie typem Wykaz;

Wykaz lista;

napisale juz funkcje :

void drukuj(ostream &os,Wykaz &zaglowka, int numer) {
	
	os << zaglowka.id[numer].nazwa << " " << zaglowka.id[numer].p_zagla  << " " << zaglowka.id[numer].l_koi  << " " <<  zaglowka.id[numer].r_budowy  << " " <<  zaglowka.id[numer].cena << endl;

}

juz nie ważne.

lista to również zmienna globalna typu Wykaz tak jak napisalem na górze tego posta.

0

Super, ale teraz ta funkcje musisz wywoływać jako:
drukuj(cout,lista,X); a nie tak jak pisałeś wcześniej. Zdecyduj się!
Poza tym, może to kwestia kosmetyczna ale mimo wszystko, nazywaj zmiennej zgodnie z tym co reprezentują! To bardzo zła praktyka robić takie coś:

Wykaz &zaglowka

tym bardziej kiedy masz taką strukturę danych jak Zaglowka. Przekazujesz tutaj Wykaz i używasz tego jak Wykazu, więc nazwanie tego Zaglowka to zwykly terroryzm...

0
Shalom napisał(a)

Super, ale teraz ta funkcje musisz wywoływać jako:
drukuj(cout,lista,X); a nie tak jak pisałeś wcześniej. Zdecyduj się!

tak bo probowalem zrobic tak

drukuj(cout, lista[0]); 

ale nie moglem tego napisac tak zeby dzialalo więc rozbilem to na dwa parametry.

Shalom napisał(a)

...więc nazwanie tego Zaglowka to zwykly terroryzm...

no tak, fakt.chyba nie moglem niczego innego wymyslic.

dzieki za pomoc

0

lista[0] ? o_O A co by to miało znaczyć? Może miałeś na myśli lista.id[0] ?

0

lista.id[0] ,tak

0

mam jeszcze jeden problem. mam napisac funkcje zlicz, ktora zliczy zaglowki o liczbie koi wiekszej niz podana jako argument wywolania programu, oraz dodatkowo zwracająca podaną liczbe koi jako zmienną typu wbudowanego.

funkcja ma dzialac z takim kodem testowym:

Zaglowka *tab = koszt(lista, liczba, l_koi, argv[3]);

na poczatku juz nie wiem jakiego typu ma byc funkcja, chyba Zagowka i co dokladnie ma zwracac.napisalem taka funkcje:

Zaglowka koszt(Wykaz &lista, int &liczba, int &l_koi, char * wej) {
	
	
	int cena = atoi(wej);
	
	
	int cena_x = (7 * cena) / 5;
	
	int licznik = 0;
	
	for (int i=0; i<lista.ilosc; i++) {
		
		if (lista.id[i].cena <= cena) { licznik++; }
			
	} 
	
	Zaglowka spis[10];
	
	for (int i=0; i<licznik; i++) {
		
		if (lista.id[i].cena <= cena) { 
				if(lista.id[i].l_koi >= l_koi) {
		
			spis[i].nazwa = lista.id[i].nazwa;
			
			
			
			 } }
			
	}
	
	return *spis;
	
	
	
} 

nie dziala ona jednak z kotem testujacym

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