Problem ze wskaźnikiem na wektor

0

To co w temacie, bawie się ze wskaźnikami, ale z tego co ludzie tutaj piszą, to zamiast tablic dynamicznych(new) lepiej używać wektorów(w związaku ze wskaźnikami). Tak więc teraz próbuje troche swoich sił z wektorami, ale wyskakuje mi sporo błędów, sam raczej nie jestem na tyle zaawansowany, żeby je rozwiązać, więc prosze o jakieś sensowne wytłumaczenie(dodałem w kodzie komentarze, aby wyrazić mój tok myślenia). Sam program jak widać, ma pobrać od usera 5 float'ów do wektora, z których funkcja "srednia" ma obliczyc srednia.

#include <iostream>
#include <vector>
using namespace std;

float srednia(vector<float>* wsk)
{
	float suma = 0;
	for (int i = 0; i < 5; i++)
	{
		suma += *wsk[i];
	
	}
	return suma / 5;
}
int main()
{
	vector <float>* wsk;
	vector <float> liczby;
	wsk = &liczby; // wsk na liczby
	float liczba;

		for (int i = 0;i < 5; i++)
		{
		cout << "Podaj liczbe: ";
		cin >> liczba;
		*wsk.push_back(liczba); // wsk na ostatniej pozycji wektora
		
		}

		wsk = liczby; //ustawiam wsk znowu na pierwszą pozycje wektora
		cout << srednia(wsk);
	
	return 0;
}
1

Sam program jak widać, ma pobrać od usera 5 float'ów do wektora, z których funkcja "srednia" ma obliczyc srednia

std::vector to klasa, nie potrzebujesz zapamiętywać żadnych początków czy końców bo Twój wskaźnik będzie cały czas pokazywał na to samo miejsce. Nie potrzebujesz też żadnych wskaźników, żeby rozwiązać cytowany problem.

Ale jeżeli chcesz koniecznie sprawić, by Twój kod działał, poniżej masz po poprawkach:

#include <iostream>
#include <vector>
using namespace std;

float srednia(vector<float>* wsk)
{
    float suma = 0;
    for (int i = 0; i < 5; i++)
    {
        suma += (*wsk)[i];

    }
    return suma / 5;
}
int main()
{
    vector <float>* wsk;
    vector <float> liczby;
    wsk = &liczby; // wsk na liczby
    float liczba;

        for (int i = 0;i < 5; i++)
        {
        cout << "Podaj liczbe: ";
        cin >> liczba;
        (*wsk).push_back(liczba);

        }

        cout << "\nsrednia: " << srednia(wsk);

    return 0;
}
1

Weź sobie zobacz jak się dostać do elementu wektora. Jakbyś poszukał to byś znalazł, że jak masz wskaźnik to powinno być (*wsk)[x].
Jak masz pointer do jakiegoś obiektu to nie możesz wołać funkcji za pomocą kropki tylko strzałki wsk->push_back(x);
Na początku zrobiłeś wsk = &liczby.
Potem robisz wsk = liczby. Dlaczego tak?

No to ci opisałem mniej więcej co trzeba poprawić.

4

Przekaż sobie referencję, a nie wskaźnik, będzie tak samo tylko łatwiej:

float srednia(const vector<float> &v)
{
    float suma = 0;
    size_t limit = v.size();
    for (size_t i = 0; i < limit; i++)
    {
        suma += v[i];

    }
    return suma / limit;
}

W STL Masz accumulate, żeby takich sumowań nie pisać samemu z błędami:
https://en.cppreference.com/w/cpp/algorithm/accumulate

2

Nawracaliśmy cię już na porzucenie wskaźników na rzecz notacji tablicowej, oraz dostałeś inne wskazówki, ale widzę że jesteś oporny na informację, co więcej, cofnąłeś się do jakiś potworków. tego się nie da inaczej opisać.
Znajomy, oficer policji, mówił coś podobnego o swoich kolegach ze starszego ustroju.

1
Wayne napisał(a):

... ale wyskakuje mi sporo błędów, sam raczej nie jestem na tyle zaawansowany, żeby je rozwiązać,

Moja wróżka jest na kwarantannie, i nie wiem jakie masz błędy. Bijesz się z programowaniem już długo, nadal nie wiesz, że należy je podawać?

0

Problem rozwiązany, dziękuje za wszystkie wypowiedzi.

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