PDA

View Full Version : مشکل در اجرای برنامه ماتریس در c++



hamze327
چهارشنبه 15 خرداد 1392, 12:49 عصر
سلام
من یه برنامه ماتریس برای انجام پروژم استفاده کردم ولی موقع اجرا خطای زیر رو میده:
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();


}

بهروز عباسی
چهارشنبه 15 خرداد 1392, 13:16 عصر
:متعجب:

شما کلاس رو تعریف کردی ولی ایجادش نکردی ،تابع Main هم که نداری چطوری میخوای اجرا بشه ؟؟
اینم کد اصلاح شده که یک ماتریس 3*3 میسازه ،در MS VC++‎‎ 2012 هم کامپایل کردم .

#include "stdafx.h"
#include <iostream>

using namespace std;

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:\n";
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> p[i][j];
}
}
}

void display() {
cout << endl;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
cout << p[i][j] << "\t";
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 Tmatrix(3, 3);
Tmatrix.initialize();
Tmatrix.accept();

Tmatrix.display();

system("pause");
return 0;
}

105148


موفق باشی.

hamze327
چهارشنبه 15 خرداد 1392, 15:09 عصر
خیلی ممنون دوست عزیز
درسته من فراموش کردم تابع main رو بذارم ولی تابع main داره و الا اجرا نمیشد
من از کامپایلر ++borland c استفاده میکینم و به دستوراتinclude "stdafx.h ، using name std و system("pause"); گیر میده
تابع mainخودمم گذاشتم
این برنامه ایه که ماتریس با ابعاد کوچکتر را میگیره و به یه ماتریس با ابعاد بزرگتر تبدیل میکنه و اعداد ماتریس کوچکتر را توش جایگذاری میکنه.
matrix b(2,2);
b.initialize();
b.display();
matrix T(4,4);
operator*(T,b);
T.display();
T.~matrix();
b.~matrix();
return 0;

ضمن اینکه خط آخر تابع matrix operatorفراموش کردم return T;را قرار بدم.

:متعجب:

شما کلاس رو تعریف کردی ولی ایجادش نکردی ،تابع Main هم که نداری چطوری میخوای اجرا بشه ؟؟
اینم کد اصلاح شده که یک ماتریس 3*3 میسازه ،در MS VC++‎‎‎ 2012 هم کامپایل کردم .

#include "stdafx.h"
#include <iostream>

using namespace std;

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:\n";
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> p[i][j];
}
}
}

void display() {
cout << endl;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
cout << p[i][j] << "\t";
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 Tmatrix(3, 3);
Tmatrix.initialize();
Tmatrix.accept();

Tmatrix.display();

system("pause");
return 0;
}

105148


موفق باشی.

developing
یک شنبه 19 خرداد 1392, 10:00 صبح
با سلام

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

1- usnig namespace std رو پاک کن.

2- include "stdafx" رو هم پاک کن.

3- یکی از این کارها رو انجام بده:

الف) یا سرآیند stdlib رو به اول برنامه اضافه کن.
ب) به جای system("pause) از تابع ()getch استفاده کن. (این تابع در سرآیند conio هست)