ورود

View Full Version : سوال: مشکل با یه کلاس



root88
شنبه 07 فروردین 1389, 00:30 صبح
با سلام برنامه زیر تو اخرین کلاس خطا می ده با اینکه با کلاس های بالاتر دوسته اما نمی تونه از متداش استفاده کنه و خطایUndelare identification میده.دوستان لطفا کمک کنید.



// LA.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "LA.h"
#include <iostream>
#include<conio.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// The one and only application object
CWinApp theApp;
using namespace std;
class List;
class ListIterator;
class ListNode;
class Graph;
class Automata;
///////////////////////////////////////////////////
class ListNode
{
friend class List;
friend class ListIterator;
friend class Graph;
friend class Automata;
//-----------------------
int data1;
float data2;
bool action;
ListNode* link;
};
//------------ end class ListNode
class ListIterator
{
friend class Graph;
ListNode* first;
public:
bool NotNull()
{
if(first)return true;
return false;
}
////////////////////////////////// end of NotNull
bool NextNotNull()
{
if(first && first->link)
return true;
else
return false;
}
//////////////////////////////////end of NextNotNull
int Next()
{
if(first->link)
first = first->link;
else
return 0;
}
////////////////////////////////// end of Next
};
//------------ end class ListIterator
class List
{
friend class ListIterator;
friend class Graph;
friend class Automata;
ListNode* first;
public:
List(int element1=0,float element2=0)
{
first = new ListNode;
first->data1 = element1;
first->data2 = element2;
first->action = true;
first->link = NULL;
}
///////////////////////////////////////////////////////end of Constructor
void InsertFirst(int element1,float element2=0,bool element3=true)
{
ListNode* t;
t = new ListNode;
t->data1 = element1;
t->data2 = element2;
t->action = element3;
t->link = first;
first=t;


}
///////////////////////////////////////////////////////end of InsertFirst
void InsertEnd( int element1,float element2=0,bool element3=true)
{ ListNode* t,* s;
t = new ListNode;
if(!first)
{
t->data1 = element1;
t->data2 = element2;
t->action = element3;
t->link = NULL;
}
else
{ s = first;
while(s->link != NULL)
s = s->link;
t->data1 = element1;
t->data2 = element2;
t->action = element3;
s->link = t;
t->link = NULL;
}
}
///////////////////////////////////////////////////////end of InsertEnd
void deleteNode(int element)
{
ListNode* t,* h;
t = first;
if(t->data1 == element)
{
first = t->link;
delete t;
return;
}
h=t;
while(t != NULL)
{
if(t->data1 == element)
{
h->link = t->link ;
delete t;
return;
}
h=t;
t=t->link ;
}
cout<<"\n element" <<" "<<element<<" "<<"Not found"<<endl;
}
///////////////////////////////////////////////////////end of deleteNode
void InactionNode(int element)
{
ListNode* t;
t = first;
while(t->link != NULL)
{
if(t->data1 != element)
t = t->link;
else
t->action = false;
}
}
///////////////////////////////////////////////////////end of InactionNode
int Count()
{
ListNode *t;
int count=0;
for(t=first;t!=NULL;t=t->link)
{
count++;


}
return count-1;
}
///////////////////////////////////////////////////////end of Count
void Display()
{
ListNode* current;
current = first;


while(current != NULL)
{
cout<<current->data1<<endl;
current = current->link;
}
}
///////////////////////////////////////////////////////end of Display
void ConcatList(List x)
{
ListNode* t;
if(!first)
{
first = x.first;
return;
}
if(x.first)
{
for(t = first;t->link;t = t->link);
t->link = x.first;
}
}
///////////////////////////////////////////////////////end of ConcatList
~List()
{
ListNode* t,* h;
t = first;
while(t != NULL)
{
h = t;
t = t->link ;
delete h;
}
}
///////////////////////////////////////////////////////end of Destrutor
};
//------------ end class List
class Graph
{
int num,number,temp,ID,NV;
friend class Automata;
List* headNodes;
public:
Graph(int v=0)
{
headNodes = new List[v+1];
}
///////////////////////////////////////////////////////end of Constructor
void set(int d)
{
NV = d;
}
///////////////////////////////////////////////////////end of set
void getANDset(int vertex)
{
List AllNodes;
cout<<"Please repeat follow steps for each node"<<endl<<endl;
for(int i=0;i<vertex;i++)
{
cout<<"1. enter vertex ID:";
cin>>ID;
AllNodes.InsertEnd(ID);
cout<<"2. enter number of neghbour vertice:";
cin>>num;
for(int j=0;j<num;j++)
{
cout<<"enter neghbour vertex"<<" "<<(j+1)<<" "<<":";
cin>>number;
temp = number;
headNodes[ID].InsertFirst(temp);
}//end for j


}//end for i
}
///////////////////////////////////////////////////////end of getANDset
int CountNeighborNodes(int v)
{
int count=0;
ListNode* t;
t = headNodes[v].first;
for(t; t->link; t = t->link)
{
count++;
}
return count;
}
///////////////////////////////////////////////////////end of CountNeighborNodes
void DisplayNeighbourNodes(int v)
{
ListNode* t;
t = headNodes[v].first;
cout<<"[";
for(t; t->link; t=t->link)
{cout<< t->data1 <<" ";}
cout<<"]";
}
///////////////////////////////////////////////////////end of DisplayNeighbourNodes
void Display()
{
int i;
for(i=1;i<=NV;i++)
{
cout<<"node "<<i<<" adjacent: ";
DisplayNeighbourNodes(i);
cout<<endl;
}
}
///////////////////////////////////////////////////////end of Display
ListNode operator = (ListNode* x)
{
ListNode* t;
t->data1 = x->data1;
t->data2 = x->data2;
t->action = x->action;
t->link = x->link ;
}
///////////////////////////////////////////////////////end of operator =
List operator = (List x)
{ int k =x.Count();// felan
List t((x.first)->data1,(x.first)->data2);
ListNode* s;
s = x.first;
for(int i=1; i<k; i++)
{
s = s->link;
t.InsertEnd(s->data1,s->data2,s->action);
}
return t;
}
///////////////////////////////////////////////////////end of operator =
ListNode* NeighborNodes(int v)
{
ListNode* t;


t = headNodes[v].first;


return t ;
}
///////////////////////////////////////////////////////end of NeighborNodes with poniter
void Display(ListNode* s)
{
while(s!=NULL)
{
cout<<s->data1;
s=s->link;
}
}
///////////////////////////////////////////////////////end of Display with poniter
List AllNodesList()
{
List AllNodes;
for(int i=1;i<NV;i++)
{
AllNodes.InsertEnd(i);
}
return AllNodes;
}
//////////////////////////////////////////////////////end of AllNodesList
List NoneNeighborNodes(int v)
{
List NNeighbor;
ListNode* s;
NNeighbor = AllNodesList();
s = NeighborNodes(v);
for(s;s!=NULL;s=s->link)
{
NNeighbor.deleteNode(s->data1);
}
return NNeighbor;
}
///////////////////////////////////////////////////////end of NoneNeighborNodes
};
//------------ end class Graph
class Automata
{ friend class Graph;
public:
Automata(int ID)
{
int k;
ListNode* t;
List alphaANDp;
alphaANDp = NoneNeighborNodes(ID);
}
///////////////////////////////////////////////////////end of Constructor
List operator = (List x)
{
List t;
ListNode* s;
int k = x.Count();
s = x.first;
for(int i=1;i<=k;i++)
{
t.InsertEnd(s->data1,s->data2,s->action);
s = s->link;
}
return t;
}
//////////////////////////////////////////////////////end of operator =
void Reward(int ID,float a)
{
ListNode* t;
t = headNodes[ID].first;
for(t;t->link;t=t->link)
{
if(t->data1 == ID)
t->data2 = t->data2 + a*(1-t->data2);
else
t->data2 = t->data2 * (1-a);
}
}
//////////////////////////////////////////////////////end of Reward
void Penalty(int ID,float b)
{
int r;
ListNode* t;
r = NoneNeighborNodes(ID).count();
t = headNodes[ID].first;
for(t;t->link;t=t->link)
{
if(t->data1 == ID)
t->data2 = t->data2 * (1-b);
else
t->data2 = b/(1-r) + t->data2 * (1-b);
}


}
//////////////////////////////////////////////////////end of Penalty
int GetNextNode(int ID)
{
float A=0;
ListNode* t;
t = headNodes[ID].first;
while(t!=NULL)
{
if((t->data2) >= A && t->action == true)
{
A = t->data2;
ID = t->data1;
}
}
return ID;
}
};
//////////////////////////////////////////////////////////////////////////end of definition classes
int main()
{
getch();
return 0;
}

