|
Modified: My answer doesn't allow for expansion.
Doing some sums...
0x4000 = 16384.
x 40 (5 things, at 8 byte spacing) = 655360 = 0.6Mb.
Allocating it as you did, puts the array on the stack - which can only cope with a small (in the grand scheme) amount of memory.
Possible your stack is getting corrupted.
1/ Make sure your memory access is only using the allocated memory.
2/ Try allocating the memory on the heap:
DTC *DTCodes = new DTCodes [0x4000];
...
DTCodes [97].nIndex = 77;
...
delete [] DTCodes;
Good luck,
Iain.
Iain Clarke appearing in spite of being begged not to by CPallini.
|
|
|
|
|
Hey Iain what machine/compiler have you?
sizeof(DTC) gives 20 on my system.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
I was pulling numbers out of mid-air. And I wasn't sure if packing would be a problem. 8byte packing, x 5 thingies = 40.
It also made the numbers bigger to illustrate the issue.
If people assume I do vast research to answer their questions, they're baaaaadly mistaken.
(OK, occasionally they're right - the whole shortcut path name in a shell extension question a few days ago tickled my curiosity and stubbornness)
Iain.
Iain Clarke appearing in spite of being begged not to by CPallini.
|
|
|
|
|
Thanks, your answer is just what I was looking for, I will try new.
|
|
|
|
|
The sizes of the members are:
struct DTC{
TCHAR *Code; 6 Bytes
TCHAR *Description; 256 Bytes
TCHAR *Defined; 256 Bytes
int nDefined; 4 Bytes
int nIndex; 4 Bytes
};
526 * 4000 = 2.1M WOW! Is my math correct?
|
|
|
|
|
jonsey29847 wrote: Is my math correct?
Math, yes...structure size, no...
With 32-bit pointers:
struct DTC{
TCHAR *Code; 4 Bytes
TCHAR *Description; 4 Bytes
TCHAR *Defined; 4 Bytes
int nDefined; 4 Bytes
int nIndex; 4 Bytes
};
20 * 4000 = 80000 not so WOW
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
My turn to be picky!
It was 0x4000, so a biiiiit bigger, but even so.
Iain.
Iain Clarke appearing in spite of being begged not to by CPallini.
|
|
|
|
|
Not in the post I replied to
jonsey29847 wrote: 526 * 4000 = 2.1M WOW! Is my math correct?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: Not in the post I replied to
OK, I'll let you off, by reason of you being correct.
Curse you, Gaaaaadgetttt!
Iain.
Iain Clarke appearing in spite of being begged not to by CPallini.
|
|
|
|
|
|
But ultimately won't I need the 2M, and if so when I load the records could I be corrupting code or the stack?
Where is the data read from the file located?
|
|
|
|
|
You'll be allocating 0x4000 structs or 4000?
Assuming 32-bit , non-Unicode (TCHARs are chars) build ...
truct DTC{
TCHAR *Code; pointer to 6 bytes
TCHAR *Description; pointer to 256 Bytes
TCHAR *Defined; pointer to 256 Bytes
int nDefined; 4 Bytes
int nIndex; 4 Bytes
};
20 bytes for each struct
518 bytes allocated for the strings in each struct
Add those together and multiply by the number of structs....that's approximately how
much memory total you'll be allocating (not all in one chunk though). (Depending on
how the string allocations are made, there may be some overhead in each allocation
so the total will actually be more)
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
jonsey29847 wrote: Is my math correct?
Nope!
sizeof(TCHAR *) will be 4 on a 32 bit system - it's just a pointer. The size of the chunk of ram it points to is a separate issue.
It's like saying a postcard is reeeeally heavy, because you've written the address of your friend's house on it.
CPallini already did the sums for me, and he says the size is 20 - so each of the five variables takes 4 bytes. (And he'll pick on me for using 40 again...)
On another point... If you're making a structure containing pointers, then it's good to have a constructor to initialise them to NULL, and a destructor to delete the strings too (if not NULL!).
If the TCHAR *'s point to a fixed string length, then you may want to just put that inline in the struct.
eg:
struct DTC {
TCHAR Code [6];
...
};
etc.
You may have noticed I used delete [] to tidy up - that will call the destructor on each struct in the array if it exists.
Yet another thing - the sizeof the string pointed to by the TCHAR * may depend on whether you have unicode enabled or not. TCHAR = 2 bytes in unicode.
Iain.
Iain Clarke appearing in spite of being begged not to by CPallini.
|
|
|
|
|
Iain,
I am a little confused on how this is done, when I try this in my compiler I get tons, yes tons, of errors, the primary error is redefinition of DTCodes.
struct DTC{<br />
TCHAR *Code;<br />
TCHAR *Description;<br />
TCHAR *Defined;<br />
int nDefined;<br />
int nIndex;<br />
};<br />
<br />
DTC *DTCodes = new DTCodes [0x4000];<br />
I also tried this way:
<br />
struct DTC{<br />
TCHAR *Code;<br />
TCHAR *Description;<br />
TCHAR *Defined;<br />
int nDefined;<br />
int nIndex;<br />
}DTCodes;<br />
<br />
DTC *DTCodes = new DTCodes [0x4000];<br />
What am I doing wrong?
Tom
|
|
|
|
|
jonsey29847 wrote: DTC *DTCodes = new DTCodes [0x4000];
should be
DTC *DTCodes = new DTC[0x4000];
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
OK, I think part of my problem is I am getting an Undeclared Identifier new error, new.h is not in my include subdirectory .
|
|
|
|
|
Is this C or C++ code?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I assumed (oops) it was C++ but no its C.
|
|
|
|
|
There's no "new" in C You can use malloc()/free() though.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Yes indeed there is no new. Tonight I will try malloc()/free().
Thanks
|
|
|
|
|
Hi,
I have an MSAccess DB in which there are two tables (Login_Details and Account_Details). I have created as SDI app.The view is associated with Account_Details table. I added another dialog for logging in. When user enters login name and password, I am able to validate the same with back end DB. After popping up the message box login successful, the form with Account details should come. But I am getting a popup "Data Source name not found and default driver not specified" and then it is showing the form with controls but no data displayed in the form.
Please let me know how to solve this..I mean how to display data in the form after login is successful?
Thanks & Regards,
VjaSai
modified on Wednesday, February 27, 2008 10:12 AM
|
|
|
|
|
Have you tried removing the dialog, and related code, that asks for login name and password? Isolate the problem rather than try to debug with a bunch of stuff mixed together.
As an aside, you might start with a plain SDI application that is hooked to the Account_Details table. Once you get that displaying properly, migrate the login stuff back in.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Hi all
can any body tell me how to get the start->documents->"*.*" files in our system
Thanks&&Regards
#sanroop#
|
|
|
|
|
Use SHGetSpecialFolderPath() .
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Hi Experts,
How can I write unicode string with WriteFile(). Or I have to use another function .
|
|
|
|