| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 993 人关注过本帖
标题:大虾们都来看看吧,一个令人困惑的问题
只看楼主 加入收藏
kings169524
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-5-5
收藏
 问题点数:0 回复次数:9 
大虾们都来看看吧,一个令人困惑的问题

遇到一个问题,大虾们帮帮。 TC3.0中 在array.h中: template <class Type> class Array{ public: Type* a; int size; int length; Array(); ~Array(); status Empty(); status Full(); void Reallocate(); status Insert(Type& ins,int n); void AddTail(Type ins); void Reverse(); void Read(); void Print(); }

在bit.h中 include <arrary.h> struct Bit{ unsigned short * bits; int length; int size; Bit(); void Clear(); status Empty(); void ToString(Array<char> &s); void StringToBit(Array<char> &s); void Reallocate(); void Union(Bit &t); void Read(); void Print(); status Full(); ~Bit(); }

在Huffman.cpp中 #include <arrary.h> #include <bit.h> 接着...源程序... 编译通过,可链接(F9)时出了错误: Undefined Symbol Array<char>::AddTail (char) in module ...\src\cpp\huffman.cpp

搜索更多相关主题的帖子: void int Array status 
2005-05-06 11:29
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
Array&lt;char&gt;::AddTail (char)

把这个函数体的代码也贴出来看看。
2005-05-06 14:52
kings169524
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-5-5
收藏
得分:0 

我把三个文件合在一起贴出来 #include <status.h>

#ifndef PRINTWIDTH #define PRINTWIDTH 4 #endif

#ifndef BASICLEN 20 #define BASICLEN 20 #endif

template <class Type> class Array{ public: Type* a; int size; int length; Array(); ~Array(); status Empty(); status Full(); void Reallocate(); status Insert(Type& ins,int n); void AddTail(Type ins); void Reverse(); void Read(); void Print(); }

template <class Type> void Array<Type>::Reallocate(){ if(size==0){ a=new Type[BASICLEN]; size=BASICLEN; } else{ Type* t=new Type[length]; for(int i=0;i<length;i++){ t[i]=a[i]; } delete(a); a=new Type[size+=BASICLEN]; for(i=0;i<length;i++){ a[i]=t[i]; } delete(t); } }

template <class Type> status Array<Type>::Full(){ if(length>=size) return TRUE; else return FALSE; }

template <class Type> status Array<Type>::Empty(){ if(length==0) return TRUE; else return FALSE; }

template <class Type> void Array<Type>::Reverse(){ Type t; for(int i=0;i<length/2;i++){ t=a[i]; a[i]=a[length-1-i]; a[length-1-i]=t; } }

template <class Type> void Array<Type>::Read(){ cout<<"\nPlease enter the num of data:";cin>>length; while(length<=0){ cout<<"\nPlease enter the num of data:";cin>>length; } while(Full()) Reallocate(); for(int i=0;i<length;i++){ cout<<"Data["<<i<<"]=";cin>>a[i]; } }

template <class Type> void Array<Type>::Print(){ if(!Empty()){ cout<<"\nPrint:\n"; for(int i=0;i<length;i++){ cout<<"Data["<<i<<"]="<<a[i]<<endl; } } }

template <class Type> Array<Type>::Array(){ a=new Type<BASICLEN>; size=BASICLEN; length=0; }

template <class Type> Array<Type>::~Array(){ delete(a); }

template <class Type> void Array<Type>::AddTail(Type ins){ if(Full()) Reallocate(); a[length++]=ins; }

template <class Type> status Array<Type>::Insert(Type& ins,int n){ if(n<0){ cout<<"\nerror: insert location <0\n"; return FAILE; } if(Full()) Reallocate(); if(n>length){ a[length]=ins; } else{ for(k=length;k>n;k--){ a[k]=a[k-1]; } a[k]=ins; } length++; return SUCCESS; }

