[c++] Przekazywanie argumentów funkcji.

LipaMat
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 23 paź 2013, o 17:49
Płeć: Mężczyzna
Lokalizacja: Gdynia
Podziękował: 9 razy
Pomógł: 9 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: LipaMat »

Witam, mam pytanie, które być może jest banałem, a przeszkadza mi w zrobieniu pewnego programu.
Otóż mam strukturę, która ma mi pomóc przy tworzeniu wektorów. I piszę jedną funkcję wczytaj_wektor, w którym za pomocą "cin >>" pobieram od użytkownika cztery współrzędne wektora, bo jestem w \(\displaystyle{ \mathbb{R}^{4}}\). I teraz chcę stworzyć nową funkcję wypisz_wektor, która wypisze będzie przyjmowała jako argumenty te współrzędne, które w zupełnie innej funkcji podaje mi użytkownik. Czy to jest możliwe, bo mi to jakoś nie wychodzi.
Ostatnio zmieniony 6 gru 2014, o 14:49 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
musialmi
Użytkownik
Użytkownik
Posty: 3466
Rejestracja: 3 sty 2014, o 13:03
Płeć: Mężczyzna
Lokalizacja: PWr ocław
Podziękował: 382 razy
Pomógł: 434 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: musialmi »

Jeśli nie korzystasz ze struktur lub klas, to ja bym rozbił wczytaj_wektor na 4 funkcje, gdzie w każdej będzie pobierana (i zwracana!) jedna współrzędna. Wtedy wypisanie można zrobić już w jednej funkcji.
LipaMat
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 23 paź 2013, o 17:49
Płeć: Mężczyzna
Lokalizacja: Gdynia
Podziękował: 9 razy
Pomógł: 9 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: LipaMat »

Z tym, że tak jest w poleceniu, że mam dokładnie tak zrobić. Stworzyć funkcję, która wczyta 4 wspołrzędne wektora i zwróci wartość wektor4d (to moja struktura), następnie muszę stworzyć funkcję, która wypisze na ekran te cztery współrzędne wektora.
Awatar użytkownika
musialmi
Użytkownik
Użytkownik
Posty: 3466
Rejestracja: 3 sty 2014, o 13:03
Płeć: Mężczyzna
Lokalizacja: PWr ocław
Podziękował: 382 razy
Pomógł: 434 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: musialmi »

No to jeśli korzystasz ze struktur, to luz. Jeśli funkcja zwraca wektor, to stwórz sobie w mainie np. wektor u, przypisz mu wartość funkcji wczytaj_wektor, a potem stwórz funkcję wypisz_wektor, która będzie pobierać jeden argument (wektor), a w mainie użyjesz jej tak: wypisz_wektor(u) (ta funkcja będzie prawdopodobnie voidem, nie będzie nic zwracać).
LipaMat
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 23 paź 2013, o 17:49
Płeć: Mężczyzna
Lokalizacja: Gdynia
Podziękował: 9 razy
Pomógł: 9 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: LipaMat »

Kod: Zaznacz cały

struct wektor4d
{
	int wspONE;
	int wspTWO;
	int wspTHREE;
	int wspFOUR;
};

wektor4d wczytaj_wektor()
{	
	wektor4d wsp1, wsp2, wsp3, wsp4;


	cout << "Prosze podac wspolrzedne wektora" << endl;
	cout << "Wspolrzedna 1:  ";
	cin >> wsp1.wspONE;
	cout << endl;

	cout << "Wspolrzedna 2:  ";
	cin >> wsp2.wspTWO;
	cout << endl;

	cout << "Wspolrzedna 3:  ";
	cin >> wsp3.wspTHREE;
	cout << endl;

	cout << "Wspolrzedna 4:  ";
	cin >> wsp4.wspFOUR;
	cout << endl;

	return wsp1, wsp2, wsp3, wsp4;
}

void wypisz_wektor(wektor4d wsp1, wektor4d wsp2, wektor4d wsp3, wektor4d wsp4)
{
	

	cout << "Twoj wektor ma wspolrzedne ==>  " << "[" << wsp1.wspONE << ", " << wsp2.wspTWO << ", " << wsp3.wspTHREE << ", " << wsp4.wspFOUR << "]"<< endl;

}


To jest mój kod na te dwie funkcje. Chodzi mi o te argumenty w "void wypisz_wektor". Jak wczytać tam to, co generuje wczytaj_wektor. I w ogóle czy te funkcje są dobrze zrobione. Od razu mówię, że wypisanie na ekran ma wyglądać tak \(\displaystyle{ [ x_{1} , x_{2} , x_{3} , x_{4} ]}\). I przepraszam Cie za takie nieogarnięcie Twoich podpowiedzi, ale po prostu jeszcze nie za mocno tego c++ ogarniam. Dziekuję za pomoc.
Ostatnio zmieniony 6 gru 2014, o 12:11 przez LipaMat, łącznie zmieniany 1 raz.
Awatar użytkownika
musialmi
Użytkownik
Użytkownik
Posty: 3466
Rejestracja: 3 sty 2014, o 13:03
Płeć: Mężczyzna
Lokalizacja: PWr ocław
Podziękował: 382 razy
Pomógł: 434 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: musialmi »

Struktura jest dobrze napisana. Potem jest niestety źle. Zobacz, że w twojej funkcji wczytaj_wektor sugerujesz, że wsp1, wsp2, ... są wektorami, a przecież nie są (w środku struktury napisałeś czym są te współrzędne i nie powinieneś zmieniać tego założenia). Ty chcesz we wczytaj_wektor zwrócić tylko jeden wektor (który ma w środku cztery współrzędne), a teraz zwracasz cztery. No i wtedy wypisz_wektor ma pobierać też tylko jeden argument, a nie cztery (tzn. może cztery, ale nie w taki sposób - najlepiej zrób pobieranie jednego argumentu). Najpierw napisz dobrze wczytaj_wektor. A kod wklejaj w znacznikach [ code] [/ code], bo się lepiej czyta:

Kod: Zaznacz cały

struct wektor4d
{
  int wspONE;
  int wspTWO;
  int wspTHREE;
  int wspFOUR;
};
LipaMat
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 23 paź 2013, o 17:49
Płeć: Mężczyzna
Lokalizacja: Gdynia
Podziękował: 9 razy
Pomógł: 9 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: LipaMat »

Kod: Zaznacz cały

wektor4d wczytaj_wektor()
{
wektor4d vec;

cout << "Prosze podac wspolrzedne wektora" << endl;
cout << "Wspolrzedna 1: ";
cin >> vec.wspONE;
cout << endl;
cout << "Wspolrzedna 2: ";
cin >> vec.wspTWO;
cout << endl;
cout << "Wspolrzedna 3: ";
cin >> vec.wspTHREE;
cout << endl;
cout << "Wspolrzedna 4: ";
cin >> vec.wspFOUR;
cout << endl;

return vec;
}
Dobrze jest teraz, jeżeli chodzi o tę funkcję?
Awatar użytkownika
musialmi
Użytkownik
Użytkownik
Posty: 3466
Rejestracja: 3 sty 2014, o 13:03
Płeć: Mężczyzna
Lokalizacja: PWr ocław
Podziękował: 382 razy
Pomógł: 434 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: musialmi »

Tak, z tego, co pamiętam, to powinno to działać doskonale. Z wypisywaniem wektora dasz już radę?
LipaMat
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 23 paź 2013, o 17:49
Płeć: Mężczyzna
Lokalizacja: Gdynia
Podziękował: 9 razy
Pomógł: 9 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: LipaMat »

No jeszcze mam inne pytania, jeśli byś mi pomógł, byłbym niesamowicie wdzięczny.

Kod: Zaznacz cały

wektor4d wypisz_wektor()
{
	wektor4d wek = wczytaj_wektor();

	cout << "Twoj wektor ma wspolrzedne ==>  " << "[" << wek.wspONE << ", " << wek.wspTWO << ", " << wek.wspTHREE << ", " << wek.wspFOUR << "]"<< endl;

	return wek;
}
Tutaj w sumie nie mam żadnego pytania, to działa i chyba jest wszystko tak jak chciałem. Tylko w sumie nie wiem, dlaczego muszę tutaj mieć typ funkcji "wektor4d". Bo jak chcę później użyć tej funkcji w innej funkcji to wyświetla mi się "no suitable constructor exists to convert "void" to "wektor4d"" i nie wiem na czym ten błąd polega.

