alireza323
دوشنبه 12 تیر 1391, 16:45 عصر
سلام
دوستان من یه برنامه دارم که توش از اشاره گرها زیاد استفاده کردم.تو برنامه تا جایی که شده فضاهای تخصیص داده شده رو آزاد کردم..لی خب خیلی هاشم نشده، چون تو اجرا نیاز داشتم.
برنامه من یه فایل اسمبلی رو به عنوان ورودی میگیره، و از رو دستورات این فایل گراف وابستگی اون رو میسازه.
وقتی گراف ساخته شد، من یه تابع دارم که این تابع کارش ساده کردن این گراف هستش، که تو اجرای این تابع وسطای کار خطای exception: std::bad_alloc at memory location رخ میده! کد تابعی که کار ساده کردن رو انجام میده کد زیر هست. در واقع خطا وقتی که از "=operator" استفاده میکنم رخ میده. که این operator رو خودم تو کلاس Node پیاده کردم، که کد اون رو هم پایین میذارم.
vector<LinkedList*> Graph::GraphReduction(vector<LinkedList*> list)
{
LinkedList *l1;
LinkedList *l2;
Node* node1 = NULL;
Node* node2 = NULL;
Node* temp = NULL;
int counter = 0, counter2 = 0, j = 0, headIndex = -1, k = 0;
bool onIncomingVertex = false;
//remove vertex with 1 incoming and 1 outgoing and vertex with only 1 incoming edge and vertex with only 1outgoing edge
for(int i = 0; i < list.size(); i++)
{
onIncomingVertex = false;
headIndex = -1;
counter2 = 0;
if(!compare(list[i]->first->type, "dll"))
{
temp = node1 = list[i]->first->E.next;
if(node1 != NULL)
{
for(k = 0; k < list[i]->nodesNo - 1; k++)
{
counter = 0;
headIndex = -1;
for(j = 0; j < list.size(); j++)
{
l1 = list[j];
l2 = list[i];
node2 = list[j]->first->E.next;
if(node2 != NULL)
{
for(int l = 0; l < list[j]->nodesNo - 1; l++)
{
if(node2->operator = (node1))
{
counter++;
}
if(node1->operator = (list[j]->first))
{
headIndex = j;
}
if(node2->operator = (list[i]->first))
{
onIncomingVertex = true;
counter2++;
}
if(node2->E.next != NULL)
{
node2 = node2->E.next;
}
}
}
}
if(counter < 2)
{
break;
}
temp = node1;
if(node1->E.next != NULL)
{
node1 = node1->E.next;
}
}
if(counter < 2)
{
if(list[i]->first->type != "condjump")
{
if(temp != NULL && (!compare(temp->type, "dll")))
{
list[i]->delNode(temp);
if(headIndex > - 1)
{
if(list[headIndex]->first->E.next != NULL)
{
list[i]->addNode(list[headIndex]->first->E.next, "");
}
delete list[headIndex];
list.erase(list.begin() + headIndex);
i--;
continue;
}
}
}
}
}
//Remove vertex with only 1 incoming edge
if(!onIncomingVertex && counter2 < 1 && list[i]->nodesNo <= 2 && list[i]->first->type != "condjump")
{
delete list[i];
list.erase(list.begin() + i);
i--;
continue;
}
}
}
}
کد =operator به صورت زیر هستش
bool Node::operator =(Node* node)
{
string str = node->type;
char * nodeType = new char[str.size() + 1];
std::copy(str.begin(), str.end(), nodeType);
nodeType[str.size()] = '\0';
str = node->source;
char * nodeSource = new char[str.size() + 1];
std::copy(str.begin(), str.end(), nodeSource);
nodeSource[str.size()] = '\0';
str = node->destination;
char * nodeDestination = new char[str.size() + 1];
std::copy(str.begin(), str.end(), nodeDestination);
nodeDestination[str.size()] = '\0';
str = type;
char * tempType = new char[str.size() + 1];
std::copy(str.begin(), str.end(), tempType);
tempType[str.size()] = '\0';
str = source;
char * tempSource = new char[str.size() + 1];
std::copy(str.begin(), str.end(), tempSource);
tempSource[str.size()] = '\0';
str = destination;
char * tempDestination = new char[str.size() + 1];
std::copy(str.begin(), str.end(), tempDestination);
tempDestination[str.size()] = '\0';
if(!(strcmp(nodeType,tempType)) && !(strcmp(nodeSource, tempSource)) && !(strcmp(nodeDestination, tempDestination)))
{
return true;
}
else
{
return false;
}
}
دوستان لطفا اگه میدونید مشکل از کجاسن، کمکم کنید.5روزه که با این کد دارم ور میرم و نمیدونم مشکل چیه:| تو نت هم که سرچ کردم، گفتن رم کم میاره، ولی نفهمیدم یعنی چی
دوستان من یه برنامه دارم که توش از اشاره گرها زیاد استفاده کردم.تو برنامه تا جایی که شده فضاهای تخصیص داده شده رو آزاد کردم..لی خب خیلی هاشم نشده، چون تو اجرا نیاز داشتم.
برنامه من یه فایل اسمبلی رو به عنوان ورودی میگیره، و از رو دستورات این فایل گراف وابستگی اون رو میسازه.
وقتی گراف ساخته شد، من یه تابع دارم که این تابع کارش ساده کردن این گراف هستش، که تو اجرای این تابع وسطای کار خطای exception: std::bad_alloc at memory location رخ میده! کد تابعی که کار ساده کردن رو انجام میده کد زیر هست. در واقع خطا وقتی که از "=operator" استفاده میکنم رخ میده. که این operator رو خودم تو کلاس Node پیاده کردم، که کد اون رو هم پایین میذارم.
vector<LinkedList*> Graph::GraphReduction(vector<LinkedList*> list)
{
LinkedList *l1;
LinkedList *l2;
Node* node1 = NULL;
Node* node2 = NULL;
Node* temp = NULL;
int counter = 0, counter2 = 0, j = 0, headIndex = -1, k = 0;
bool onIncomingVertex = false;
//remove vertex with 1 incoming and 1 outgoing and vertex with only 1 incoming edge and vertex with only 1outgoing edge
for(int i = 0; i < list.size(); i++)
{
onIncomingVertex = false;
headIndex = -1;
counter2 = 0;
if(!compare(list[i]->first->type, "dll"))
{
temp = node1 = list[i]->first->E.next;
if(node1 != NULL)
{
for(k = 0; k < list[i]->nodesNo - 1; k++)
{
counter = 0;
headIndex = -1;
for(j = 0; j < list.size(); j++)
{
l1 = list[j];
l2 = list[i];
node2 = list[j]->first->E.next;
if(node2 != NULL)
{
for(int l = 0; l < list[j]->nodesNo - 1; l++)
{
if(node2->operator = (node1))
{
counter++;
}
if(node1->operator = (list[j]->first))
{
headIndex = j;
}
if(node2->operator = (list[i]->first))
{
onIncomingVertex = true;
counter2++;
}
if(node2->E.next != NULL)
{
node2 = node2->E.next;
}
}
}
}
if(counter < 2)
{
break;
}
temp = node1;
if(node1->E.next != NULL)
{
node1 = node1->E.next;
}
}
if(counter < 2)
{
if(list[i]->first->type != "condjump")
{
if(temp != NULL && (!compare(temp->type, "dll")))
{
list[i]->delNode(temp);
if(headIndex > - 1)
{
if(list[headIndex]->first->E.next != NULL)
{
list[i]->addNode(list[headIndex]->first->E.next, "");
}
delete list[headIndex];
list.erase(list.begin() + headIndex);
i--;
continue;
}
}
}
}
}
//Remove vertex with only 1 incoming edge
if(!onIncomingVertex && counter2 < 1 && list[i]->nodesNo <= 2 && list[i]->first->type != "condjump")
{
delete list[i];
list.erase(list.begin() + i);
i--;
continue;
}
}
}
}
کد =operator به صورت زیر هستش
bool Node::operator =(Node* node)
{
string str = node->type;
char * nodeType = new char[str.size() + 1];
std::copy(str.begin(), str.end(), nodeType);
nodeType[str.size()] = '\0';
str = node->source;
char * nodeSource = new char[str.size() + 1];
std::copy(str.begin(), str.end(), nodeSource);
nodeSource[str.size()] = '\0';
str = node->destination;
char * nodeDestination = new char[str.size() + 1];
std::copy(str.begin(), str.end(), nodeDestination);
nodeDestination[str.size()] = '\0';
str = type;
char * tempType = new char[str.size() + 1];
std::copy(str.begin(), str.end(), tempType);
tempType[str.size()] = '\0';
str = source;
char * tempSource = new char[str.size() + 1];
std::copy(str.begin(), str.end(), tempSource);
tempSource[str.size()] = '\0';
str = destination;
char * tempDestination = new char[str.size() + 1];
std::copy(str.begin(), str.end(), tempDestination);
tempDestination[str.size()] = '\0';
if(!(strcmp(nodeType,tempType)) && !(strcmp(nodeSource, tempSource)) && !(strcmp(nodeDestination, tempDestination)))
{
return true;
}
else
{
return false;
}
}
دوستان لطفا اگه میدونید مشکل از کجاسن، کمکم کنید.5روزه که با این کد دارم ور میرم و نمیدونم مشکل چیه:| تو نت هم که سرچ کردم، گفتن رم کم میاره، ولی نفهمیدم یعنی چی