struct Bit{ unsigned short * bits; int length; int size; Bit(); void Clear(); status Empty(); void ToString(Array<char> &s); void StringToBit(Array<char> &s); void Reallocate(); void Union(Bit &t); void Read(); void Print(); status Full(); ~Bit(); }

Bit::~Bit(){ delete(bits); }

void Bit::Clear(){ delete(bits); size=length=0; }

status Bit::Full(){ if(length/8>=size+1) return TRUE; else return FALSE; }

void Bit::Reallocate(){ if(length){ int l=length/8; l%8?l+1:l; unsigned short* t=new unsigned short[l]; for(int i=0;i<l;i++) t[i]=bits[i]; delete(bits); bits=new unsigned short[size+BASICLEN]; for(i=0;i<l;i++) bits[i]=t[i]; size+=BASICLEN; for(;i<size;i++) bits[i]=0; delete(t); } else{ Clear(); bits=new unsigned short[BASICLEN]; size=BASICLEN; for(int i=0;i<size;i++) bits[i]=0; } }

status Bit::Empty(){ if(!size) return TRUE; else return FALSE; }

void Bit::Union(Bit& t){ if(Full()) Reallocate(); for(int i=0;i<t.length;i++){ bits[(length+i)/8]|=(((t.bits[i/8]&(1<<i%8))>>i%8)<<(length+i)%8); } length+=t.length; }

void Bit::Read(){ Clear(); Reallocate(); char c; c=getchar(); while(c=='0'||c=='1'){ bits[length/8]|=(c-'0')<<(length%8); length++; if(Full()) Reallocate(); c=getchar(); } }

void Bit::Print(){ cout<<"\nPrint\n"; for(int i=0;i<length;i++){ if(bits[i/8]&(1<<(i%8))) cout<<'1'; else cout<<'0'; } }

Bit::Bit(){ length=0; bits=NULL; }

void Bit::ToString(Array<char> &s){ int i=0; char c; while(i<length){ c=('0'+1&(bits[i/8]>>(i%8))); s.AddTail(c); i++; } }

void Bit::StringToBit(Array<char> &s){ length=s.length; delete(bits); if(length%8!=0) bits=new unsigned short[length/8+1]; else bits=new unsigned short[length/8]; for(int i=0;i<length/8;i++){ bits[i]=0; } if(length%8) bits[i]=0;

i=0; while(i<s.length){ bits[i/8]|=((s.a[i]-'0')<<i%8); i++; } }

int pow(int p,int t){ while(t>0){ p*=p; t--; } return p; }

struct Huffs{ unsigned weight; int lc; int rc; int para; };

typedef char Data;

