Strona 1 z 1

[Solved][c++] Wczytywanie tablicy stringów do funkcji przez referencję

: 21 gru 2011, 18:17
autor: ziomekmatti18
Witam. Języka C++ uczę się dopiero od niecałego tygodnia. Postanowiłem skorzystać z kursu na stronie cp00x.pl i właśnie odnośnie jednego z tam zawartych zadań domowych:
http://cpp0x.pl/kursy/Kurs-C++/Poziom-3 ... ejscia/351
mam problem:
program8.cpp:6:33: error: declaration of ‘imie’ as array of references
program8.cpp:6:34: error: expected ‘)’ before ‘,’ token
program8.cpp:6:43: error: expected initializer before ‘&’ token
program8.cpp: In function ‘int main()’:
program8.cpp:28:61: error: cannot pass objects of non-trivially-copyable type ‘std::string {aka struct std::basic_string<char>}’ through ‘...’
program8.cpp:28:61: error: cannot pass objects of non-trivially-copyable type ‘std::string {aka struct std::basic_string<char>}’ through ‘...’
program8.cpp:31:60: error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘std::string* {aka std::basic_string<char>*}’ for argument ‘1’ to ‘int wypiszOsobe(std::string*, std::string*, std::string*)’
z kodem:

Kod: Zaznacz cały

#include <iostream>
#include <string>

using namespace std;

int wczytajOsobe( string & imie[], string & nazwisko[], string & wiek[] ) {
	cout << "Podaj imie dla osoby: ";
	cin >> imie[];
	cout << endl;
	cout << "Podaj nazwisko dla osoby: ";
	cin >> nazwisko[];
	cout << endl;
	cout << "Podaj wiek dla osoby: ";
	cin >> wiek[];	
}

int wypiszOsobe( string imie[], string nazwisko[], string wiek[] ) {
	cout << "Imie: " << imie << endl;
	cout << "Nazwisko: " << nazwisko << endl;
	cout << "Wiek: " << wiek << endl;
}

int main() {
   	string imie[ 2 ];
    	string nazwisko[ 2 ];
    	int wiek[ 2 ];
    	for( int i = 0; i < 2; i++ )
         	wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    	for( int i = 0; i < 2; i++ )
         	wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
    
	return 0;
}
Proszę Was o koretkę i ewentualnie krótki komentarz, czemu poprzednia wersja jest nieprawidłowa. Z góry dzięki i pozdrawiam.

Re: [c++] Wczytywanie tablicy stringów do funkcji przez referencję

: 21 gru 2011, 18:58
autor: PeeR
Dziwne to zadanie. Bo za pomocą operatora [] dostajesz znak który się znajduje pod numerem którym wywołasz np:

Kod: Zaznacz cały

string text;
text = "Miasto";
cout << text[2]; // wyświetli się 'a'
Więc jak chcesz zrobić z klasy string wektor to ja bym to zrobił na klasie Vector http://pl.wikibooks.org/wiki/C++/Vector

Re: [c++] Wczytywanie tablicy stringów do funkcji przez referencję

: 21 gru 2011, 19:20
autor: ziomekmatti18
To akurat zapamiętałem z lekcji w Pascalu. Autor tego kursu jeszcze tego nie wspominał, więc założyłem, że metoda jest trochę inna. Zatem w głównej funkcji main tak naprawdę nie deklaruję tablicy z dwoma elementami o dowolnej pojemności na stringi, tylko zmienną string składającą się z dwóch znaków?
Dzięki za tą klasę Vector, jednak czy istnieje jeszcze inna metoda zrobienia tego zadania, bezklasowa?

Re: [c++] Wczytywanie tablicy stringów do funkcji przez referencję

: 21 gru 2011, 19:21
autor: beluosus
Do funkcji wysyłasz jeden obiekt z tablicy, a nie całą tablicę obiektów. Poza tym trzeci argument ma być liczbą całkowitą.

Kod: Zaznacz cały

void wczytajOsobe(string &imie, string &nazwisko, int &wiek)
{
   cout << "Podaj imie dla osoby: ";
   cin >> imie;
   cout << "Podaj nazwisko dla osoby: ";
   cin >> nazwisko;
   cout << "Podaj wiek dla osoby: ";
   cin >> wiek;   
}

void wypiszOsobe(const string &imie, const string &nazwisko, int wiek)
{
   cout << "Imie: " << imie << endl;
   cout << "Nazwisko: " << nazwisko << endl;
   cout << "Wiek: " << wiek << endl;
}
W funkcji wypiszOsobe() możesz nie korzystać z referencji, ale wtedy niepotrzebnie skopiujesz obiekt (więcej roboty dla procesora i pamięci). Dlatego użyłem const żeby funkcja nie zmieniała zawartości obiektów - bo ma je tylko wyświetlić.

@PeeR: tam nie masz string text; tylko string text[2];

PS
std::endl prócz tego, że wstawia nową linię to jeszcze robi flush bufora na output (wyświetla zbuforowane dane). Jeżeli Ci na tym nie zależy to po prostu napisz "\n".

Re: [c++] Wczytywanie tablicy stringów do funkcji przez referencję

: 21 gru 2011, 19:26
autor: ziomekmatti18
Ale głupi błąd :O Wielkie dzięki sensei beluosus :D
A co do flush bufora to jeszcze do tego nie doszedłem ^^

Re: [c++] Wczytywanie tablicy stringów do funkcji przez referencję

: 21 gru 2011, 19:27
autor: PeeR
beluosus pisze:@PeeR: tam nie masz string text; tylko string text[2];
Więc w takim razie jak tak deklarujemy string to co się dzieje? Bo sam nie wiem :D

Re: [c++] Wczytywanie tablicy stringów do funkcji przez referencję

: 21 gru 2011, 19:28
autor: ziomekmatti18
PeeR pisze:
beluosus pisze:@PeeR: tam nie masz string text; tylko string text[2];
Więc w takim razie jak tak deklarujemy string to co się dzieje? Bo sam nie wiem :D
Dwuelementowa tablica, którą wypełniają wartości typu string. Tak przynajmniej wywnioskowałem z zadania.
Ale dla pewności zaczekajmy na opinię profesjonalisty, bo ja jestem jeszcze świeżakiem ;x

Re: [Solved][c++] Wczytywanie tablicy stringów do funkcji przez referencję

: 21 gru 2011, 19:36
autor: PeeR
Faktycznie dokładnie tak jest przetestowałem

Kod: Zaznacz cały

#include <iostream>
#include <string>

using namespace std;

int main()
{
  string text[2];
  text[0] = "Miasto";
  cout << text[0][2]; // wyświetli się 'a'
  text[1] = "666";
  cout<<"\n"<<text[1];
}
I dopiero teraz się o tym dowiedziałem :roll:

Re: [Solved][c++] Wczytywanie tablicy stringów do funkcji przez referencję

: 21 gru 2011, 19:57
autor: ziomekmatti18
PeeR pisze:Faktycznie dokładnie tak jest przetestowałem

Kod: Zaznacz cały

#include <iostream>
#include <string>

using namespace std;

int main()
{
  string text[2];
  text[0] = "Miasto";
  cout << text[0][2]; // wyświetli się 'a'
  text[1] = "666";
  cout<<"\n"<<text[1];
}
I dopiero teraz się o tym dowiedziałem :roll:
Wow fajna opcja. Dzięki za dokształcenie :)