|
Because a static variable, even when declared in side a func, is created in the DATA section of a programs run space. Think of it like a global static variable that gets initialised to zero and whose value is of course persistent.
An ordinary variable declared inside a func is created on the stack. This of course winds back and forwards so when the func returns the space that variable used is lost to the next func you call.
|
|
|
|
|
|
Stackoverflow? The competition? Are you mad?
|
|
|
|
|
Please read that. carefully. ok..
|
|
|
|
|
Why? Are you saying I am wrong?
|
|
|
|
|
I am in over my head again.
I am getting error C2664 and I did read the Tech note ( something about ANSI improvement) about it and frankly I just do not understand what is the problem and <b>how to fix it in VC6.0.</b>
Do I have to redefine the GUID_DEVCLASS_COMPUTER?
The parameter GUID is defined in both functions as “const GUID*”
The API fails with this error C2664 and C_GetClassImgIndex compiles OK
error C2664: 'SetupDiGetClassImageIndex' : cannot convert parameter 2 from 'const struct _GUID *' to 'struct _GUID *'
Conversion loses qualifiers
Fails
b = SetupDiGetClassImageIndex(&m_imgList, &GUID_DEVCLASS_COMPUTER, &nRootImg);
OK
int n = C_GetClassImgIndex(&GUID_DEVCLASS_COMPUTER);
Any help would be greatly appreciated.
Cheers
Vaclav
|
|
|
|
|
Vaclav_Sal wrote: The API fails with this error C2664 You are not using the API, this is a compiler error.
Vaclav_Sal wrote: cannot convert parameter 2 from 'const struct _GUID *' to 'struct _GUID *' You are passing a const parameter to a function that does not expect one. Use const_cast [^] to remove it. But be sure you understand the potential consequences.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
Richard ,
I do not follow your explanation.
In this MSDN doc the second parameter is defined as const GUID*.
Am I using wrong version ot the Setupapi.h?
PS Did you read the title? I did say compiler error.I do appreciate your help, but growing little tired of your sideline remarks,that's all.
http://msdn.microsoft.com/en-us/library/windows/hardware/ff551074(v=vs.85).aspx
BOOL SetupDiGetClassImageIndex(
_In_ PSP_CLASSIMAGELIST_DATA ClassImageListData,
_In_ const GUID *ClassGuid,
_Out_ PINT ImageIndex
);
|
|
|
|
|
Vaclav_Sal wrote: _In_ const GUID *ClassGuid,
The pointer is a constant, not the structure.
|
|
|
|
|
Oh come on man, it is the C language. If the compiler bitches just cast it out. YOU are in control. YO are the master!
|
|
|
|
|
Have you tried something like this:
GUID tmp(GUID_DEVCLASS_COMPUTER);
b = SetupDiGetClassImageIndex(&m_imgList, &tmp, &nRootImg);
|
|
|
|
|
Hi,
I tried to port the fork API in Linux to Windows (Windows 7 and Windows 8) using the native API RtlCloneUserProcess as discussed in the following link.
http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/afdf1b68-1f3e-47f5-94cf-51e397afe073/
With the RtlCloneUserProcess function, child process is created, but didn’t get the console handle, stdin, stdout etc. The solution is to inform the CSR /win32 subsystem about the new process. But I could not able to do that. Please help me to re link the child process to the CSR.
|
|
|
|
|
How do you declare a TBYTE in C and declare a pointer to a location to be used as a TBYTE? I know how to do it in MASM, but how do you do it in C?
Dave.
|
|
|
|
|
This should help you:
typedef unsigned char tbyte[10];
int main()
{
tbyte a;
a[0] = 3;
return 0;
}
The drawback is it doesn't initialize the array for you.
My 2 cents: Please don't mix different languages' idioms. Each language is meant for a different purpose.
If you need to, you can easily use assembly. VC++ supports inline assembly. Otherwise, you can write a separate asm file and then link the resulting object file to your exe.
|
|
|
|
|
manoranjan,
I didn't think about using a typedef. I understand how to use in-line assembly, but without the typedef, trying to do
fld tbyte ptr var
fails.
Thank you for the answer.
I have re-written ENT in MASM to try to speed it up for huge files. I first modified ENT to handle the huge files, but it was terribly slow (for my 16 GB file). It took 32 minutes to process. I have cut that down to 10 minutes with my entmasm, and I am trying to validate the calculations by using printf statements in both to display all of the calculation inputs and outputs (for a VERY SHORT 10 BYTE file), but in the entropy calculations, the results do not quite match. The C compiler (visual Studio 2008) is optimizing the code and keeps most of the intermediate results on the FPU stack in temporary real format. My masm code was pretty brutal and kept each calculation separate, saving results in memory. I was using doubles (real8) for storage, and I think that the loss of precision when saving an FPU value as a real8 is what caused the result differences. I will convert my masm code to use tbytes and modify the ENT C code to do the same, and see if that makes the results match.
One other question. ENT has several 256 entry arrays for the counts and probabilities. If I change these arrays of 256 tbytes (10 BYTES each), will the mod 16 mis-alighment cause performance problems? Would it be better to make them arrays of owords (16 BYTES) and just index by 16 instead of by 10? I am not worried about the extra memory, I have GIGA BYTES of unused memory.
Dave.
|
|
|
|
|
Yes, misalignments cause performance issues on x86 (and seg fault on ARM processors).
Speaking of performance... also consider fitting your data structure (by padding) in a CPU Cache Line. This should also improve performance.
Finally, a (stupid?) question from me: What is ENT?
|
|
|
|
|
manoranjan,
I have already implemented the DQWORD arrays for my MASM version, and am adding printf statements of intermediate calculations. The change to use TBYTES did fix the differences I had seen in the calculated ENT value between the C version and my MASM version. This was not as simple as it looked to be at first. The only FPU instructions than can use TBYTES are FLD and FST. You cannot use FADD TBYTE PTR [i], but I can see where the xxxP FPU instructions come from:
fld val1
fadd val2
fdiv val3
This had to be changed to:
fld val1
fld val2
faddp
fld val3
fdivp
It turns out that this is exactly what the FPU needs to do for an faddd val - it must push the stack, load the double/float/integer into st0 and convert it to temporary real, then add/sub/mul/div ST(1) by ST(0) and put the result into ST(1), then pop the stack leaving the result in ST(0). With TBYTES you just have to do it manually, - BUT - The FPU doesn't have to do any conversions - the TBYTE is already in temporary real format and can contain a signed QWORD (63 bits, + sign). Unfortunately, the FPU cannot handle unsigned 64 bit values (they end up as negative values).
See here for ENT: [^]
The biggest improvement I got was changing from fgetc for each character to reading 65536 bytes into a buffer (with no system buffering) and indexing through the BYTES, then reading more from the file into the buffer and processing. Another interesting change was to fill the buffer, initialize one time for the FIRST character, then skip to process the characters, skipping around the subsequent re-fill buffer entry point. So little extra code, BUT, avoided checking if this was the first character 16 billion times as was done in ENT. Another speedup was to fragment the character occurrence buffer - I had to grow the collection bins to a QWORD for supporting a max file (2^63 BYTES), but in the BIT mode this increased the count to 2^66. I had to accumulate the counts in three DWORDS in a DQWORD, using "add value, adc 0, adc 0," but this occurred (in my 16 GB test) 16 billion times. With a smaller buffer that could contain the counts in a DWORD, it was just an "add value" for the buffer count, then 256 iterations of "add value, adc 0, adc 0," to accumulate the 256 occurrence values in the DQWORD array and clear the DWORD counts between buffer fills. Also for checking whether a bin had any count at all (several places in ENT checked this), I accumulated (at the end of the file processing) the 3 DWORDS for each entry into the fourth DWORD that could be tested with a single instruction.
But I digress from a simple C question into something more appropriate for Algorithms.
Dave
|
|
|
|
|
Thank you for sharing your experiences. Your project seems to be quite interesting!
Good luck
|
|
|
|
|
Hello Im currently doing a project in Visual Studio 2010 where I need to create a bank account with 5 tabs. on the first tab the user is to put their info in (name addres etc) and the balance they wish to deposit. The deposit cant be a negative number and the starting deposit "will be passed to the createAccount method" as stated in project outline. Im really lost in this class and dont know exactly how to do this. Im guessing it needs to have a method created for it because the balance can be adjusted with the withdrawls and deposits that can be made after the account is created and the deposits and withdrawls also need a method because the with draw will reduce the users balance in the "accountInto array" Im really really lost and if anyone can give me any guidance I would appreciate it!
|
|
|
|
|
Magda6347 wrote: Im really really lost You seem to be starting at the wrong place for this question. Start by thinking about what information you need to maintain in your class and what operations you need to perform during its lifetime. Take a look at this documentation[^], or if you have a decent reference manual handy, go to the classes section in there.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
A good place to start is with the user interface. Just use the designer to add and position the controls where you want them. This is an easy step, but it clarifies what you need to do next.
The second step is to define handlers for the controls, e.g. a function that's called when the user clicks a button.
The third step is to define the variables to maintain the information your program will need, as Richard has suggested.
The next step is to implement the functions that process this information to give the desired results.
"Microsoft -- Adding unnecessary complexity to your work since 1987!"
|
|
|
|
|
You are so helplessly lost. You really need to start from basics and ask a specific TECHNICAL question, not some vague 'help me do my project for me' type question.
You want 'bank account method' help? Tell me, where is 'bank account' on a VS menu? DOes it exist? Do you want VS to think for you?
Here is some advise. Either give up programming or go back to square one and think, think REALLY carefully about what you want to achieve. Then come back and ask a question when you have one that is fully formed. (Oh, and when you have got a question FULLY formed that is worthy of asking, it will suggest its own solution.)
Sorry for being such a c*^t, but I am an arrogant bastard who has been programming all kind of complex stuff for so long I can not bear the ignorance that laziness brings.
|
|
|
|
|
No need to apologize I pity people like you who waste energy on trying to degrade people rather than help them.
|
|
|
|
|
I want to read text file into edit boxses
e.g 10 string present in a text file. I have 10 edit boxes on dialog. how i can read that 10 string into edit box?
Thanks.
|
|
|
|
|