PDA

View Full Version : سوال: این error یعنی چی؟



سرفینا
جمعه 26 تیر 1388, 18:32 عصر
#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<string.h>
#define nexthop(x) (nodeset[x].nh)
#define left(x) (nodeset[x].lc)
#define right(x) (nodeset[x].rc)
#define bound 32
typedef unsigned int word;
typedef word nexthop_t;
struct entryrec{
word data;
int len;
nexthop_t nexthop;
};
//*****************************************
class trienode{
friend class trie;
public:
nexthop_t nh;
trienode *lc;
trienode *rc;
} ;
//************************************************
class trie{
public:
static int m;
trienode *rootptr;
void insert(trie *root,word *prefix,int len,nexthop_t nh);
nexthop_t lookup(trie *root,word *prefix);
trie();
~trie(){delete rootptr;}
}t1;
//*************************************************
trie::trie()
{ static int m=0;
rootptr=new trienode;
rootptr->rc=NULL;
rootptr->lc=NULL;
rootptr->nh=NULL;
m++;
}
//**************************************************
nexthop_t trie::lookup(trie *root,word *prefix) {
nexthop_t h;
int i;
trienode *node;
h = NULL;
word *p;
p=prefix;
node=root->rootptr;
while (node!=NULL && p!=NULL) {
if (node->nh!=NULL)
h=node->nh;
if (*p== 0)
node=node->lc;
else node=node->rc;
p=p+1;
}
return h;
}
//********************************************
void trie::insert(trie *root,word *prefix,int len,nexthop_t nh){
int i;
trienode *node;
if (len > bound) {cout<<"trie::insert: prefix length exceeds bound.";}
node=root->rootptr;
i =0;
while (i<=len-1) {
if (*(prefix+i)== 0) {
if (node->lc == NULL) break;
node=node->lc;
} else {
if (node->rc == NULL) break;
node=node->rc;
}
i--;
}
// Extend the trie using remaining bits of prefix.
while (i<=len-1) {
if (*(prefix+i) == 0) {
node=new trienode; node=node->lc;
} else {
node=new trienode; node=node->rc;
}
m++;
node->lc=NULL;
node->rc=NULL;
node->nh=NULL;
i--;
}
node->nh=nh;
}
main()
{ word prefix;
int i,len;
nexthop_t nexthop;
entryrec entry[10];
for(i=0;i<=9;i++){
cout<< "enter";
cin>>entry[i].data;
cin>>entry[i].len;
cin>>entry[i].nexthop;
t1.insert(&t1,&entry[i].data,entry[i].len,entry[i].nexthop);
}
cout<<"enter a prefix to lookup & it's lenght";
cin>>prefix;
cin>>len ;
nexthop=t1.lookup(&t1,&prefix);
cout<<"\the nexthop is:"<<nexthop;
getch();
return 0;
}


Linking NONAME00.EXE:
Linker Error: Undefined symbol trie::m in module ..\..\DOCUME~1\BLUEROSE\DESKTOP\NONAME00.CPP

moteghayer m az nOe' static int ke 2 class trie tarif shode
:?

clover
جمعه 26 تیر 1388, 23:26 عصر
فقط میدونم که اشکال از کامپایلر نیست ، تو ++VC هم همین ارور را میده . اشکال از کد هم نیست چون کامپایل میشه . موقع لینک کردن ارور میده . توی Help ویژوال استودیو یه توضیحاتی داده اما من که چیزی نفهمیدم . راستی خطا جایی اتفاق میفته که تابع insert میخواد از متغیر m استفاده کنه .

Saeed_m_Farid
شنبه 27 تیر 1388, 09:07 صبح
Linking NONAME00.EXE:
Linker Error: Undefined symbol trie::m in module ..\..\DOCUME~1\BLUEROSE\DESKTOP\NONAME00.CPP

moteghayer m az nOe' static int ke 2 class trie tarif shode
:?

این declaration که شما واسه m بعنوان یه عضو static تو کلاستون آوردین به تنهایی واسه تعریف m کافی نیست، شما یه نمونه از عضو استاتیک رو، باید بیرون کلاس هم تعریف کنید :

class X
{
public:
static int i;
};
int X::i = 0; // تعریف باید خارج از کلاس صورت گیردضمناً تو سازنده نیازی نیست دوباره static int m=0 رو declare کنید؛ قبل main کافیه int trie::m =0 رو بیارید.