Nima_NF
شنبه 07 فروردین 1389, 01:45 صبح
لطفا دقت کنید که سوالات کنسولی C++‎‎ با هر کامپایلری که انجام می شود باید در بخش عمومی برنامه نویسی با C/C++‎‎ مطرح شود، زیرا همه کامپایلرهای جدید تحت کنسول تقریبا به یک شکل عمل می کنند و تغییرات مشابه هست.

این بخش تنها برای برنامه نویسی پشرفته MFC یا Win32 توسط ++visual C هست.
به همین خاطر تاپیک ها شما منتقل می شوند...

اما در مورد سوال شما:

ابتدا کدهای زیر را حذف کنید:



#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// The one and only application object
CWinApp theApp;

سپس دقت کنید که شما نمی توانید به این شکل که نوشته شده کلاسی را friend کلاس دیگر معرفی کنید و از تمامی امکانات آن به این شکل استفاده کنید، یا انواع جدید از متغیرها آن بسازید. مثلا در حالت friend متدی از کلاس فراخوانی می شود که static باشد. همین طور برای متغیر ها.

در صورت نیاز شما باید کلاس ها را مشتق یک دیگر تعریف کنید و متغیر یا متد مورد نظر را در کلاس پایه عمومی تعریف کنید، هر چند که عمومی تعریف کردن برای متغیر توصیه نمی شود.
توصیه می شود یک تابع عمومی در کلاس پایه بنویسید که یک نمونه از متغیر تعریف کند و سپس با New حافطه اختصاص دهد. پس friend به این شکل توصیه نمی شود.

