|
I have spent hours scouring the net for the answer to this, I do hope somebody could help me here
I'm currently coding an English-Chinese dictionary in C. This dictionary will later be embedded into a PDA with the Hopen OS (Don't worry about this). Anyway, due to this, my final code has to be contained in only 1 file, ie... no .bin or .txt
Basicaly I have included in my code a rather large word list in the following format
#define MAXCHN 100<br />
#define MAXPIN 100<br />
#define MAXENG 200<br />
<br />
typedef struct {<br />
char chn[MAXCHN];<br />
char pin[MAXPIN];<br />
char ove[MAXPIN];<br />
char eng[MAXENG];<br />
}<br />
<br />
Words words[] = <br />
{ <br />
{"°¡","a","¨¡","(interj.) | ah"},<br />
{"°¢","a","¨¡","an initial particle | prefix to names of people"},<br />
{"ºÇ","a","¨¡","(phonetic particle)"}
(please note you may need to alter your code page)
This is some 30000 lines of text.
Now this works all good and proper, but with one drawback, The size. The origional text file is only 1.6Mb, after compilation the file is some 16MB. I realised my error in that each C string is allocated what I earlier defined. So after I compile, some of the shorter lines have a mass of white space after them, increasing the size.
All the text is constant, it will not be changed at all. Basically it is just a waste of space.
Instead of literal strings I tried using pointers i.e
typedef struct {<br />
char *chn;<br />
char *pin;<br />
char *ove;<br />
char *eng;<br />
}
Though this causes buffer overruns during execution. Maybe I overlooked something but I'm pretty sure this isn't the way to go.
Any help, advice or even a head banging would be greatly appreciated. Thankyou.
|
|
|
|
|
waldermort wrote: Though this causes buffer overruns during execution. Maybe I overlooked something but I'm pretty sure this isn't the way to go.
Well, how do you allocate the different strings ?
'any way, I would try to do this in a 2 passes process; write an application that generate a dictionnary in binary format (hexa, or uuencoded ) , and include that data in your final application, use that data as the dictionnary.
or do something like ( does that work ? ):
typedef struct Word {
char *chn;
char *pin;
char *ove;
char *eng;
}
Word _word[] =
{
{"°¡","a","¨¡","(interj.) | ah"},
{"°¢","a","¨¡","an initial particle | prefix to names of people"},
...
};
now, each string ( chh, pin, ove, eng ) will have the right size.
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
I didnt exactly get u ? ... The size of exe is issue or memory used by program while it is running is issue ?
If both are issues go for allocating data on heap. Only allocate data for the character required at that time while deleting the previous one. I mean u will have use switches with 30,000(whatever lines of text is) cases.
I hope I have understood ur problem correctly && u have understood the solution.
Best of Luck & Best Regards,
|
|
|
|
|
Thanks for the quick replies.
The memory used while running is no problem, however the size of the exe is.
Creating a pointer for each e.g char *chn; causes the program to crash, as far as I can see it has something to do with determining the string length. This may have something to do with limitations of the SDK I am using.
I think I will try recoding this and using multi dimensional arrays.
My question is, what is the best way to include this much text, while at the same time saving space within the exe?
|
|
|
|
|
If exe size is problem then start allocating data on heap. or the other option is compressing data by using binary data just the way Maximilien mentioned.
|
|
|
|
|
waldermort wrote: Words words[] =
{
{"°¡","a","¨¡","(interj.) | ah"},
{"°¢","a","¨¡","an initial particle | prefix to names of people"},
{"ºÇ","a","¨¡","(phonetic particle)"}
MAXCHN 100
See MAXCHN is 100. And you are storing just a small amount of string ie about 2 or 4 chars in each. Once you do this it will run fine. But each structure will take up 400 bytes.
Now just think about the number of structures you allocate. .
I think this is the problem. Be more careful with this.
waldermort wrote: typedef struct {
char chn[MAXCHN];
char pin[MAXPIN];
char ove[MAXPIN];
char eng[MAXENG];
}
You can restructure it like this...
struct {
char chn[10];
char pin[10];
char ove[10];
char eng[MAXENG];
}
Just an Idea.
Jesus Loves You and Me <marquee direction="up" height="50" scrolldelay="1" step="1" scrollamount="1" style="background-color:'#44ccff'">
--Owner Drawn
--Nothing special
--Defeat is temporary but surrender is permanent
--Never say quits
--Jesus is Lord
|
|
|
|
|
What ur doing is static array , u need to dynamically allocate
memory .
I can see the problem is the Size of file not the memory usage.
Actually from the Architecure view ur including the data file
in your code file , this is an issue .
Do one thing u can create a structure that also stores the
size of four array
<br />
typedef struct{<br />
int MAXCHN,MAXPIN,MAXENG;<br />
char chn*;<br />
char pin*;<br />
char ove*;<br />
char eng*;<br />
}
Process the data file and change the size of each
individual structure data.
Vikas Amin
Embin Technology
Bombay
vikas.amin@embin.com
-- modified at 1:21 Friday 30th December, 2005
|
|
|
|
|
Thanks for the advice guys, you have all been very helpful. I saw the error was in not dynamicaly allocating the arrays.
I have scrubbed the whole struct and instead used a an array of pointers to an array of pointers. char *(*results[MAXSTR])[4] Urgh I hated to say it, sorry, I hate arrays too - give me STL any day of the week. Anyway this method is proving more efficient memory wise also since I don't need to deal with whole strings rather just the pointer.
What I thought earlier were buffer overruns were infact a little bug I had overlooked. when calling textout I had set a static length, if the text was shorter then it didnt matter because the white space at the end of the array was overwriting what was previously drawn. When dynamicaly allocating this was causing problems. It'll teach me to clear the canvas before drawing.
I have now got the exe (debug) down to 5mb. for some reason I am having the C1001 INTERNAL COMPILE ERROR when trying a release build. I am also thinking about including a huffman algorithm to further reduce some of that ascii.
|
|
|
|
|
when I select an icon in view, I want the icon appearanced changed to indicate that it is selected.I don't know how to resolve this question .
the icon is on the view.
Help me,thank you.
|
|
|
|
|
See here.
"Take only what you need and leave the land as you found it." - Native American Proverb
|
|
|
|
|
I draw some icons into view ,the icon is from a file.I also draw some text in the view . the view inherit from CSrollView.
but the icon can't be output at the end.
thank you .
|
|
|
|
|
Derive from CFormView instead and you'll be able to create a control to display the icon.
"Take only what you need and leave the land as you found it." - Native American Proverb
|
|
|
|
|
Hi,
I'm a C++ professional programmer with also some experience with Java. I would like to enter in the .NET world but I don't know what would be better for my future projects: Try with Managed C++ or to learn C#? I've downloaded VS2005 and I've read that there is a new specification for managed C++. So, it seems to me that maybe managed C++ basements aren't enough solid and it will be better to take C# way. But, I not sure if it's good idea to abandon my loved C++.
Please, share your opinions with me.
Thanks a lot,
|
|
|
|
|
|
|
If you alreday know C++, VC++ 2005 will be your best choice for writing .NET applications.
|
|
|
|
|
I prefer to learn a new language
inspite to stick to any one for life.
But its good if they are putting up
Managed C++ , it will be worth studying.
Have u got the seminar given in IIM by
Mr.Azim Premgi he says Change is a fundamental
thing in life and if u cannot adopt to change
then u are not going to advance . The faster
u detect a change the more ahead ur in the
race.
Vikas Amin
Embin Technology
Bombay
vikas.amin@embin.com
|
|
|
|
|
vikas amin wrote: Have u got the seminar given in IIM by
Mr.Azim Premgi he says Change is a fundamental
thing in life and if u cannot adopt to change
then u are not going to advance
Sorry to trouble you again buddy, not every body here live in India and too in near IIM..
but as usaual what ever azim is almost near to reality
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
|
Slightly late answer, but after just looking at this, I suggest going with C#. Unlike, C++, it was written for .NET and doesn't seem like an afterthought. More importantly, the documentation for C++/CLI, as it's now called, is terrible and it's almost impossible to find sample code for anything but the most trivial examples.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Hi,
Thanks for your responses. I've just returned from my Christmas holidays and I feel enough "New Year Positive" to learn a new language. So, I'm going to try C# as my entry point to .NET. I hope to be able to be writting my first test apps in a couple of weeks
|
|
|
|
|
I'm interested in what experiences people are having porting existing C++/MFC apps from Visual Studio 2003 to Visual Studio 2005.
I'm having all kinds of issues - worse than any previous update:
- problems with manifest files not being generated
- time_t now 8 bytes from 4
- all kinds of CString issues which I'm still trying to resolve
- etc...
- finally get the app to compile and run in debug mode only for it to crash immediately (before it's even visible) in release mode.
etc..
The IDE productivity enhancements in 2005 are great, and it's got to be the way to go for all kinds of reasons, but why does it have to be so darn hard? Why should I have to spend a week trolling through obscure and inadequately documented language etc. changes just to get back to where I was before?
What's everyone's experiences so far of this process?
Pete
|
|
|
|
|
peterboulton wrote: all kinds of CString issues which I'm still trying to resolve
peterboulton wrote: finally get the app to compile and run in debug mode only for it to crash immediately (before it's even visible) in release mode.
could you be more explicit ?
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|
could you be more explicit ?
CString issues: This used to work and now it crashes (where CStringRes is a utility
object which returns a string resource content as a CString)
theTable.Format(CStringRes(IDS_STATSHTML_STRING), m_AvePctErr, diagMAPE, m_StdError, diagStdErr, m_StdDev, diagStdDev, m_ymean, diagMean, m_CorrCoeff, diagCorrCoeff);
The crash text, which I'm still researching, is:
Debug Assertion Failed! Program: ... File: f:\rtm\vctools\crt_bld\self_x86\crt\src\output.c Line: 1123 Expression: (state != ST_INVALID) For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application)
The release mode crash I'm also still investigating - obviously these ones are a
little tricky without the debug crutch.
However, whilst specific help is always appreciated, what I was hoping to get from
the posting was other peoples' experiences with the port. I'll still have
the problems, but at least I will know I'm not on my own! And maybe for people
who have not yet taken the plunge they will be able to better assess the task to
come.
Pete
|
|
|
|
|
peterboulton wrote: theTable.Format(CStringRes(IDS_STATSHTML_STRING), m_AvePctErr, diagMAPE, m_StdError, diagStdErr, m_StdDev, diagStdDev, m_ymean, diagMean, m_CorrCoeff, diagCorrCoeff);
the problem is here that in Visual Studio 2003 following line of code was OK :
someString.Format("x = %d",x);
in VS2005 you need to write :
someString.Format(_T("x = %d"),x);
peterboulton wrote: Debug Assertion Failed! Program: ... File: f:\rtm\vctools\crt_bld\self_x86\crt\src\output.c Line: 1123 Expression: (state != ST_INVALID) For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application)
Does this happen with all projects ?
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|