struct Huffman{ Huffs* huf; Data* data; unsigned len; Huffman(); status Create(); void CreateBT(); int DeepBT(); int DeepBTs(int p); void PrintBT(); void PrintBTs(int p,int x,int y,int d); //status TranslateFrom(Bit code,Array<char> text); };

Huffman::Huffman(){ huf=NULL; data=NULL; len=0; }

int Huffman::DeepBTs(int p){ int d1,d2; if(huf[p].lc) d1=DeepBTs(huf[p].lc); if(huf[p].rc) d2=DeepBTs(huf[p].rc); d1<d2?d2:d1; return d1+1; }

int Huffman::DeepBT(){ return DeepBTs(2*len-1); }

void Huffman::PrintBTs(int p,int x,int y,int d){ gotoxy(x,y); cout<<huf[p].weight; if(p<len){ gotoxy(x,y+1); cout<<data[p]; } else{ PrintBTs(huf[p].lc,x-PRINTWIDTH*pow(2,d),y+3,d-1); PrintBTs(huf[p].rc,x+PRINTWIDTH*pow(2,d),y+3,d-1); } }

void Huffman::PrintBT(){ clrscr(); int d=DeepBT(); cout<<"\n\tBT\n"; PrintBTs(2*len-1,40,3,d-1); }

void Huffman::CreateBT(){ unsigned m1=0,m2=1,i,j; if(huf[m1].weight>huf[m2].weight){ i=m1; m1=m2; m2=i; } for(i=0;i<len-1;i++){ for(j=0;j<len+i;j++){ if(huf[j].para==NULL){ if(huf[m1].para!=NULL) m1=j; else if(huf[m2].para!=NULL) m2=i+j; else{ if(huf[j].weight<=huf[m1].weight&&j!=m1&&j!=m2){ if(huf[j].weight<=huf[m2].weight) if(j!=m2){ m2=j; } else{ m1=m2; m2=j; } } } } } huf[j].lc=m1; huf[j].rc=m2; huf[m1].para=huf[m2].para=j; } }

status Huffman::Create(){ cout<<"enter the num of data(2 - 37568):";cin>>len; if(len<2){ len=0; cout<<"\nerror~\n"; return FAILE; } else{ data=new Data[len]; huf=new Huffs[2*len-1]; for(unsigned i=0;i<len;i++){ cout<<"data"<<i<<"="; cin>>data[i]; cout<<"weight:"; cin>>huf[i].weight; huf[i].lc=huf[i].rc=huf[i].para=0; } for(;i<(2*len-1);i++){ huf[i].weight=huf[i].lc=huf[i].rc=huf[i].para=0; } CreateBT(); return SUCCESS; } }

void t1(){ Huffman h; h.Create(); h.PrintBT(); getch(); }

void main(){ t1(); }

2005-05-06 15:04
kings169524
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-5-5
收藏
得分:0 
template &lt;class Type&gt;
void Array&lt;Type&gt;::AddTail(Type ins){
 if(Full())
  Reallocate();
 a[length++]=ins;
}
2005-05-07 13:07
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
刚才不在论坛没看见你信息。

你怎么把全部都贴上来了?!
2005-05-07 16:18
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
你把全部都贴上来,又一点注释都没写,我只能给你一个字:

晕!
2005-05-07 16:21
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
template <class Type> status Array<Type>::Full(){ if(length>=size) return TRUE; else return FALSE; } 这个类在哪里?! PS:小姐,我只能告诉你,以后写代码要写注释,没有注释又长的代码要看出人命的!
2005-05-07 16:28
kings169524
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-5-5
收藏
得分:0 

对不起,我重新整理一下 //status.h typedef int status #define FAILE 0 #define SUCCESS 1 #define TURE 1 #define FALSE 0 //huffman.cpp 从下面开始就是源文件,类都贴在前面。 #include <status.h>

#ifndef PRINTWIDTH #define PRINTWIDTH 4 #endif

#ifndef BASICLEN 20 #define BASICLEN 20 #endif

//一个可自动分配存储空间的数组。 template <class Type> class Array{ public: Type* a; int size; int length; Array(); ~Array(); status Empty();//是否空? status Full();//是否满? void Reallocate();//重新分配空间 status Insert(Type& ins,int n);//在数组的第n个位置插入一个元素 void AddTail(Type ins); //在数组尾部添加一个元素 void Reverse();//逆置数组 void Read();//设置数组 void Print();//打印 }

//一个二进制类,用于存储二进制串。 struct Bit{ unsigned short * bits; int length;//二进制串长度 int size;//分配给SHORT* BITS 的长度 Bit(); void Clear(); //清空 status Empty();//是否为空? void ToString(Array<char> &s); //将二进制串转成字符串 void StringToBit(Array<char> &s);//将字符串转成二进制串 void Reallocate();//重新分配空间 void Union(Bit &t);//将另一个二进制串并入自己的尾部 void Read();//设置二进制串 void Print();//打印 status Full();//是否为满? ~Bit(); }

//哈夫曼树结点 struct Huffs{ int weight;//权重 int lc;//左子树 int rc;//右子树 int para;//父树 };

typedef char Data;

struct Huffman{ Huffs* huf; //哈夫曼树〈数组存储〉 Data* data;//数据组 int len;//数据组长度 Huffman(); status Create();//通过用户输入来设置哈夫曼树 void CreateBT();//通过数据组和权重来设置哈夫曼树 int DeepBT();//求树深度 int DeepBTs(int p);//求树深递归函数 void PrintBT();//打印树 void PrintBTs(int p,int x,int y,int d);//打印树子递归函数 };

template <class Type> void Array<Type>::Reallocate(){ if(size==0){ a=new Type[BASICLEN]; size=BASICLEN; } else{ Type* t=new Type[length]; for(int i=0;i<length;i++){ t[i]=a[i]; } delete(a); a=new Type[size+=BASICLEN]; for(i=0;i<length;i++){ a[i]=t[i]; } delete(t); } }

template <class Type> status Array<Type>::Full(){ if(length>=size) return TRUE; else return FALSE; }

template <class Type> status Array<Type>::Empty(){ if(length==0) return TRUE; else return FALSE; }

template <class Type> void Array<Type>::Reverse(){ Type t; for(int i=0;i<length/2;i++){ t=a[i]; a[i]=a[length-1-i]; a[length-1-i]=t; } }

template <class Type> void Array<Type>::Read(){ cout<<"\nPlease enter the num of data:";cin>>length; while(length<=0){ cout<<"\nPlease enter the num of data:";cin>>length; } while(Full()) Reallocate(); for(int i=0;i<length;i++){ cout<<"Data["<<i<<"]=";cin>>a[i]; } }

template <class Type> void Array<Type>::Print(){ if(!Empty()){ cout<<"\nPrint:\n"; for(int i=0;i<length;i++){ cout<<"Data["<<i<<"]="<<a[i]<<endl; } } }

template <class Type> Array<Type>::Array(){ a=new Type<BASICLEN>; size=BASICLEN; length=0; }

template <class Type> Array<Type>::~Array(){ delete(a); }

template <class Type> void Array<Type>::AddTail(Type ins){ if(Full()) Reallocate(); a[length++]=ins; }

template <class Type> status Array<Type>::Insert(Type& ins,int n){ if(n<0){ cout<<"\nerror: insert location <0\n"; return FAILE; } if(Full()) Reallocate(); if(n>length){ a[length]=ins; } else{ for(k=length;k>n;k--){ a[k]=a[k-1]; } a[k]=ins; } length++; return SUCCESS; }

Bit::~Bit(){ delete(bits); }

void Bit::Clear(){ delete(bits); size=length=0; }

status Bit::Full(){ if(length/8>=size+1) return TRUE; else return FALSE; }

void Bit::Reallocate(){ if(length){ int l=length/8; l%8?l+1:l; unsigned short* t=new unsigned short[l]; for(int i=0;i<l;i++) t[i]=bits[i]; delete(bits); bits=new unsigned short[size+BASICLEN]; for(i=0;i<l;i++) bits[i]=t[i]; size+=BASICLEN; for(;i<size;i++) bits[i]=0; delete(t); } else{ Clear(); bits=new unsigned short[BASICLEN]; size=BASICLEN; for(int i=0;i<size;i++) bits[i]=0; } }

status Bit::Empty(){ if(!size) return TRUE; else return FALSE; }

void Bit::Union(Bit& t){ if(Full()) Reallocate(); for(int i=0;i<t.length;i++){ bits[(length+i)/8]|=(((t.bits[i/8]&(1<<i%8))>>i%8)<<(length+i)%8); } length+=t.length; }

void Bit::Read(){ Clear(); Reallocate(); char c; c=getchar(); while(c=='0'||c=='1'){ bits[length/8]|=(c-'0')<<(length%8); length++; if(Full()) Reallocate(); c=getchar(); } }

void Bit::Print(){ cout<<"\nPrint\n"; for(int i=0;i<length;i++){ if(bits[i/8]&(1<<(i%8))) cout<<'1'; else cout<<'0'; } }

Bit::Bit(){ length=0; bits=NULL; }

void Bit::ToString(Array<char> &s){ int i=0; char c; while(i<length){ c=('0'+1&(bits[i/8]>>(i%8))); s.AddTail(c); i++; } }

void Bit::StringToBit(Array<char> &s){ length=s.length; delete(bits); if(length%8!=0) bits=new unsigned short[length/8+1]; else bits=new unsigned short[length/8]; for(int i=0;i<length/8;i++){ bits[i]=0; } if(length%8) bits[i]=0;

i=0; while(i<s.length){ bits[i/8]|=((s.a[i]-'0')<<i%8); i++; } }

int pow(int p,int t){ while(t>0){ p*=p; t--; } return p; }

Huffman::Huffman(){ huf=NULL; data=NULL; len=0; }

int Huffman::DeepBTs(int p){ int d1,d2; if(huf[p].lc) d1=DeepBTs(huf[p].lc); if(huf[p].rc) d2=DeepBTs(huf[p].rc); d1<d2?d2:d1; return d1+1; }

int Huffman::DeepBT(){ return DeepBTs(2*len-1); }

void Huffman::PrintBTs(int p,int x,int y,int d){ gotoxy(x,y); cout<<huf[p].weight; if(p<len){ gotoxy(x,y+1); cout<<data[p]; } else{ PrintBTs(huf[p].lc,x-PRINTWIDTH*pow(2,d),y+3,d-1); PrintBTs(huf[p].rc,x+PRINTWIDTH*pow(2,d),y+3,d-1); } }

void Huffman::PrintBT(){ clrscr(); int d=DeepBT(); cout<<"\n\tBT\n"; PrintBTs(2*len-1,40,3,d-1); }

void Huffman::CreateBT(){ int m1=0,m2=1,i,j; if(huf[m1].weight>huf[m2].weight){ i=m1; m1=m2; m2=i; } for(i=0;i<len-1;i++){ for(j=0;j<len+i;j++){ if(huf[j].para==NULL){ if(huf[m1].para!=NULL) m1=j; else if(huf[m2].para!=NULL) m2=i+j; else{ if(huf[j].weight<=huf[m1].weight&&j!=m1&&j!=m2){ if(huf[j].weight<=huf[m2].weight) if(j!=m2){ m2=j; } else{ m1=m2; m2=j; } } } } } huf[j].lc=m1; huf[j].rc=m2; huf[m1].para=huf[m2].para=j; } }

status Huffman::Create(){ cout<<"enter the num of data(2 - 37568):";cin>>len; if(len<2){ len=0; cout<<"\nerror~\n"; return FAILE; } else{ data=new Data[len]; huf=new Huffs[2*len-1]; for(int i=0;i<len;i++){ cout<<"data"<<i<<"="; cin>>data[i]; cout<<"weight:"; cin>>huf[i].weight; huf[i].lc=huf[i].rc=huf[i].para=0; } for(;i<(2*len-1);i++){ huf[i].weight=huf[i].lc=huf[i].rc=huf[i].para=0; } CreateBT(); return SUCCESS; } }

void t1(){ Huffman h; h.Create(); h.PrintBT(); getch(); }

void main(){ t1(); }

2005-05-09 13:05
kings169524
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-5-5
收藏
得分:0 
void Bit::ToString(Array&lt;char&gt; &amp;s){
 int i=0;
 char c;
 while(i&lt;length){
  c=('0'+1&amp;(bits[i/8]&gt;&gt;(i%8)));
  s.AddTail(c);//我将此句删除后程序就可以运行了。。。
  i++;
 }
}
2005-05-09 13:27
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
大概是因为Array&lt;char&gt; &amp;s这个是引用的,所以要有预先的对象化吧?
2005-05-11 13:19
快速回复:大虾们都来看看吧,一个令人困惑的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036409 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved