اولین بار است که به این وب‌سایت می‌آیید. راهنما را مطالعه کنید!
x
موسسه خیریه محک

شهر ریاضی بازی-ریاضی

مشکل در اجرای کلاس ماتریس

0 امتیاز
1,040 نمایش

سلام
من یه برنامه ماتریس برای انجام پروژم استفاده کردم ولی موقع اجرا خطای زیر رو میده:
Fault: access violation at 0x40af65: write of address 0x3980298
یا Fault: access violation at 0x40adc6: write of address 0xffffffd
خیلی هم دستکاریش کردم بازهم همین خطا رو میده با آدرس های متفاوت
دوستان اگه کسی میتونه بگه ایراد از چیه
اینم کد برنامه:

#include "iostream.h"

class matrix
{

int **p,m, n;

public:
matrix(int row,int col)
{
m=row;
n=col;
p = new int*[m];
for (int i=0; i<m; i++)
p[i] = new int[n];
}
~matrix()
{
for (int i=0; i<m; i++)
delete p[i];
delete p;
}
void initialize()
{

for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
p[i][j]=0;
}
}
}
void accept()
{
cout<<"Enter matrix elements:";
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
cin >> p[i][j];
}
}
}
void display()
{

for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
cout << p[i][j] <<" ";
cout <<endl;
}
cout<<endl;
}

matrix operator= (matrix eq)
{
m = eq.m;
n = eq.n;
p = eq.p;

return *this;
}

friend matrix operator * (matrix, matrix);
};
matrix operator *(matrix T , matrix b)
{

for(int i=0; i<b.n; i++)
{for(int j=0; j<b.n; j++)
T.p[i][j] =b.p[i][j];
for(int j=b.n; j<T.n; j++)
T.p[i][j] =2;}
for(int i=b.n;i<T.m;i++)
for(int j=0;j<T.n;j++)
T.p[i][j]=1;
T.display();
}
int main()
{
    matrix b(2,2);
    b.initialize();
    b.display();
    matrix T(4,4);
    operator*(&T,b);
    T.display();
    T.~matrix();
    b.~matrix();
    return 0;
    }

این برنامه ایه که ماتریس با ابعاد کوچکتر را میگیره و به یه ماتریس با ابعاد بزرگتر تبدیل میکنه و اعداد ماتریس کوچکتر را توش جایگذاری میکنه.
خودم فکر میکنم اشکال از ارجاع ماتریسTباشه و باید با رفرنس ارجاش بدم ولی نتونستم.

پرسیده شده پنجشنبه ۱۶ خرداد ۱۳۹۲ در C++ توسط hamze327  

1 پاسخ

0 امتیاز

۱) تابع operator* باید طبق تعریف یه ماتریس برگردونه که شما در تعریف تابع هیچی برنمی‌گردونین.
۲) هنگام اجرای عملگر * در تابع main یعنی خط زیر

operator*(&T, b);

احتمالاً منظورتون چیزی شبیه زیر بوده. کلمه‌ی operator در اجرا نمی‌آد

T = T*b;

لازم نیست آدرس T رو به صورت &T استفاده کنین.
۳) لازم نیست مخرب‌ها رو به صورت دستی فراخوانی کنین. دو خط زیر اضافه است

T.~matrix();
b.~matrix();

۴) ماتریس ‍T با تابع initialize() مقداردهی نشده.
۵) تابع accept رو هیچ جا فراخوانی نکردین.
به هر حال فکر کنم برنامه‌ی تغییر یافته‌ی زیر تا حدی مشکل شما رو رفع کنه

#include "iostream.h"

class matrix
{

int **p,m, n;

public:
matrix(int row,int col)
{
m=row;
n=col;
p = new int*[m];
for (int i=0; i<m; i++)
p[i] = new int[n];
}
~matrix()
{
for (int i=0; i<m; i++)
delete p[i];
delete p;
}
void initialize()
{
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
p[i][j]=0;
}
}
}
void accept()
{
cout<<"Enter matrix elements:";
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
cin >> p[i][j];
}
}
}
void display()
{
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
cout << p[i][j] <<" ";
cout <<endl;
}
cout<<endl;
}
matrix operator= (matrix eq)
{
m = eq.m;
n = eq.n;
p = eq.p;
return *this;
}
friend void operator * (matrix &, matrix &);
};
void operator *(matrix &T , matrix &b)
{
  for(int i=0; i<b.n; i++)
  {
    for(int j=0; j<b.n; j++)
      T.p[i][j] =b.p[i][j];
    for(int j=b.n; j<T.n; j++)
      T.p[i][j] =2;
  }
  for(int i=b.n;i<T.m;i++)
    for(int j=0;j<T.n;j++)
      T.p[i][j]=1;
  T.display();
}
int main()
{
    matrix b(2,2);
    b.initialize();
    b.display();
    matrix T(4,4);
    T*b;
    T.display();
    return 0;
}
هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پاسخ داده شده پنجشنبه ۱۶ خرداد ۱۳۹۲ توسط prodo  

خیلی ممنون دوست عزیز
ولی تابع *operator دو ماتریس T و b را میگیره مثلا ماتریس b یک ماتریس 2 در 2 باشه و T یک ماتریس مثلا 4 در 4، حالا محتویات درایه های ماتریس b رو کپی میکنه توی ماتریس T و بقیه ماتریس T را با یکسری اعداد پر میکنه ولی هنگام اجرا اون خطاها را میده اون توابعی هم که تعریف کردم ولی استفاده نکردم اشکالی نداره اگه از این مرحله عبور کنم از اونها استفاده میکنم برای همین هم تعریفشون کردم

اون برنامه‌ای که من تغییر دادم باید کار کنه. امتحان کردین؟
مشکلی در operator* نیست. فقط فراخوانی‌ش به صورت operator*(T, b) اشتباهه.
اون تغییری هم که من روی کدتون دادم برای اینه که استاندارد operator* به صورت زیر هست

const class& operator*(const class&, const class&);

که به صورت تابع دوست تعریف می‌شه یا

const class& operator*(const class&) const;

که به صورت تابع عضو تعریف می‌شه

اشکالی که تابع operator* تعریف شده توسط شما داره اینه که شما به صورت زیر اعلان کردین

friend matrix operator * (matrix, matrix);

یعنی ازش انتظار دارین یه ماتریس برگردونه اما داخل تابع هیچ دستور return ای وجود نداره که ماتریس برگردونه