[C++] Błąd przy zwalnianiu dynamicznej tablicy

Anxious
Użytkownik
Użytkownik
Posty: 191
Rejestracja: 27 paź 2012, o 14:39
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 42 razy

[C++] Błąd przy zwalnianiu dynamicznej tablicy

Post autor: Anxious »

Witam,

Przerabiam sobie własnie pierwszy tom symfonii C++ (mój pierwszy kontakt z programowaniem) i zatrzymałem się na takim oto zadaniu:

"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 ma na elementach tych tablic wykonać operację mnożenia - taką, że i-ty element pierwszej tablicy 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 trzeciej, a następnie skasuj te tablicę.

Mój program jest następujący:

Kod: Zaznacz cały

#include <iostream>
#include <conio.h>
using namespace std;

void wymnoz (double *tab1, double *tab2, double *tab3);

int main ()
{
	double *wsk1, *wsk2, *wsk3;
	wsk1 = new double [20]; //elastycznosc tablic dodam, jak juz rozwiaze moj problem
	wsk2 = new double [20];
	wsk3 = new double [20];
	for (int i=0; i<20; i++, wsk1++, wsk2++)
	{
		cout<<(*wsk1=i/13.0)<<'\t'<<(*wsk2=i*13.0)<<endl;
	}
	wsk1-=20; //nie jestem pewien, czy to najlepszy sposob, ale zdaje sie dzialac
	wsk2-=20;
	wymnoz(wsk1, wsk2, wsk3);
	for (int i=0; i<20; i++, wsk3++)
	{
		cout<<*wsk3<<endl;
	}
	delete [] wsk1;
	delete [] wsk2;
	delete [] wsk3;
	// Powyzsze 3 liniki powoduja u mnie blad
	_getch();
	return 0;
}

void wymnoz (double *tab1, double *tab2, double *tab3)
{
	for (int i=0; i<20; i++, tab1++, tab2++, tab3++)
	{
		*tab3=(*tab1)*(*tab2);
	}
}
Kiedy spróbowałem wykasować stworzone tablice, mój kompilator (to jest Visual C++ 2010) zaczął wyświetlać następujący komunikat:
AU
AU
xmq0qr.jpg (15.25 KiB) Przejrzano 110 razy
Czy mógłby mi ktoś wytknąć, gdzie robię błąd? Z góry dziękuje :)
Ostatnio zmieniony 6 paź 2015, o 18:21 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Błąd przy zwalnianiu dynamicznej tablicy

Post autor: Afish »

Po pierwsze — takie operowanie na tablicach to proszenie się o kłopoty. Nie znasz operatora nawiasów kwadratowych?
Meritum: źle zwalniasz trzecią tablicę, bo modyfikujesz wskaźnik, a potem nie przywracasz go do początku.
Awatar użytkownika
csminus
Użytkownik
Użytkownik
Posty: 45
Rejestracja: 29 lis 2014, o 13:06
Płeć: Mężczyzna
Lokalizacja: Lublin/Kraków/Warszawa
Pomógł: 3 razy

[C++] Błąd przy zwalnianiu dynamicznej tablicy

Post autor: csminus »

To, że wiesz o możliwości inkrementacji wskaźników nie oznacza, że musisz jej na siłę używać gdy jest to dla Ciebie nie wygodne w danej sytuacji.-- 7 paź 2015, o 09:05 --Trzymaj gotowca bo mam dzisiaj wybitny nastrój.

Kod: Zaznacz cały

#define SIZE 20
//---------------------------------------------------------------------------------------

#include <iostream>
//---------------------------------------------------------------------------------------

void fillTab(double *tab);
void printTab(double *tab);
void multipleTab(double *tab1, double *tab2, double *tab3);
//---------------------------------------------------------------------------------------

int main(){
    double *tab1 = new double[SIZE], *tab2 = new double[SIZE], *tab3 = new double[SIZE];

    fillTab(tab1);
    fillTab(tab2);

    multipleTab(tab1, tab2, tab3);

    printTab(tab1);
    printTab(tab2);
    printTab(tab3);

    delete [] tab1;
    delete [] tab2;
    delete [] tab3;

    return 0;
}
//---------------------------------------------------------------------------------------

void fillTab(double *tab){
    std::cout << "Podaj " << SIZE << " wartosci 
";
    for(int i = 0; i < SIZE; ++i) std::cin >> tab[i];
}
//---------------------------------------------------------------------------------------

void printTab(double *tab){
    for(int i = 0; i < SIZE; ++i) std::cout << tab[i] << " ";
    std::cout << "
";
}
//---------------------------------------------------------------------------------------

void multipleTab(double *tab1, double *tab2, double *tab3){
    for(int i = 0; i < SIZE; ++i) tab3[i] = tab1[i] * tab2[i];
}
//---------------------------------------------------------------------------------------
ODPOWIEDZ