Moim drugim błędem, który się pojawia jest błąd, który mam w mojej funkcji o nazwie dlugosc, która wyznacza normę euklidesową zadaną wzorem \(\displaystyle{ \sqrt{ x_{1} + x_{2} +x _{3} +x _{4} }}\). I gdy mam w c++

Kod: Zaznacz cały

wektor4d dlugosc()
{
	wektor4d wek = wypisz_wektor();
	wektor4d dlugosc = sqrt(wek.wspONE*wek.wspONE + wek.wspTWO*wek.wspTWO + wek.wspTHREE*wek.wspTHREE + wek.wspFOUR*wek.wspFOUR);

	cout << "Wektor ma dlugosc:  " << dlugosc << endl;
		
	return wek;
}
Mam dwa błędy tutaj. Pierwszy odnosi się do pierwiastka "more than one instance of overloaded functions "sqrt" matches the argument list.
Drugi bład to przy wyrazie dlugosc w cout mam komunikat "no operator "<<" matches these operands."


Kolejna pytanie odnosi się do tego, że tworzę drugą funkcję wczytaj_wektor2, który wczytuje wektor drugi i robię nową funkcję, która ma jako argumenty przyjmować dwa wektory, które generują funkcje wczytaj_wektor i wczytaj_wektor2. I nie wiem jak to zrobić. Poza tym nie umiem wymyslic algorytmu na zapisanie tego wzoru \(\displaystyle{ x + y = ( x_{1} + y_{1} , ... , x _{4} , y_{4})}\) gdzie oczywiście \(\displaystyle{ x}\) oraz \(\displaystyle{ y}\) to te argumenty(wektory).

To chyba na ten moment wszystkie pytania, bardzo dziękuję za zaangażowanie.
Awatar użytkownika
musialmi
Użytkownik
Użytkownik
Posty: 3466
Rejestracja: 3 sty 2014, o 13:03
Płeć: Mężczyzna
Lokalizacja: PWr ocław
Podziękował: 382 razy
Pomógł: 434 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: musialmi »

Musisz mieć? Kompilator nie pozwala ci mieć tu voida i nie zwracać nic? Dziwne. Pokaż użycie, w którym pokazuje ci się błąd. Wklej kod, wraz z kodem tej funkcji (poprawionym). Nie jestem informatykiem, ale może będę wiedział o co chodzi.

W drugim: zauważ, że zmiennej dlugosc dałeś typ wektor. A przyjmujesz za niego liczbę. Musisz nadać tej zmiennej typ liczba, wtedy oba błędy powinny zniknąć (myślę, że drugi tyczy się tego, że chcesz "wypisać wektor" (bo dlugosc to wektor), ale komputer nie wie co to tak naprawdę znaczy). Btw, źle zacytowałeś wzór na długość wektora (ale w programie masz dobrze).

Trzeciego pytania nie rozumiem: nie wiesz jak co zrobić? Swoją drogą myślę, że nie będzie ci potrzebna druga funkcja wczytywania wektora, która robi dokładnie to samo, co pierwsza. Możesz jednej użyć po prostu dwa razy. Nie umiesz wymyślić algorytmu, mówisz. Ja mówię: sam widzisz, że musisz zwrócić wektor, którego współrzędne są sumą współrzędnych składowych
LipaMat
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 23 paź 2013, o 17:49
Płeć: Mężczyzna
Lokalizacja: Gdynia
Podziękował: 9 razy
Pomógł: 9 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: LipaMat »

1. Nie, nie, nie. Pozwala mi zwrócić voida, ale jak tworzę nową funkcję, w której mam napisane:

Kod: Zaznacz cały

wektor4d wek = wypisz_wektor()
To wtedy mam ten błąd właśnie. "no suitable constructor exists to convert "void" to "wektor4d"".

2. Dałem zmienną double, błąd przy wyrazie dlugosc zniknął, ale z pierwiastkiem nadal jest to samo, nic się nie zmieniło.

