Hello i am using visual studio 2013 on a windows 7 64 bit. I am trying to build a huffman tree, i have actually built it but i have problems when i try to use cyrllic i manage to get to this situation
#include <tchar.h>
#include <cstring>
#include <iostream>
#include <locale>
#include <windows.h>
#include <cstdlib>
usingnamespace std;
typedefunsignedchar byte;
byte text[] = "текст на кирилица";
int text_len;
struct Huf {
byte id;
int wh;
Huf *left, *right;
};
struct List {
List *next;
Huf *tree;
};
List *head;
char code[256];
void createList();
void writeList();
void delList(List *);
void addList(Huf *);
Huf *findDels();
void createTree();
void rlrootTree(Huf *, unsigned);
int main()
{
text_len = strlen((constchar*)text);
createList();
writeList();
createTree();
cout << "writeCodes\n";
rlrootTree(head->tree, 0);
cout << endl;
system("pause");
return 0;
}
void createList()
{
int i;
int ch[256] = { 0 };
for (i = 0; i<text_len; i++) ch[text[i]]++;
List *l;
Huf *h;
head = 0;
for (i = 0; i<255; i++) if (ch[i]>0)
{
h = new Huf;
h->id = i; h->wh = ch[i];
h->left = 0; h->right = 0;
l = new List;
l->tree = h;
l->next = head; head = l;
}
}
void writeList()
{
cout << "writeList\n";
List *l = head;
while (l)
{
cout << (l->tree)->id << " ";
l = l->next;
}
cout << endl;
l = head;
while (l)
{
cout << (l->tree)->wh << " ";
l = l->next;
}
cout << endl;
}
void delList(List *l)
{
List *lp, *lc;
if (l == head) { head = l->next; delete l; }
else
{
lp = head; lc = lp->next;
while (lc != l) { lp = lc; lc = lc->next; }
lp->next = lc->next; delete lc;
}
}
void addList(Huf *h)
{
List *l = new List;
l->tree = h;
l->next = head;
head = l;
}
Huf *findDels()
{
List *l = head, *sm = head;
Huf *h;
while (l)
{
if ((l->tree)->wh < (sm->tree)->wh) sm = l;
l = l->next;
}
h = sm->tree;
delList(sm);
return h;
}
void createTree()
{
Huf *h, *h1, *h2;
while (head->next)
{
h1 = findDels();
h2 = findDels();
h = new Huf;
h->id = ' '; h->wh = h1->wh + h2->wh;
h->left = h1; h->right = h2;
addList(h);
}
}
void rlrootTree(Huf *h, unsigned index)
{
if (h)
{
code[index] = '0';
rlrootTree(h->right, index + 1);
if (h->left == 0)
{
code[index] = '\0';
cout << h->id << "->" << code << " ";
}
code[index] = '1';
rlrootTree(h->left, index + 1);
}
}
All that is left to do is use AnsiToOem() but i get the cannot convert from 'const char *' to 'LPCTSTR', i know that LPCTSTR is a windows 4 byte, so my question is there a way ?
// little C++ Shell cog wheel button ---->
// (if missing try refreshing your browser)
#include <iostream>
usingnamespace std;
int main() {
cout << "Hello code tags!\n";
return 0;
}
2. LPCTSTR is actually a typedef of either constwchar_t* (if you're project in configured to build for the Unicode Character Set) or constchar* (if configured for the Multi-Byte Character Set or default.)
Likewise, AnsiToOem() is actually a pre-processor macro than ends up evaluating to either AnsiToOemA() (for ANSI builds) or AnsiToOemW() (for Unicode builds.)
Your problem will be solved if you used AnsiToOemA() rather than AnsiToOem().
Error 1 error C2664: 'BOOL CharToOemA(LPCSTR,LPSTR)' : cannot convert argument 1 from 'byte [18]' to 'LPCSTR' c:\users\user\documents\visual studio 2013\projects\test11\test11\source.cpp 43 1 test11
2 IntelliSense: argument of type "byte *" is incompatible with parameter of type "LPCSTR" c:\Users\user\Documents\Visual Studio 2013\Projects\test11\test11\Source.cpp 43 12 test11
3 IntelliSense: argument of type "byte *" is incompatible with parameter of type "LPSTR" c:\Users\user\Documents\Visual Studio 2013\Projects\test11\test11\Source.cpp 43 18 test11
As I can see from your earlier post, text is a buffer of unsigned chars. This cannot be passed to a function expecting a (signed) char* without casting, as you are already doing when calling strlen().
You could do the same thing when calling AnsiToOem (without the const), but do you actually need text to be unsigned chars? The "helpful" example you post is using char rather than unsigned char.
Andy
PS Working with Unicode or even UTF-8 strings might be better than using OemToChar (as OemToAnsi is now called.)
Yes i am heading to that direction using Unicode or UTF-8, ANSI is just making things more complex, i just have to do some recoding and they i will post the result hope it gets something out..