Usuwanie wskaznika tablicy

0

Witam, to mój kod:

#include <iostream>
#include <string>


const int ZERO = 0;

void wprowadzenie(int *tab, int *n, int i);
void pokazanie(int *tab, int *n, int i);
void srednia(int *tab, int *n);


int main(void)
{
	int *m = new int;
	std::cout << "Ile wynikow wpisac: ";
	std::cin >> *m;

	int *wyniki = new int[*m];

	std::cout << "Wprowadz " << *m << " wynikow."<<std::endl;
	wprowadzenie(wyniki, m, ZERO);

	pokazanie(wyniki, m, ZERO);
	srednia(wyniki, m);

	delete m;
	delete[] wyniki;

	//delete m;

	std::cin.get();
	std::cin.get(); 
	return 0;
}

void wprowadzenie(int *tab, int *n, int i)
{
	using namespace std;
	if (i == *n) { tab[i] = '\0'; cout << endl << "Wprowadziles wszystkie wyniki!\n"; }
	else
	{
		cout << i+1 << ". ";
		cin >> tab[i];
		return wprowadzenie(tab, n , i + 1);
	}
}

void pokazanie(int *tab, int *n, int i)
{
	using namespace std;
	if (*n == i) {}
	else
	{
		cout << tab[i] << ", ";
		pokazanie(tab, n, i + 1);
	}
}

void srednia(int *tab, int *n)
{
	double *srednia = new double;
	*srednia = 0.0;

	for (int i{}; i < *n; i++)
		*srednia = *srednia + tab[i];

	std::cout << "a srednia to: " << *srednia / double(*n);

	delete srednia;
}

Mam jeden problem delete[] wyniki; <- usunięcie wskaźnika na tablicę wyrzuca mi błąd programu i VS, testowałem też w CodeBlocks, to po prostu konsola się automatycznie wyłącza, a nie wiem gdzie popełniłem błąd, jest mi w stanie ktoś go wskazać?

2
if (i == *n) {
  tab[i] = '\0'; // <- wychodzisz poza zakres `tab`
}

/* ... */

int i{} // <- pisz po ludzku `int i = 0;` - najważniejsza jest czytelność

Btw, formatuj porządnie ify - analizowanie instrukcji warunkowej, która rozciąga się na całą szerokość kodu, nie jest ani łatwe, ani przyjemne.

0

@Patryk27: Zwiększenie zakresu tablicy o 1

int *wyniki = new int[*m+1];

Spowodowało brak wystąpienia błędu - nie wiem jak to przeoczyłem, ale na szczęście mam forum. Dziękuję Ci bardzo @Patryk27.

P.S. Styl zapisu to osobista sprawa, co do if'ów się zgodzę, ale już mi się nie chciało rozbijać tego, bo to tylko kod do ćwiczeń. Zapis int i{} mi się podoba i moim zdaniem jest czytelny i zgodny C++11.

2

Popieram co orzekł @Patryk27 w temacie i{}. Mało tego, takie coś:

if (*n == i) {}
else
{
    cout << tab[i] << ", ";
    pokazanie(tab, n, i + 1);
}

też jest zapisem przekombinowanym i mylącym. Nie baw się w obfuskowanie kodu, bo nic dobrego z tego nie wyniknie. W końcu sam przestaniesz rozumieć to co napisałeś.

if (*n != i)
{
    cout << tab[i] << ", ";
    pokazanie(tab, n, i + 1);
}

Taki zapis jest wystarczająco czytelny i nie ma sensu go komplikować. Tym bardziej, że niczemu to nie służy, bo przepływ sterowania jest identyczny w obu przypadkach, a tylko przeszkadza.

0

W tym wszystkim zastanawia mnie cel umieszczania każdej zmiennej na kopcu i męczenie się z wyłuskiwaniem.

0

@furious programming: Masz rację odnośnie tego zapisu, dużo pracy jeszcze przede mną. Ten program @enedil do ćwiczeń był stworzony właśnie w celu nauki wskaźników i ich używania, tak żeby weszło trochę w krew.

0

Tak w roli ścisłości to nie Usuwanie wskaznika tablicy tylko zwalnianie pamięci, na którą ustawiony jest wskaźnik.
Zadeklarowanego wskaźnika nie usuniesz. Sam przestanie być ważny na końcu zasięgu, w którym był zadeklarowany.

0

@YooSy: Tak, to miałem na myśli oraz tak wiem, że zadeklarowanego się nie usuwa.

0
magnus250 napisał(a):

P.S. Styl zapisu to osobista sprawa, co do if'ów się zgodzę, ale już mi się nie chciało rozbijać tego, bo to tylko kod do ćwiczeń. Zapis int i{} mi się podoba i moim zdaniem jest czytelny i zgodny C++11.

  1. Styl zapisu nie jest osobistą sprawą, chyba, że do końca życia zamierzasz programować w zespole jednoosobowym.
  2. Wyrażenie kluczowe w Twojej powyższej wypowiedzi to "moim zdaniem" :) -- "Programs must be written for people to read, and only incidentally for machines to execute." (Abelson & Sussman, "SICP"). Chodzi nie tylko o Ciebie, ale i o innych ludzi. Czytelność nie jest sprawą osobistą ("moim zdaniem"), tylko czymś dość obiektywnym, a jeśli nawet nie, to wyznaczanym do pewnego stopnia przez ogół zainteresowanych...

W ogóle, tak BTW, mam coraz mocniejsze przekonanie, że czytelność jest najważniejszą cechą dobrego kodu (nie licząc poprawności) -- ważniejszą (zwykle) od jego wydajności...

0
koszalek-opalek napisał(a):
magnus250 napisał(a):

P.S. Styl zapisu to osobista sprawa, co do if'ów się zgodzę, ale już mi się nie chciało rozbijać tego, bo to tylko kod do ćwiczeń. Zapis int i{} mi się podoba i moim zdaniem jest czytelny i zgodny C++11.

  1. Styl zapisu nie jest osobistą sprawą, chyba, że do końca życia zamierzasz programować w zespole jednoosobowym.
  2. Wyrażenie kluczowe w Twojej powyższej wypowiedzi to "moim zdaniem" :) -- "Programs must be written for people to read, and only incidentally for machines to execute." (Abelson & Sussman, "SICP"). Chodzi nie tylko o Ciebie, ale i o innych ludzi. Czytelność nie jest sprawą osobistą ("moim zdaniem"), tylko czymś dość obiektywnym, a jeśli nawet nie, to wyznaczanym do pewnego stopnia przez ogół zainteresowanych...

W ogóle, tak BTW, mam coraz mocniejsze przekonanie, że czytelność jest najważniejszą cechą dobrego kodu (nie licząc poprawności) -- ważniejszą (zwykle) od jego wydajności...

Po 2 latach programowania zdecydowanie mogę przyznać, że mieliście rację panowie, jakość kodu i styl, rozbicie na moduły jest najważniejsze :P Pozdro !

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