root88
شنبه 07 فروردین 1389, 16:41 عصر
از پاسختون ممنون!اما من سوالم در کدوم قسمت مطرح کنم اگه منظور شما بخش برنامه نویسی با ++C /C است که اونجا هم پست من حذف شد

Nima_NF
شنبه 07 فروردین 1389, 19:18 عصر
از پاسختون ممنون!اما من سوالم در کدوم قسمت مطرح کنم اگه منظور شما بخش برنامه نویسی با ++C /C است که اونجا هم پست من حذف شد
احتمالا ایشون به خاطر عنوان سوال فکر کردند سوال برای بخش دیگری هست، اگر سوال شما به همین شکل در زمینه برنامه نویسی ++C/C هست در همانجا مطرح کنید (با عنوان مناسب)

اگر هم درخواست الگوریتم یا تئوری حل مسئله هست در بخش ساختمان داده و الگوریتم.

در هر صورت اگر اشتباها حذف شد پیام بفرستید برایتان بررسی می کنم و در صورت نیاز بازیابی می کنم.

root88
شنبه 07 فروردین 1389, 19:32 عصر
بازم ممنون!و ببخشید که اینجا دوباره سوالم رو می پرسم اما صرف نظر از نامناسب بودن تعریف این برنامه به نظر شما علت این خطا چیه؟

heanNodes undeclared undentifier
مثلا اونجایی که با رنگ قرمز مشخص شده؟

Nima_NF
شنبه 07 فروردین 1389, 20:47 عصر
خدمت شما توضیح دادم، کلا شما اصل برنامه نویسی شئی گرایی را رعایت نکردید.
کاری که شما می خواهید انجام دهید باید توسط کلاس های پایه و مشتق شده انجام می شد، اما شما کلاس دیگر را دوست کلاس دیگر تعریف کردید.

شما تا زمانی که یک نسخه از کلاس دیگر تعریف نکنید نمی توانید از متغیرها و توابع آن استفاده کنید، شما با کلمه کلیدی friend فقط یک دوست تعریف کرده اید، و بدون تعریف یک نمونه از آن، فقط به اعضای static کلاس دوست دسترسی دارید.

