PDA

View Full Version : سوال: خطای منطقی در هنگام اجرای برنامه



GENERAL IRAJ
جمعه 10 خرداد 1392, 23:54 عصر
با عرض سلام خدمت دوستان واساتید، امیدوارم عنوان خوبی رو برای تایپیک انتخاب کرده باشم،
در کد زیر که مشخصات 4 دانشجو را دریافت می کندو یه سری اعمال از قبیل یافتن بیشترین مقدار
یافتن دانشجوی مورد نظر و ... انجام می ده ،کامپایل به درستی انجام می شه ولی زمان اجرا
یه جور error می ده که ازش سر در نمیارم:



#include <iostream>
#include <conio>
#include <stdlib>
#include <string>
#include <iomanip>
#define s 4
using namespace std;
class student
{ public:
student();
void input();
float getave();
int getstno();
void setnull();
string getname();
friend ostream &operator<<(ostream &output,student &);
private:
string name;
int number;
float ave;
};
student::student()
{
name = "";
}
string student:: getname()
{
return name;
}
void student::input()
{
cout << "please enter name , stnumber & avrage:\n";
cin>>name;
cin>>number;
cin>>ave;
}
float student:: getave()
{
return ave;
}
int student:: getstno()
{
return number;
}
void student::setnull()
{
name = "";
}
ostream &operator<<(ostream &output,student &st)
{
cout<<setw(5) << "name"<<setw(5)<<"stnumber"<<setw(5)<<"average\n";
output<<setw(5)<<st.name<<setw(5)<<st.number<<setw(5)<<st.ave<<endl;
return output;
}
student st[s];
void max();
void search();
void del();
int finds();
void report();
int menu();
int main()
{
int i,c;
for(;;)
{
system("cls");
c= menu();
switch (c){
case 1:
i = finds();
if (i==-1)
{
cout<<" the list is full\a\n";
}
else
st[i].input();
break;
case 2:
max();
break;
case 3:
search();
break;
case 4:
del();
break;
case 5:
report();
break;
case 6:
exit(1);
}
}
}
int menu()
{
int n;
cout << "1- input student:\n";
cout << "2- find Max averag:\n";
cout << "3- search student(based on st number ):\n";
cout << "4- delete student\n";
cout << "5- report of List\n";
cout << "6- exit\n";
do
{
cout << "pleas select number:\n";
cin >>n;
}while (n<0 && n>7);
system("cls");
return n;
}
int finds()
{int i;
for(i = 0;i<s && st[i].getname()!="";i++)
if(i == s)
return -1;
else
return i;
}
void max()
{int p,i;
float mave;
mave = st[0].getave();
for (i=1;i<s;i++)
{
if (mave<st[i].getave())
mave = st[i].getave();
p = i;
}
cout<<"max number is :"<<setw(5)<<st[p];
getch();
system("cls");
}
void search()
{ int i,no;
cout << "number\n";
cin>>no;
for(i = 0;i<s;i++)
{
if (no==st[i].getstno())
{
cout <<" the student is exist\n"<<st[i];
}
else
{
cout << "student" <<no<<"not exist\n";
}
}
getch();
system("cls");
}
void del()
{
getch();
system("cls");
}
void report()
{
for (int i=0;i<s;i++)
{
if(st[i].getname()!="")
cout<<st[i];
}
getch();
system("cls");
}


خطاش رو هم اینجا گذاشتم:

access violation 0x40112c: read of addres 0x4ffffffc

در ضمن این کد در محیط++ Borland Cنوشته واجرا شده است.
با تشکر

rezaricky
شنبه 11 خرداد 1392, 11:19 صبح
سلام ، تست نکردم ولی احتمالا بخاطر st[i].getname()!="" در تابع finds باشه

GENERAL IRAJ
شنبه 11 خرداد 1392, 19:55 عصر
سلام ، در تابع ()finds این مورد چک می شود که آیا آرایه خالی است یا نه ، اگر خالی بود شماره خانه آرایه را برمی گرداند.
من فکر نمی کنم در این قسمت مشکلی وجود داشته باشه ،
ولی هنوز هم نمیدونم که چرا این طوری ایراد میگیره:گیج:
لطفاً یکی کمکم کنه.
باتشکر

saied_hacker
یک شنبه 12 خرداد 1392, 08:47 صبح
من چک کردم مشکلی نداشت این کد ( با codeblock). البته با برلند هم نباید مشکلی داشته باشه

مشکل اینه که شما st رو تعریف کردی منتها بهش حافظه ندادی تا بتونه اطلاعات رو ذخیره کنه..

student* st = (student*) malloc(sizeof(student) * 4);

البته الان اسم و .. رو میگیره و با انتخاب شماره 5 نمایش میده ولی برنامت خیلی بیشتر از این حرفا ایراد داره از جمله این که اگه چند تا اسم ( شماره 1 ) وارد کنی فقط اخری رو نگه میداره و...

-------------------------------------------------
این تابع همیشه 0 برمیگردونه

int finds()
{
int i;
for(i = 0; i<s && st[i].getname()!= ""; i++)
if(i == s)
return -1;
else
return i;
}