Komunikat z błędem po próbie usunięcia tablicy przy pomocy "delete"
Ostatnio zmodyfikowano 2015-10-08 11:30
Samidare Temat założony przez niniejszego użytkownika |
Komunikat z błędem po próbie usunięcia tablicy przy pomocy "delete" » 2015-10-06 12:18:06 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: #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 ]; 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; wsk2 -= 20; wymnoz( wsk1, wsk2, wsk3 ); for( int i = 0; i < 20; i++, wsk3++ ) { cout <<* wsk3 << endl; } delete[] wsk1; delete[] wsk2; delete[] wsk3; _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: Debug Assertion Failed! Program: link do programu File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp Line: 52 Expression: _Block_Type_Is_Valid(pHead->nBlockUse) For information on how your program cna cause an assertion failiture, see the Visual C++ documentation on asserts. (Press Retry to debug the application) Czy mógłby mi ktoś wytknąć, gdzie robię błąd? Z góry dziękuje :) |
|
Monika90 |
» 2015-10-06 12:48:28 Do delete należy przekazać wartość zwróconą z new, a Ty przekazujesz tam wsk3 zwiększony o 20. A nie musisz przecież inkrementować tych wskaźników, możesz uzyskać dostęp do i-tego elementu tablicy tak: wsk1[i]
Ale Twoim podstawowym błędem jest to, że w ogóle używasz prymitywnych new[] i delete[], zamiast tego należy używać std::vector<>. |
|
Samidare Temat założony przez niniejszego użytkownika |
Dziękuje » 2015-10-08 11:30:19 Dzięki za odpowiedź. Dopiero zaczynam przygodę z C++, uczę się sam. Najwięcej osób polecało, żeby zacząć od Symfonii C++ tak więc to też zrobiłem. Jak już skończę to może chwycę jakiś kurs online lub wersję cyfrową bardziej aktualnego C++ prime (w wersji angielskiej) albo jakiś kurs online i wtedy będę odrzucał starocie, których może trochę niepotrzebnie się nauczyłem. Może masz jakąś sugestie? I jeszcze raz dzięki za pomoc. (wiem, że trochę mi zajęło odpowiedzieć, ale nie potrafiłem znaleźć opcji powiadomień przez maila). |
|
« 1 » |