root88
یک شنبه 08 فروردین 1389, 17:17 عصر
دوست عزیز من کلاس رو به صورت زیر تغییر دادم اما با اینکه کلاس لیست از نوع عمومی هست تو تابع Inaction نمی تونه به اعضای حفاظت شده دسترسی پیدا کنه و همین اول کار خطا می ده .ببخشید که سوالاتم اینجورین من زیادی مبتدیم!



class ListNode
{
protected:
int data1;
float data2;
bool action;
ListNode* link;
public:
ListNode(int &a,float &b,bool &c,ListNode*p=NULL):data1(a),data2(b),action(c),lin k(p){}
void set(int a,float b,bool c)
{
data1=a;
data2=b;
action=c;
}
};
class List : public ListNode
{
protected:
ListNode* first;
ListNode* newNode(int &a,float &b,bool &c,ListNode*p)
{
ListNode* q=new ListNode(a,b,c,p);
return q;
}
public:
int Inaction(int element)
{
ListNode* t=first;
while(t->link != NULL)
{
if(t->data1 == element)
t->action = false;
return 1;
else
t = t->link;
}
}
};

Nima_NF
یک شنبه 08 فروردین 1389, 23:32 عصر
شما باید بحث کار با کلاس ها را دقیق چند مرتبه مطالعه تا موضوع کلاس مشتق و پایه و غیره کامل برای شما روشن شود، البته این اشکالات در ابتدا همیشه وجود دارد و مختص شما نیست، با تمرین بعد از مدتی خیلی راحت متوجه تمامی این اشکالات خواهید شد.

چند اشکال:

- شما کلاس List را از کلاس ListNode مشتق کرده اید، اما سازنده ای تعریف نکردید که متغیرهای عضو کلاس پایه ها را پر کند.

- شما کلاس List را از کلاس ListNode مشتق کرده اید اما از امکانات ان به درستی استفاده نکرده اید. مثلا شما ListNode*first و ListNode*t را در کلاس List تعریف کرده اید، اما این دو تعریف هیچ ارتباطی به کلاس مشتق شده دارد. یعنی شما حتی اگر کلاس را مشتق اعلام نکرده بودید باز هم می توانستید چنین تعرفی کنید، چون شما فقط در حال تعریف یک نمونه از کلاس ListNode هستید که به داده های مشتق شده دسترسی ندارید.

اگر قرار هست که شما یک شئی تعریف کنید که امکانات کلاس پایه را در برداشته باشد و به داده های protected هم دسترسی داشته باشید باید به این شکل تعریف کنید، یعنی از کلاس مشتق شده:



List* first;
//..
List* t = first;

root88
دوشنبه 09 فروردین 1389, 21:00 عصر
آقا دستت درد نکنه!من سازنده تعریف کرده بودم اما چون کدم رو یه سیستم دیگه است و اون به اینترنت دسترسی نداره مجبورم رو این سیستم دوباره کد بنویسم برای همین کوتاهش کردم!یه سوال دیگه می دونم که با این سوالا دردسر شدم .اگه بخوام به تعدادی که کاربر می خواد من از یه کلاس شی ایجاد کنم چطور باید اینکار رو انجام بدم؟

Nima_NF
دوشنبه 09 فروردین 1389, 21:11 عصر
برای تعداد می توانید عدد را از ورودی دریافت کنید و در یک لیستی از اشاره گر به کلاس توسط New ذخیره کنید. یعنی وقتی از new استفاده می کنید با پرانتز تعداد را مشخص کنید.

در صورت نیاز می توانید از vector و list در C++ استفاده کنید که همان لیست پیوندی هستند (در STL کتابخانه استاندارد C++ هستند)

root88
پنج شنبه 12 فروردین 1389, 15:36 عصر
دوست عزیز برای ایجاد اشیا به تعدادی که کاربر می خواد من کد زیر رو نوشتم.(نمی دونم با لیست چطور میشه نوشت )البته امتحانش نکردم چون برنامهم هنوز صدتا خطا داره.سوالم اینه که اگر در طی اجرا بخواهیم تعدادی از اشیا این ارایه رو حذف و تو یه ارایه دیگه ذخیره کنیم جطور میشه اینکار رو انجام داد.


