עבור לתוכן

מצביעים

Featured Replies

פורסם
  • מחבר

מה עושים אם אני רוצה לבנות עץ בעל 20 איברים, ולאחר 7 הכנסות מופיעה לי ההודעה:


An unhandled exception of type 'System.StackOverFlowExcpection'
occurred in shira.exe

ויש לי אפשרות לבחור בין Break ל Continue (שגם כן סוגר את התכנית)

יש אפשרות למנוע את הופעת החלון הזה ולהמשיך ת'תרגיל?????

מה עושים עם המחסנית הזו?

פורסם

stack overflow אומר שיש לך רקורסיה אינסופית. (כלומר, לא באמת אינסופית, אלא פשוט שלא מגיעה לתנאי העצירה הנורמלי שלה)

פורסם
  • מחבר

אז איך מוצאת ועוצרת אותה??

<ההודעה מופיעה לי על השורה הראשונה בפונקציה Insert

   if (current->value < val)   

>

פורסם

איפה בדיוק זה מופיע זה כבר לא משנה.

אם תסתכלי על ה- stack שלך במצב הזה את תראי כמה עשרות/מאות קריאות לפונקציה, עם הפרמטרים של כל אחת.

זה יאפשר לך לראות למה הפונקציה נקראת הרבה יותר מדי פעמים.

פורסם
  • מחבר

ואיפה בדיוק אני מסתכלת על הSTACK ??????????

יש אפשרות לרוקן אותה?

<במילים אחרות: יש בעיה, איך פותרים אותה?>

תודה

פורסם

ה- stack הוא חלק מסביבת ההרצה של התוכנית שלך, לא חלק מהתוכנית עצמה. זה שאת מקבלת את השגיאה הזו אומר שיש משהו לא בסדר באלגוריתם שלך.

ב- Visual Studio 2005 את יכולה להסתכל בו דרך Debug->Windows->Call Stack

נדמה לי שב- Visual Studio 6 אפשר לראות אותו דרך View->Debug Windows->Call Stack.

פורסם
  • מחבר

הצילו!!!!!!!!

מה לא נכון פה????


#include <iostream>
#include <assert.h>
#include "Tree.h"
using namespace std;

template <class T>
class BRtree: public Tree<T>
{
private:
Node<T>* parent;
int color;

Node<T>* Insert(T val);
Node<T>* Insert(Node<T>*current, T val, Node<T>*parent);
void Update (Node<T>*current);
Node<T>* RemoveTop(Node<T>*);

int includes(Node<T>*current, T val) const;
Node<T>* includes(Node<T>*current, T val);

void Right(Node<T>*current);
void Left(Node<T>*current);

void FixUp(Node<T>*current);


public:
BRtree();
void Add(T val);//äåñôú áï
void Remove (T val);//îçé÷ú áï
int Includes(T val) const;

void getcolor();
void print();
};

template <class T>
BRtree<T>::BRtree()
{
Tree<T>();
parent = NULL;
color = 0;
}

template <class T>
void BRtree<T>::Add(T val)
{
Node<T>* current;
Insert(val);
current=includes(root,val);
Node<T>*ezer;

if(current->parent==NULL)
{
current=root;
root->color=1;
return;
}
else
{
while((current!=root)&&(current->parent->color==0))
{
if(current->parent==current->parent->parent->left)
{
ezer=current->parent->parent->right;
if((ezer!=NULL)&&(ezer->color==0))
{
current->parent->color=1;
ezer->color=1;
current->parent->parent->color=0;

current=current->parent->parent;
}
else
{
if(current==current->parent->right)
{
current=current->parent;

Left(current);
}

else
{
current->parent->color=1;
current->parent->parent->color=0;

Right(current->parent);
}
}
}
else
{
ezer=current->parent->parent->left;
if((ezer!=NULL)&&(ezer->color==0))
{
current->parent->color=1;
ezer->color=1;
current->parent->parent->color=0;

current=current->parent->parent;
}
else
{
if(current==current->parent->left)
{
current=current->parent;

Right(current);
}
else
{
current->parent->color=1;
current->parent->parent->color=0;

Left(current->parent);
}
}
}
} root->color=1;
}

}

template <class T>
Node<T>* BRtree<T>::Insert(T val)
{
if (!root)
{
root=new Node<T>(val,NULL,NULL,NULL,0);
return root;
}

Node<T>*p = root;

return Insert(root,val,p);
}

template <class T>
Node<T>* BRtree<T>::Insert(Node<T>*current, T val, Node<T>*parent)
{
if (current->value < val)
{ // Add to right subtree
if (!current->right)
{
current->right=new Node<T>(val,NULL,NULL,current,0);
return current->right;
}
else
{
Insert(current->right,val,current);
}
}
else
{ // Add to left subtree
if (!current->left)
{
current->left=new Node<T>(val,NULL,NULL,current,0);
return current->left;
}
else
{
Insert(current->left,val,current);
}
}
}

template <class T>
void BRtree<T>::Right(Node<T>*current)
{//current->x
Node<T>*ezer=current->parent;

if(current->right!=NULL)
{
ezer->left=current->right;
}
else
{
ezer->left=NULL;
}

current->right= ezer;

if(ezer->parent==NULL)
{
current->parent=NULL;
}
else
{
current->parent=ezer->parent;
if(ezer->parent->right==ezer)
{
ezer->parent->right=current;
}
else
{
ezer->parent->left=current;
}
}

ezer->parent=current;

if(current->parent==NULL)
{
root=current;
}
}

template <class T>
void BRtree<T>::Left(Node<T>*current)
{//current=y
Node<T>*ezer=current->parent;

if(current->left!=NULL)
{
ezer->right=current->left;
}
else
{
ezer->right=NULL;
}

current->left= ezer;

if(ezer->parent==NULL)
{
current->parent=NULL;
}
else
{
current->parent=ezer->parent;
if(ezer->parent->right==ezer)
{
ezer->parent->right=current;
}
else
{
ezer->parent->left=current;
}
}

ezer->parent=current;

if(current->parent==NULL)
{
root=current;
}
}

template <class T>
Node<T>* BRtree<T>::includes(Node<T>*current, T val)
{
// see if argument value occurs in tree
if(!current)
{
return NULL; // not found
}
if (current->value == val)
{
return current;
}
if (current->value < val)
{
return includes(current->right,val);
}
else
{
return includes(current->left,val);
}
}

פורסם

ה stack מתרוקן כשאת חוזרת מפונ מסויימת לפונ אחרת. תבדקי אילו פונ גורמות לרקורסיה האין סופית הזו.

פורסם
  • מחבר

נראה לי שיש לי בעיה בפונקציה INSERT, יש לי אפשרות להריץ את התכנית אבל-


warning C4715: 'BRtree<int>::Insert' : not all control paths return a value

מה הלאה?

פורסם

תבדקי אם יש IF מסויים שלא עשית בו RETURN.

פורסם
  • מחבר

זאת אומרת שבקריאה הרקורסיבית לפונקציה לעשות כך:


return Insert(current->right,val,current);

במקום


Insert(current->right,val,current);

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים