Wskaźniki - zadanie z Symfonii do sprawdzenia

0

Treść zadania:
Napisz program, w którym w funkcji main zostaną stworzone (operatorem new) trzy tablice typu double o rozmiarach co najmniej 20 elementów. Elementy pierwszych dwóch tablic załaduj jakimiś wartościami. W programie powinna być funkcja, która przyjmie wysłane do niej te trzy tablice. Funkcja ta ma na elementach tych tablic wykonać operację mnożenia - taką, że i-ty elementu tablicy pierwszej zostanie pomnożony przez i-ty element tablicy drugiej. Rezultat ma zostać wpisany do i-tego elementu tablicy trzeciej.
W funkcji main wypisz na ekranie zawartość poszczególnych elementów tablicy pierwszej,drugiej i trzecie, a następnie skasuj te tablice.

Daje mój kod. Chciałem spytać czy dobrze to zrobiłem ? Bo przy usuwaniu tablic pojawia mi się okienko konsolowe z błędem Microsoft C++ Deubug library.Zdjęcie:user image

Kod:

#include <iostream>
using namespace std;
void zaladuj(double *wskaznik,int ile);
void operacja(double *wsk, double *wsk1, double *wsk2, int ile);
int main()
{
	double *wskaznik0, *wskaznik1, *wskaznik2;
	wskaznik0 = new double [20];
	wskaznik1 = new double [20];
	wskaznik2 = new double [20];
	zaladuj(wskaznik0,20);
	zaladuj(wskaznik1,20);
	operacja(wskaznik0,wskaznik1,wskaznik2,20);

	for(int i = 0; i < 20; i ++, wskaznik0++, wskaznik1++, wskaznik2++)
	{
		cout << *wskaznik0 << "\t" << *wskaznik1 << "\t" << *wskaznik2 << endl;
	}
	delete[] wskaznik0;
	delete[] wskaznik1;
	delete[] wskaznik2;

	system("pause");
}
void zaladuj(double *wskaznik,int ile)
{
	for(int i = 0; i < ile ; i++, wskaznik++)
	{
		*wskaznik = i;
	}

}
void operacja(double *wsk, double *wsk1, double *wsk2, int ile)
{
	for(int i = 0; i < ile; i ++, wsk++, wsk1++, wsk2++)
	{
		*wsk2 = (*wsk) * (*wsk1);
	}
} 
0

Poprzednia moja odpowiedź była błędna:)
Problemem jest to że powinieneś zwalniać tablice jednowymiarową przez delete wskaźnik. Do tego w pętli for wyświetlającej zawartość dodatkowo zmieniasz wartość wskaźnika i robi się segmentacja pamięci:)

Zmień ostatnie linie w mainie i powinno działać

     for(int i = 0; i < 20; i ++)
    {
        cout << *(wskaznik0+i) << "\t" << *(wskaznik1+i) << "\t" << *(wskaznik2+i) << endl;
    }
    delete wskaznik0;
    delete wskaznik1;
    delete wskaznik2;
1
  for(int i = 0; i < ile; i ++, wsk++, wsk1++, wsk2++)
    {
        *wsk2 = (*wsk) * (*wsk1);
    } 

Co to za dziwne nawyki?
W ten wlasnie sposob przekraczasz przydzielona tablice...
Problem nie tkwil w zwalnianiu pamieci -> http://ideone.com/qFwHES

0

Nie bardzo rozumiem ten mój błąd.
W pętli for dodaje do wsk++, aby w następnym obiegu pętli pokazał o jeden wskaźnik dalej. Bo ten wskaźnik pokazuje na zerowy element tablicy, więc w instrukcji for wykonuje instrukcję dla takich samych elementów dla każdej tablicy.

1
nowicjusz35 napisał(a):

Nie bardzo rozumiem ten mój błąd.
W pętli for dodaje do wsk++, aby w następnym obiegu pętli pokazał o jeden wskaźnik dalej. Bo ten wskaźnik pokazuje na zerowy element tablicy, więc w instrukcji for wykonuje instrukcję dla takich samych elementów dla każdej tablicy.

@lookacode1 zacytował zły fragment, ale to faktycznie nietypowa obsługa fora Cię zgubiła.

W funkcji main masz:

    wskaznik0 = new double [20];
    wskaznik1 = new double [20];
    wskaznik2 = new double [20];
    // ...
    for(int i = 0; i < 20; i ++, wskaznik0++, wskaznik1++, wskaznik2++)
    {
        // ...
    }

    delete[] wskaznik0;
    delete[] wskaznik1;
    delete[] wskaznik2;

Czyli delete[] podajesz inny (o 20 miejsc) wskaźnik, niż otrzymany z new[].

0
    wskaznik0 = new double [20];
    wskaznik1 = new double [20];
    wskaznik2 = new double [20];
    // ...
    for(int i = 0; i < 20; i ++, wskaznik0++, wskaznik1++, wskaznik2++)
    {
        // ...
    }
 
    delete[] wskaznik0-20;
    delete[] wskaznik1-20;
    delete[] wskaznik2-20;
0

jeszcze raz wracam do tego programu, moja funkcja zaladuj też była zła, prawda ? Ponieważ przesunąłem wskaźnik ?

1

Nie, była poprawna¹ ponieważ do funkcji kopiowałeś wskaźniki, przez co operowałeś na ich kopiach, nie zmieniając oryginałów.

¹ ale wciąż nietypowa, lepiej by było, gdybyś po prostu używał indeksów.

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