当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 3 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : Huffman在VS2010上能编译成功,为什么在ubuntu下的g++编译不成功呢?
帖子发表于 : 2013-03-30 20:48 

注册: 2013-03-30 13:26
帖子: 7
系统: ubuntu12.10
送出感谢: 0 次
接收感谢: 0 次
如题
代码:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
#define MAX 95

typedef struct
{
char data;
int weight;
int lchild;
int rchild;
int parent;
}HTNODE;

typedef struct
{
char ch;
string bit;
}CodeNode;


class Huffman
{
public:
Huffman();
~Huffman();
void InitHT();
void InputW(string name);
void SelectMin(int i,int &p1,int &p2);
void CreatHuffman(string name);
void CharSetHuffmanEncoding();
void FileCoding(string name);
void FileDecoding(string name);
void PrintCodeNode();
void PreOrder();
void InOrder();
void PostOrder();
void NPreOrder();
void NInOrder();
void NPostOrder();
void LeverOrder();
void DeleteWeight_0();
int searchRoot();
int realNumberOfTheHT();

/* data */
private:
void PreOrderAt(int node);
void InOrderAt(int node);
void PostOrderAt(int node);
HTNODE HuffmanT[2*MAX-1],Q[MAX];
CodeNode H[MAX];
int realNumOfTheHT;
int root;
};
Huffman::Huffman()
{
root=-1;
}

Huffman::~Huffman()
{
root=-1;
}

void Huffman::InitHT()
{
for(int counter=0;counter<2*MAX-1;counter++)
{
if(counter<=MAX)
HuffmanT[counter].data=' '+counter;
else
HuffmanT[counter].data=NULL;
HuffmanT[counter].weight=0;
HuffmanT[counter].lchild=-1;
HuffmanT[counter].rchild=-1;
HuffmanT[counter].parent=-1;
}
}



void Huffman::InputW(string fileName)
{
fstream hFile;
hFile.open(fileName,ios::in);
if(!hFile)
{
cerr<<"File open error!"<<endl;
return;
}
char c;
while(!hFile.eof())
{
c=hFile.get();
HuffmanT[c-' '].weight++;
}
hFile.close();
}


void Huffman::DeleteWeight_0()
{
for(int counter=0,i=0;counter<=MAX&&i<=MAX;counter++)
{
if(HuffmanT[counter].weight>0)
{
Q[i].data=HuffmanT[counter].data;
Q[i].weight=HuffmanT[counter].weight;
i++;
}
}
int i;
for(i=0;i<MAX;i++)
{
if(Q[i].weight>0)
{
HuffmanT[i].data=Q[i].data;
HuffmanT[i].weight=Q[i].weight;
}
else
break;
}
for(int counter=i;counter<MAX;counter++)
{
HuffmanT[counter].data=NULL;
HuffmanT[counter].weight=0;
}
}

int Huffman::realNumberOfTheHT()
{
for(int counter=0;counter<2*MAX-1;counter++)
{
if(HuffmanT[counter].weight==0)
return counter;
}
}

void Huffman::SelectMin(int n,int &p1,int &p2)
{
int i,j;
for(i=0;i<=n;i++)
{
if(HuffmanT[i].parent==-1)
{
p1=i;
break;
}
}
for(j=i+1;j<=n;j++)
{
if(HuffmanT[j].parent==-1)
{
p2=j;
break;
}
}
for(i=0;i<=n;i++)
{
if((HuffmanT[p1].weight>HuffmanT[i].weight)&&(HuffmanT[i].parent==-1)&&(p2!=i))
p1=i;
}
for(j=0;j<=n;j++)
{
if((HuffmanT[p2].weight>HuffmanT[j].weight)&&(HuffmanT[j].parent==-1)&&(p1!=j))
p2=j;
}

}


int Huffman::searchRoot()
{
for (int i = 0; i <=2*realNumOfTheHT-1; ++i)
{
/* code */
if(HuffmanT[i].parent==-1)
return i;
}
}