علت این امر اینه که شما با تعریف یه عضو استاتیک، حتی قبل ایجاد شیءای از کلاستون یک نسخه از اون عضو (داده) وجود خواهد داشت، مثل مثال بالا که قبل از ایجاد نمونه ای از کلاس X، عضو i رو از کلاس X استفاده کردیم...
علت اینکه Linker خطا میده هم اینه که کامپایلر برای اعضاء داده ای Static یک پیوند (linkage) خارجی (external) میسازه که موقع Link کردن پروژه شما توسط کامپایلر، دنبال یه تعریف از این عضو میگرده و همونطورکه می بینید تو کد شما همچین تعریفی تو خارج از کلاس trie شما پیدا نمیکنه.

سرفینا
یک شنبه 11 مرداد 1388, 12:39 عصر
این declaration که شما واسه m بعنوان یه عضو static تو کلاستون آوردین به تنهایی واسه تعریف m کافی نیست، شما یه نمونه از عضو استاتیک رو، باید بیرون کلاس هم تعریف کنید :

class X
{
public:
static int i;
};
int X::i = 0; // تعریف باید خارج از کلاس صورت گیردضمناً تو سازنده نیازی نیست دوباره static int m=0 رو declare کنید؛ قبل main کافیه int trie::m =0 رو بیارید.



علت این امر اینه که شما با تعریف یه عضو استاتیک، حتی قبل ایجاد شیءای از کلاستون یک نسخه از اون عضو (داده) وجود خواهد داشت، مثل مثال بالا که قبل از ایجاد نمونه ای از کلاس X، عضو i رو از کلاس X استفاده کردیم...
علت اینکه Linker خطا میده هم اینه که کامپایلر برای اعضاء داده ای Static یک پیوند (linkage) خارجی (external) میسازه که موقع Link کردن پروژه شما توسط کامپایلر، دنبال یه تعریف از این عضو میگرده و همونطورکه می بینید تو کد شما همچین تعریفی تو خارج از کلاس trie شما پیدا نمیکنه.


ممنون از همه دوستان،مشکلش همون تعریف متغیر استاتیک بیرون کلاسه، چون خیلی وقت بود با C++ کار نکرده بودم یادم ررفته بود.
1 مشکل دیگه ای که این کد داره اینه که جایی که باید فضااختصاص داده بشه نمیشه!مشکل از کامپایلر؟

Saeed_m_Farid
یک شنبه 11 مرداد 1388, 15:10 عصر
1 مشکل دیگه ای که این کد داره اینه که جایی که باید فضااختصاص داده بشه نمیشه!مشکل از کامپایلر؟


تو استفاده از اعضاء استاتیک باید خیلی مواظب باشید، چون (به نظر من البته!) کلاً خارج از قوانین کلاس ها داره عمل میکنه!
اگه منظورتون اینه که تو بلوک حافظه ای که برای instance کلاس موردنظر در نظر گرفته شده، فضایی برای عضو استاتیک درنظر گرفته نمیشه، این خاصیت اعضاء استاتیک هست؛ به این معنی که، همونطورکه قبلاً گفته شد : شما می تونید اعضاء استاتیک رو بدون تعریف متغیری از نوع کلاس، تعریف کنید و لازمه همچین امکانی در نظر گرفتن فضای مجزای حافظه برای اعضاء استاتیک هست.
شما از کجا جایی که "باید فضااختصاص داده بشه"رو تشخیص میدین؟ با یه ابزار جانبی (مثل اوناییکه Memory Leak رو تشخیص میدن) دارید فضای اختصاص یافته رو چک می کنید یا اگه از روش دیگه ای دارید استفاده می کنید، شروع و پایان بلوک کلاس یا برنامه رو از کجا می فهمید؟
اگه منظورتون از "جایی که باید فضااختصاص داده بشه" چیز دیگه ای هست، باید دقیقتر منظورتون رو بفرمایید، یعنی اصلاً فضااختصاص داده نمیشه؟ یا جایی که باید فضا اختصاص داده بشه، نمیشه؟

سرفینا
دوشنبه 12 مرداد 1388, 01:07 صبح
جایی که باید فضا اختصاص داده بشه نمیشه ،من کدو تغییر دادم ،به ندها فضا اختصاص نمیده بخاطر اشاره گر هاست؟