PDA

View Full Version : سوال: کمبود حافظه



shmokarami
چهارشنبه 22 آذر 1391, 21:23 عصر
سلام
من یک برنامه برای حل مساله کوتاهترین مسیر نوشتم که توش از آرایه از لینک لیست استفاده شده. وقتی اندازه آرایه تا 1200تاست الگوریتم جواب میده ولی برای اندازه بزرگتر این پیغامو میده:
Windows has triggered a breakpoint in Network1.exe.

This may be due to a corruption of the heap, which indicates a bug in Network1.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while Network1.exe has focus.

The output window may have more diagnostic information

تو اینترنت دیدم فهمیدم مشکلش از Memory هست ولی نمیدونم چطور باید حلش کنم.
تازه اندازه مساله اصلیم 200000 تایی است. اگه کسی راهنمایی کنه واقعا ممنون میشم
اگه نیاز هست برنامه رو بذارم

shahmohammadi
چهارشنبه 22 آذر 1391, 22:34 عصر
سلام.
یه برنامه تا 4گیگ رو می تونه داشته باشه. اندازه هر عضو آرایه‌تون چقدر است؟

shmokarami
پنج شنبه 23 آذر 1391, 00:12 صبح
سلام ممنون از توجهتون
هر عضو آراریه یه لینک لیست هست و هد عضو لینک لیست یک کلاس شامل چند int میشه

shmokarami
پنج شنبه 23 آذر 1391, 00:14 صبح
هر عضو آراریه یه لینک لیست هست و هد عضو لینک لیست یک کلاس شامل چند int میشه

hadi0x7c7
پنج شنبه 23 آذر 1391, 00:16 صبح
بهتره داده ساختارتونو از لیست مجاورت به ماتریس مجاورت تغییر بدین. در ضمن مسئله acm که نیست ؟

shmokarami
پنج شنبه 23 آذر 1391, 00:31 صبح
منظورتون از ماتزیس مجاورت، آرایه دو بعدی هست؟ چون از قبل اندازه آرایه نمیدونم از آرایه پویا استفاده کردم. نمیدونم acm که نوشتین یعنی چی؟ از توجهتون ممنونم

shahmohammadi
پنج شنبه 23 آذر 1391, 12:19 عصر
فرض كنيد هر عضو از نوع يك struct هست به اسم node.
حالا بنويسيد sizeof(node) رو چاپ كنيد ببينيد چند رو نشون مي ده. مي خام ببينم وقتي ضربدر 1200 مي‌شه چند مي‌شه.
يا اگه نتونستيد اندازه شو پيدا كنيد پياده سازي اون ليست رو اينجا بنويسيد تا من اندازه شو حساب كنم.

shmokarami
پنج شنبه 23 آذر 1391, 13:12 عصر
سلام بازم ممنون
وقتی دستور sizof(nodes) رو میزنم بازهم همون error میگیره که تو پست اول نوشتم
قسمت اصلی برنامه که مشکل داره میذارم اگه امکان راده نگاش کنید:



class arc
{
// const int M=1000000;
public:
arc(int Id=0, int co=1000000, int tr=1000000, int co_scaled=1000000, arc* ne=0) : ID(Id), cost(co), transit_time(tr), cost_scaled(co_scaled),next(ne) {}

int ID; // The tail(nodes) or head(B) of arc.
int cost;
int cost_scaled;
int transit_time;
arc* next;
};
class path{
public:
path(int ID=0, int d=1000000, int pr=0) : ID(ID), d(d), pr(pr) {}

int ID; // The ID of node.
int d; // The distance from source.
int pr; // the pred
};

class Network{
public:
int n; //number of nodes.
int s; //source
int t; // sink
int T; //time horizon
void nodes_initials();
void creat_Network();
void add_arc_nodes(int , arc );
void add_arc_B(int , arc );
void print_cost( );
void print_cost_B( );
int Shortest_Path_Dijkstra(int ,int );
int Find_Min_Temp(int [],int );
int CSP_FPTAS(double ,double ,double );
int CSP( );
void compute_cost_scaled(double );
int max_cost( );
arc **nodes;
arc **B; //B[i} shows the incoming arc of the node i;

private:

};

void Network::nodes_initials(){

cout<< "Please enter the nmber of nodes:"<<endl;
cin>> n;
cout<< "Please enter the ID of source:"<<endl;
cin>> s;
cout<< "Please enter the ID of sink:"<<endl;
cin>> t;
cout<< "Please enter the time horizon:"<<endl;
cin>> T;
nodes=new arc *[n+1];
B=new arc *[n+1];
for (int i=0; i<=n; i++)
{
nodes[i]=new arc;
B[i]=new arc;
}
}
void Network::add_arc_nodes(int i, arc a) // i is the head of arc a.
{
arc* q;
if (nodes[i]->ID==0)
{
nodes[i][0]=a;
}
else
{ int count=1;
q=&nodes[i][0];
while (q->next!=0)
{
q=q->next;
count++;
}
nodes[i][count]=a;
nodes[i][count-1].next=&nodes[i][count];

}

}

void Network::add_arc_B(int j, arc a) // i is the head of arc a.
{
arc* q;
if (B[j]->ID==0)
{
B[j][0]=a;
}
else
{ int count=1;
q=&B[j][0];
while (q->next!=0)
{
q=q->next;
count++;
}
B[j][count]=a;
B[j][count-1].next=&B[j][count];

}

}
void Network::creat_Network() // read the network's parameter from data file.
{
int i;//head of arc.
int j;//tail of arc.
int co;// cost of arc.
int tr; //transit time of arc.

ifstream file;
file.open("Data.txt", ios::in);
while(file >> i >> j >> co >> tr)
{
arc a(j, co, tr);
add_arc_nodes(i,a);
arc b(i, co, tr);
add_arc_B(j,b);
}
file.close();
}
void Network::print_cost( )
{
arc* q;
for (int i=1; i<=n; i++)
{
q=&nodes[i][0];
if (q->ID!=0)
{
while(q->next!=0)
{
cout<<"The cost of arc "<<i<<"-->"<<q->ID<<" is: "<<q->cost<<endl;
q=q->next;
}
cout<<"The cost of arc "<<i<<"-->"<<q->ID<<" is: "<<q->cost<<endl;
}
}
}

shahmohammadi
پنج شنبه 23 آذر 1391, 20:42 عصر
اندازه هر عضو 20 بایت هست.
وقتی اندازه آرایه‌تون 1200 هست یعنی 1200 تا لیست‍پیوندی دارید. می‌شه بگید هر کدوم از این لیست‌های ‍پیوندی چند تا عضو رو داره. یعنی داخل هر عضو از آرایه تون چند تا عضو وجود داره؟
حالا که می خواهید داخل هر عضو آرایه یک لیست‍پیوندی باشه خوب اینطوری حافظه‌تون به خاطر وجود 4بایت اشاره گر در هر عضو کمی به هدر می‌ره. بهتره از همون روش دوستمون hadi0x7c7 استفاده کنید.

shmokarami
جمعه 24 آذر 1391, 18:41 عصر
ممنون از راهنماییتون