void Huffman::CreatHuffman(string name)
{
int p1,p2;
InitHT();
InputW(name);
DeleteWeight_0();
realNumOfTheHT=realNumberOfTheHT();
for(int counter=realNumOfTheHT;counter<=2*realNumOfTheHT-1;counter++)
{
SelectMin(counter-1,p1,p2);
HuffmanT[p1].parent=HuffmanT[p2].parent=counter;
HuffmanT[counter].lchild=p1;
HuffmanT[counter].rchild=p2;
HuffmanT[counter].weight=HuffmanT[p1].weight+HuffmanT[p2].weight;
}

root=searchRoot();
}


void Huffman::CharSetHuffmanEncoding()
{
/*根据Huffman树T 求Huffman编码表H*/
int c, p, i; /* c 和p 分别指示T 中孩子和双亲的位置*/
string str; /* 临时存放编码*/ /* 指示编码在cd 中的位置*/

for( i =0; i <realNumOfTheHT; i++)
{
/* 依次求叶子T[i]的编码*/
str='\0';/* 编码结束符*/
H[i].ch=HuffmanT[i].data; /* 读入叶子T[i]对应的字符*/
//start=realNumOfTheHT; /* 编码起始位置的初值*/
c =i; /* 从叶子T[i]开始上溯*/
while( (p=HuffmanT[c].parent)>=0){ /* 直到上溯到T[c]是树根位置*/
if(HuffmanT[p].lchild==c)
str='0'+str;
else
str='1'+str;
//str=(HuffmanT[p].lchild==c)? '0':'1';
/* 若T[c]是T[p]的左孩子,则生成代码0,否则生成代码1*/
c=p; /* 继续上溯*/
}
H[i].bit=str;
//strcpy(H[i].bit,str); /*复制编码为串于编码表H*/
}
}



void Huffman::FileCoding(string fileName)
{
fstream hFile,ToFile("target.txt",ios::out);
hFile.open(fileName,ios::in);
if(!hFile||!ToFile)
{
cerr<<"File open error!"<<endl;
return;
}
char c;
while(!hFile.eof())
{
c=hFile.get();
for(int counter=0;counter<realNumOfTheHT;counter++)
{
if(c==H[counter].ch)
ToFile<<H[counter].bit;
}
}

hFile.close();
ToFile.close();
}



void Huffman::FileDecoding(string name)
{
fstream hFile;
hFile.open(name,ios::in);
fstream ToFile("target_1.txt",ios::out);
if(!hFile||!ToFile)
{
cerr<<"File open error!"<<endl;
return;
}
char c;
int par;
par=root;
while(!hFile.eof())
{
hFile>>c;
if(c=='0')
par=HuffmanT[par].lchild;
else if(c=='1')
par=HuffmanT[par].rchild;
else
{
ToFile<<HuffmanT[par].data;
par=root;
}
}

hFile.close();
}

void Huffman::PrintCodeNode()
{
for(int counter=0;counter<realNumOfTheHT;counter++)
{
cout<<H[counter].ch<<" "<<H[counter].bit<<endl;
}
}


void Huffman::PreOrder()
{
PreOrderAt(root);
}

void Huffman::InOrder()
{
InOrderAt(root);
}

void Huffman::PostOrder()
{
PostOrderAt(root);
}


void Huffman::PreOrderAt(int node)
{
if(node!=-1)
{
if(HuffmanT[node].lchild==-1)
cout<<HuffmanT[node].data<<" "<<HuffmanT[node].weight<<endl;
PreOrderAt(HuffmanT[node].lchild);
PreOrderAt(HuffmanT[node].rchild);
}
}


void Huffman::InOrderAt(int node)
{
if(node!=-1)
{
InOrderAt(HuffmanT[node].lchild);
if(HuffmanT[node].lchild==-1)
cout<<HuffmanT[node].data<<" "<<HuffmanT[node].weight<<endl;
InOrderAt(HuffmanT[node].rchild);
}
}

void Huffman::PostOrderAt(int node)
{
if(node!=-1)
{
PostOrderAt(HuffmanT[node].lchild);
PostOrderAt(HuffmanT[node].rchild);
if(HuffmanT[node].lchild==-1)
cout<<HuffmanT[node].data<<" "<<HuffmanT[node].weight<<endl;

}
}