int num;
A* LA[num];
ID=1;

{
LA[ID]= new A(ID);
ID++;
}
while(ID!=num)
تو یه سایت نوشته بود



delete myarray[elemen];
با توجه به اینکه ارایه ای از اشاره گرهاست میشه از این برای حذف استفاده کرد؟

Nima_NF
پنج شنبه 12 فروردین 1389, 17:01 عصر
در زبان C++‎ شما اجازه ندارید ورودی آرایه ها را متغیر قرار دهید، باید عدد ثابت باشد.

اگر قرار هست تعداد از ورودی دریافت شود، هامنظور که گفتم باید به جای همان آرایه اول هم از new استفاده کنید. یعنی به جای []A*LA شما باید A**LA تعریف کنید (اشاره گر به اشاره گر)، سپس قیل از آن حلقه while که تعریف کردید، باید یک new دیگر به اندازه طول num تعریف کنید.


کلا بگذارید یک توصیه به شما کنم، تا زمانی که امکانات وسیع STL و توابع استاندارد ++C هست خود را زیادی درگیر کار با اشاره گر ها نکنید. از List/vector استفاده کنید و راحت فقط به همان نمونه شئی از کلاس فقط با new حافظه تخصیص دهید. از آرایه هم استفاده نکنید، vector با تابع resize به شما اجازه می دهد طول لیست را تغییر دهید. ضمنا لزومی ندارد که کلا ابتدا طول را مشخص کنید. با vector راحت می توانید از تابع push_back استفاده کنید و یک عنصر جدید به لیست اضافه کنید، نیاز به این هم ندارد که بدانید چند تا قرار هست در آینده اضافه کنید، خودش حافظه عنصر را تخصیص می دهد، فقط شما چون قرار هست اشاره گر به کلاس را اضافه کنید، فقط در هر مرحله یک new برای کلاس باید فراخوانی کنید.

ضمنا هر وقت کار با لیست تمام شد، با delete در یک حلقه تک تک عناصر را از لیست فراخوانی کنید و حافظه هر کدام را بگیرید.

مثال:



using namespace std;

int num;
// get num here from user....

vector<myClass*> mylist;

mylist.resize(num);


-------------
// now add or allocate each one:

myClass *obj1 = new myClass();

mylist.insert( 0, obj1 ); // position 0 add obj1
//Or:
mylist.push_back( obj1 ); // add it to the end of list


پس گرفتن حافظه :



int i;

for ( i = 0; i != mylist.size( ); i++ )
delete mylist[i];

root88
جمعه 13 فروردین 1389, 17:21 عصر
سلام
آخ ببخشید که من هر خط برنامه ام یه خطا می ده آخه من هرچی برنامه تا حالا نوشتم دستی بوده:
کلاس پایه من ListNode که گره تعریف می کنه .تو کلاس مشتق List متدInsert ش کار می کنه اما وقتی می خوام داده های یه لیست را نمایش بدم یا تعدادشونو بشمرم خطا می ده اینم کدشه:



int Count()
{
List *t;
t=first
int count=0;
for(t;t!=NULL;t=t->link)
{
count++;

}
return count-1;
}

که نمی تونه از اشاره گر نوعListNode رو به List تبدیل کنه

Nima_NF
جمعه 13 فروردین 1389, 19:12 عصر
شما همیشه پیام خطای کامپایلر را قرار دهید تا بتوانم پاسخی داشته باشم.
چون این طوری هم نمی دانم اصلا کد شما چه هست، هم نمی دانم کجا و کدام خط خطا دارد.

root88
جمعه 13 فروردین 1389, 21:12 عصر
بله چشم،


'=':cannot convert from ListNode* to List*

کلاس لیست از کلاس لیست نود مشتق شده و در قسمت محافظت شده کد List* first نوشتم. از for خطا میگیره مربوط به t->link هستش .t رو چه از نوع لیست تعریف کنم چه لیست نود خطا می ده.

root88
شنبه 14 فروردین 1389, 12:32 عصر
دوست عزیز کجایی؟

