Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 3 của 3
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Lỗi bài tập Vector - Khi chạy trên CodeBlock và VS C++

    Chào mọi người
    Mình có làm 1 bài toán Vector đơn giản, nhập , gán
    Mình thấy cũng đúng rồi, nhưng chạy trên Visual C++ 2005 thì cứ lỗi đơ file chạy . Thử đem qua CodeBlock thì thấy chạy ổn ko sao cả.
    Nhờ mọi người giúp mình với được ko. Xin cảm ơn


    Mã nguồn PHP:
    #include"stdafx.h" #include<iostream> #include<math.h> using namespace std; class Vector { private: int n; float *v; public: Vector() {n=0;} Vector(int size) { n=size; v=new float[n]; } ~Vector() { delete v; } void getdata(); void display(); Vector & operator=(const Vector &x); friend Vector operator*(const Vector &x, float k); }; void Vector::getdata() { if(n==0) { cout<<"
    Nhap n = "
    ; cin>>n; } else { for(int i=0;i<n;i++) { cout<<"Nhap toa do thu "<<i+1<<" : "; cin>>v[i]; } } } void Vector::display() { cout<<"( "<<v[0]; for(int i=1;i<n;i++) { cout<<","; cout<<v[i]; } cout<<" )
    "
    ; } Vector & Vector::operator=(const Vector &x) { if(n!=x.n) { delete v; n=x.n; v=new float[n]; } for(int i=0;i<n;i++) v[i]=x.v[i]; return *this; } int main() { float k=3; Vector a(5); a.getdata(); a.display(); Vector b; b=a; b.display(); }  

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ^
    1) Ở hàm khởi tạo mặc định chưa gán con trỏ v = 0, nên nó sẽ trỏ vào 1 vùng không xác định. Giải phóng con trỏ v lúc này sẽ gây lỗi.
    2) Để giải phóng vùng nhớ do v trỏ đến, phải dùng delete[] v; chứ không phải delete v;
    3) Hàm getdata() có vấn đề. Do chỉ nhập n mà không cấp phát vùng nhớ cho v nên các thao tác sau đó sẽ bị lỗi.
    4) Hàm display() chưa xử lý trường hợp vector rỗng.
    5) Chưa có Hàm tạo sao chép (copy constructor).
    Tạm thời tôi sửa code lại như sau, do khá đơn giản và dễ nhìn nên tôi không ghi comment:


    Mã:
    #include"stdafx.h"#include<iostream>#include<math.h>using namespace std; class Vector{private:    int n;    float *v;    void __clear();    Vector& __make_copy(const Vector&);public:    Vector() : n(0), v(0) {}    Vector(const Vector& other) { __make_copy(other); }    Vector(int size) : n(size) { v = new float[size]; }    ~Vector() { __clear(); }     void getdata();    void display();     Vector &operator=(const Vector &x) { return __make_copy(x); }     friend Vector operator*(const Vector &x, float k); }; void Vector::getdata(){    if (n == 0 || v == 0)    {        cout<< endl << "Nhap n = ";        cin >> n;         if (v)            delete[] v;         v = new float[n];    }     for(int i = 0; i < n; ++i)    {        cout << "Nhap toa do thu " << i + 1 << " : ";        cin >> v[i];        cin.ignore();    }} void Vector::display(){    if (n == 0 || v == 0)        cout << "Vector rong!!!";    else    {        cout << "( " << v[0];        for(int i = 0; i < n; ++i)            cout << ',' << v[i];        cout << " )" << endl;    }}void Vector::__clear(){    n = 0;    if (v)        delete[] v;}Vector& Vector::__make_copy(const Vector& other){    __clear();     if (other.n != 0 && other.v != 0)    {        n = other.n;        v = new float[n];        for (int i = 0; i < n; ++i)            v[i] = other.v[i];    }    return *this;} int main(){    float k=3;        Vector a(5);    a.getdata();    a.display();        Vector b;    b = a;    b.display();     cin.get();    return 0;}

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Chân thành cảm ơn ban, bạn nhiệt tình quá

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •