Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Komunikat z błędem po próbie usunięcia tablicy przy pomocy "delete"

Ostatnio zmodyfikowano 2015-10-08 11:30
Autor Wiadomość
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:

C/C++
#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:

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 :)
P-138203
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<>.
P-138204
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).
P-138265
« 1 »
  Strona 1 z 1