آقا یکی به دادم برسه.

Nima_NF
سه شنبه 17 فروردین 1389, 00:01 صبح
همین موضوع را در پست شماره #8 برایتان توضیح دادم.
شما اجازه ندارید خارج از کلاس به اعضای protected/private کلاس پایه دسترسی پیدا کنید. شما فقط داخل کلاس مشتق شده این اجازه را دارید.

اگر کلاس list مشتق شده هست، باید در آن تابع بنویسید که داده protected/private را به شما بدهد، یعنی وقتی شما داخل کلاس List یک t از نوع list تعریف می کنید، دیگر به اعضای protected دسترسی ندارد، فقط اگر مستقیم متغیر را فراخوانی کنید عمل شما درست هست.

پس تابع تعریف کنید، به این شکل:



// myNum is protected

int get_name() const
{
return myNum;
}

void get_name(int inNum)
{
myNum = inNum;
}

پس اگر قرار هست به link دسترسی پیدا کنید، باید با تابع این کار را انجام دهید.

root88
سه شنبه 17 فروردین 1389, 17:54 عصر
جناب Nima-NF ،ارگومان اول متد insert مربوط به پست 12 می تونه یه متغیر باشه ؟بعلاوه اگه بخوام nتو یه حلقه تا شی با شناسه متفاوت ایجاد کنم چیکار باید بکنم ؟

Nima_NF
سه شنبه 17 فروردین 1389, 20:08 عصر
پارامتر اول Insert از نوع iterator هست، می تواند متغیر صحیح نیز باشد.
برای تعریف متغیر با نام متفاوت به شکل نا محدود روشی نیست، برای تعداد نامحدود همین شماره آن در لیست ها هست. البته روش هایی هم هست که به جای همین شماره ها، یک نام رشته ای برای هر کدام انتخاب کنید. MSDN را بررسی کنید.

root88
سه شنبه 17 فروردین 1389, 23:57 عصر
دوست عزیز من هنوز با کلاس پایه و مشتق مشکل دارم ممکنه شما یه کتاب آموزشی(دیتل رو دارم اما یکی دوتا کلاسه که خوندمش )یا چند تا مثال کلاس به من معرفی کنید

Nima_NF
چهارشنبه 18 فروردین 1389, 01:35 صبح
کتاب دیتل را که دارید، کتاب C++ جعفرنژاد نیز برای مثال های بیشتر مفید هست.
ضمنا در بخش فنی C، تاپیکی هست که هر کسی کتاب مختلفی را ذکر کرده، می توانید بررسی کنید.

root88
سه شنبه 24 فروردین 1389, 19:09 عصر
دوباره سلام،
دوست عزیز،من مشابه تعریف شما که تو پشت های قبل بود یه لیست از کلاس vector ساختم که اشاره گرهایی به نوع کلاسه ،اما نمی دونم چطوری می تونم برای اشیایی که از این کلاس ساخته شدن و با vector به اونها اشاره کردم متدهایی کلاس رو صدا بزنم از . و <- هم استفاده کردم اما نشد
مثلا من می خوام شیی با شناسه 1 متد selectrand رو صدا بزنه


vector<L*> list;
list.resize(n);
for(int i=0;i<n;i++)
{
L* l=new L(& graph,i);
list.push_back(l);
}
cout<<list[1]->selectrand(1);

Nima_NF
چهارشنبه 25 فروردین 1389, 01:30 صبح
خیلی از مشکلات این طوری شما توسط debugger به راحتی قابل یافتن و حل کردن هست.

بر روی خط اول برنامه در vector در editor ویژوال استادیو راست کلیک کنید و "run to curser" را انتخاب کنید. برنامه کامپایل شده و در این خط متوقف می شود، سپس می توانید با کلید F10 به خط بعدی بروید. در همین حال که داخل حلقه for می چرخید در پنجره Autos (کنار پنجره های locals , watch و غیره) می توانید متغیر ها و کلاس ها را مشاهده کنید. می بینید که vector شما در داخل حلقه در هر مرحله 1 خانه به طولش اضافه می شود و از 2 به 4 خانه می شود.