3. Problem polega na tym, że w tej funkcji dodawanie mam jako argumenty przyjąć dwa wektory. I jak to zrobić? co mam tam wpisać? No bo chyba nie tak?

Kod: Zaznacz cały

wektor4d dodawanie (wektor4d wek, wektor4d wek2)
wektor4d wek = wczytaj_wektor();
wektor4d wek2 = wczytaj_wektor2();
Tutaj mam właśnie problemy.
Awatar użytkownika
musialmi
Użytkownik
Użytkownik
Posty: 3466
Rejestracja: 3 sty 2014, o 13:03
Płeć: Mężczyzna
Lokalizacja: PWr ocław
Podziękował: 382 razy
Pomógł: 434 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: musialmi »

LipaMat pisze:1. Nie, nie, nie. Pozwala mi zwrócić voida, ale jak tworzę nową funkcję, w której mam napisane:

Kod: Zaznacz cały

wektor4d wek = wypisz_wektor()
To wtedy mam ten błąd właśnie. "no suitable constructor exists to convert "void" to "wektor4d"".
No i jest to zrozumiałe, bo jeśli chcesz stworzyć wektor, który będzie przyjmował wartość funkcji, to ta funkcja musi mieć wartość (void nie ma wartości). Ale wiesz co? Jestem prawie pewien, że bardziej pożądanym przez ciebie poleceniem byłoby wektor4d wek = wczytaj_wektor
LipaMat pisze: 2. Dałem zmienną double, błąd przy wyrazie dlugosc zniknął, ale z pierwiastkiem nadal jest to samo, nic się nie zmieniło.
Nie umiem tutaj pomóc. Jedynym pomysłem jest to, że nie wczytałeś biblioteki, która ma sqrt.
LipaMat pisze: 3. Problem polega na tym, że w tej funkcji dodawanie mam jako argumenty przyjąć dwa wektory. I jak to zrobić? co mam tam wpisać? No bo chyba nie tak?

Kod: Zaznacz cały

wektor4d dodawanie (wektor4d wek, wektor4d wek2)
wektor4d wek = wczytaj_wektor();
wektor4d wek2 = wczytaj_wektor2();
Tutaj mam właśnie problemy.
A czy w tej funkcji chcesz użyć nowych wektorów, czy już wcześniej wpisanych?
Pierwsza możliwość:

Kod: Zaznacz cały

wektor4d dodawanie (){
  wektor4d wek = wczytaj_wektor();
  wektor4d wek2 = wczytaj_wektor();
  ...
}
Druga:

Kod: Zaznacz cały

wektor4d dodawanie (wektor4d wek, wektor4d wek2){
  ...
}
Więc użyj jednej z nich. Bo dwa naraz to trochę słabo ;p I serio: jedno wcztaj_wektor wystarczy.
LipaMat
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 23 paź 2013, o 17:49
Płeć: Mężczyzna
Lokalizacja: Gdynia
Podziękował: 9 razy
Pomógł: 9 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: LipaMat »

No chcę użyć tych wektorów, które wcześniej będą utworzone z dwukrotnego użycia funkcji wczytaj_wektor.
Awatar użytkownika
musialmi
Użytkownik
Użytkownik
Posty: 3466
Rejestracja: 3 sty 2014, o 13:03
Płeć: Mężczyzna
Lokalizacja: PWr ocław
Podziękował: 382 razy
Pomógł: 434 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: musialmi »

No i pytaniem jest: czy wczytaj_wektor ma się wywoływać i wczytywać wektory w trakcie wykonywania dodawania, czy też wcześniej, i wtedy wektory, które będziesz dodawać, są już wcześniej dane (wczytane) i nie zostaną stracone po zakończeniu funkcji.
LipaMat
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 23 paź 2013, o 17:49
Płeć: Mężczyzna
Lokalizacja: Gdynia
Podziękował: 9 razy
Pomógł: 9 razy

[c++] Przekazywanie argumentów funkcji.

Post autor: LipaMat »

Nie no jest tak, że na początku jest wywoływana funkcja wczytaj_wektor, potem wypisz wektor i później ten wektor, który został wczytany i wypisany ma zostać użyty jako argument funkcji.
ODPOWIEDZ