void Huffman::NPreOrder()
{
int node=root;
int S[2*MAX-1];
int top=-1;
while(top!=-1||node!=-1)
{
while(node!=-1)
{
if(HuffmanT[node].lchild==-1)
cout<<HuffmanT[node].data<<" "<<HuffmanT[node].weight<<endl;
S[++top]=node;
node=HuffmanT[node].lchild;
}
if (top!=-1)
{
node=S[top--];
node=HuffmanT[node].rchild;
}
}
}

void Huffman::NInOrder()
{
int node=root;
int S[2*MAX-1];
int top=-1;
while(top!=-1||node!=-1)
{
while(node!=-1)
{
S[++top]=node;
node=HuffmanT[node].lchild;
}
if (top!=-1)
{
node=S[top--];
if(HuffmanT[node].lchild==-1)
cout<<HuffmanT[node].data<<" "<<HuffmanT[node].weight<<endl;
node=HuffmanT[node].rchild;
}
}
}
int main()
{
string name;
cout<<"input the name of the file:";
getline(cin,name);
string name_1="target.txt";
Huffman head;
head.CreatHuffman(name);

head.CharSetHuffmanEncoding();
head.FileCoding(name);
head.PrintCodeNode();
head.FileDecoding(name_1);
cout<<endl;
return 0;
}

错误:
main.cpp: 在成员函数‘void Huffman::InitHT()’中:
main.cpp:74:27: 警告: 将 NULL 转换到非指针类型‘char’ [-Wconversion-null]
main.cpp: 在成员函数‘void Huffman::InputW(std::string)’中:
main.cpp:87:29: 错误: 对‘std::basic_fstream<char>::open(std::string&, const openmode&)’的调用没有匹配的函数
main.cpp:87:29: 附注: 备选是:
In file included from main.cpp:2:0:
/usr/include/c++/4.7/fstream:871:7: 附注: void std::basic_fstream<_CharT, _Traits>::open(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::ios_base::openmode = std::_Ios_Openmode]
/usr/include/c++/4.7/fstream:871:7: 附注: no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const char*’
main.cpp: 在成员函数‘void Huffman::DeleteWeight_0()’中:
main.cpp:127:26: 警告: 将 NULL 转换到非指针类型‘char’ [-Wconversion-null]
main.cpp: 在成员函数‘void Huffman::FileCoding(std::string)’中:
main.cpp:236:29: 错误: 对‘std::basic_fstream<char>::open(std::string&, const openmode&)’的调用没有匹配的函数
main.cpp:236:29: 附注: 备选是:
In file included from main.cpp:2:0:
/usr/include/c++/4.7/fstream:871:7: 附注: void std::basic_fstream<_CharT, _Traits>::open(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::ios_base::openmode = std::_Ios_Openmode]
/usr/include/c++/4.7/fstream:871:7: 附注: no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const char*’
main.cpp: 在成员函数‘void Huffman::FileDecoding(std::string)’中:
main.cpp:262:25: 错误: 对‘std::basic_fstream<char>::open(std::string&, const openmode&)’的调用没有匹配的函数
main.cpp:262:25: 附注: 备选是:
In file included from main.cpp:2:0:
/usr/include/c++/4.7/fstream:871:7: 附注: void std::basic_fstream<_CharT, _Traits>::open(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::ios_base::openmode = std::_Ios_Openmode]
/usr/include/c++/4.7/fstream:871:7: 附注: no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const char*’


[size=150]刚开始用ubuntu不太会用g++,求大神解释,感激不尽


页首
 用户资料  
 
2 楼 
 文章标题 : Re: Huffman在VS2010上能编译成功,为什么在ubuntu下的g++编译不成功呢?
帖子发表于 : 2013-03-31 14:19 

注册: 2012-09-10 23:51
帖子: 1
系统: Ubuntu 12.10
送出感谢: 0 次
接收感谢: 0 次
目测需要 g++ -std=c++11


页首
 用户资料  
 
3 楼 
 文章标题 : Re: Huffman在VS2010上能编译成功,为什么在ubuntu下的g++编译不成功呢?
帖子发表于 : 2013-04-01 8:56 

注册: 2013-03-30 13:26
帖子: 7
系统: ubuntu12.10
送出感谢: 0 次
接收感谢: 0 次
xuanyan 写道:
目测需要 g++ -std=c++11

这个是多线程吗?对这个没大多的了解,还有其他的解决方法吗?谢谢


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 3 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译