مشاهده می کنید که اشکال کار شما در اینجا هست که با resize به تعداد n اشاره گر برای vector می سازید و سپس بعد از آن در for باز هم n اشاره گر دیگر به انتهای Vector اضافه می کنید.
قبلا هم به شما گفتم، متد push_back خودش یک خانه به vector اضافه می کند، یعنی همان حلقه for کافی هست. پس خطی که از resize استفاده کردید را حذف کنید.

زمانی از resize استفاده می کنید که فرضا می خواهیم n خانه رزرو کنیم.
سپس باید از insert استفاده کنید که مثلا بگویید در خانه 0 مقدار x را قرار بده و الی آخر.

در هر صورت برنامه شما با حذف کردن خط resize مشکلش بر طرف می شود.

root88
جمعه 03 اردیبهشت 1389, 08:51 صبح
با سلام،
دوست عزیز من یه تابع دارم که تعداد گره های یه لیست رو می شمره ،



int Count()
{
ListNode *t=NULL;
int count=0;
for(t=first;t!=NULL;t=t->link)
count++;
return count;
}



می خوام از خروجی این تابع استفاده کنم و فیلد دوم هر گره از لیستم رو با یک تقسیم بر این خروجی مقدار دهی کنم اما مقداری که در این قرار میده مثلا به این صورته 1.#NF هست به جای عدد؟


t=x->first;
k=x->Count();
for(t;t!=NULL;t=t->link)
{
t->data2=1/k;

}

root88
جمعه 03 اردیبهشت 1389, 10:11 صبح
اینم یه مشکل دیگه لطفا راهنمایی بفرمایید.
میخوام یکی از اشیایی که تو لیستی از vector دارم یکی از متدهاشو صدا برنه با دستور زیر



nextNode=mylist[currentNode]->selectNextNode(currentNode);


و مقدار برگشتی شو بریزم تو یه متغیر .این شی متد زیر روصدا می زنه و چون flag صفر هستش تابع
selectRandomAction(ID)
صدا میزنه




int selectNextNode(int ID)
{
int NN;
if(flag==0)
{
NN=selectRandomAction(ID);
flag=1;
return NN;
}
else
NN=selectBestAction(ID);
return NN;
}




و یعد در تابع فراخوانی شده تابع Genrandomصدا زده میشه که اینم کدشه اما همش سر تابعGenrandom برنامهbreak میشه نمی دونم شاید مقدار رو نمی تونه بهش پاس بده؟؟:ناراحت:



int GenRandom(int lenght)
{
int Rand;
srand(time(0));
Rand= rand()%lenght;
return Rand;
}

Nima_NF
جمعه 03 اردیبهشت 1389, 13:44 عصر
نمی توانم نظر خاصی بدهم، فقط دقت کنید که lenght هرگز 0 نباشد در غیر این صورت تقسیم بر صفر خطا می دهد.

root88
جمعه 03 اردیبهشت 1389, 13:48 عصر
وقتی رو متغیر نگه می دارم دقیقاً مقدار صفر رو نمایش می ده

Nima_NF
جمعه 03 اردیبهشت 1389, 14:17 عصر
شما کد همان قسمت را قرار ندادید، پس معلوم نیست که lenght شما از کجا می آید و مقدار آن چقدر هست، ضمنا همیشه قبل از تقسیم باید با شرط (if) مقدار هایی که جواب را نامشخص می کند را حذف کنید، مثلا هیچ وقت نباید عددی را بر صفر تقسیم کنید.

پاورقی: ضمنا درست آن length هست : )

root88
چهارشنبه 08 اردیبهشت 1389, 10:19 صبح
با سلام من یک سوال دیگه از شما داشتم،ببخشید که اینجا مطرح کردم


باید توی حلقهdo while یه عدد تصادفی تولید کنم و یه شرط رو در انتها چک کنم،برنامه این کار رو انجام میده اما اگر شرط برقرار نباشه و به اول حلقه برگرده دوباره همون عدد قبلی رو که تصادفی تولید کرده بود ایجاد میکنه در حالی که باید بتونه عدد دیگه ای رو تولید کنه.به نظر شما مشکلش کجاست؟



do
{
int p=GenRandom(c);
.
.
.
.

}while(......);