|
I was reading the previous thread and I think the problem you are having is understanding the difference between storing the values and using the values.
Richard showed you how to pack the three binary values into a single integer:
int Answer = (u << 2) | (p << 1) | q
That is for storing them. Don't worry about the actual value of Answer. When you need to use the binary values, you have to unpack them. There are different ways to do it, but I think this method is the easiest way for you to understand it:
q = Answer & 1;
p = (Answer >> 1) & 1;
u = (Answer >> 2) & 1;
Soren Madsen
"When you don't know what you're doing it's best to do it quickly" - Jase #DuckDynasty
|
|
|
|
|
There are so many things wrong with this piec of code, I suggest you go back to your reference manual and read about types, variables and functions. And work through a lot of the samples.
Use the best guess
|
|
|
|
|
I got this error message when I debug:
Unhandled exception at 0x77a915de in MSW_Vib_Model.exe: 0x00000000: The operation completed successfully.
from these code segments:
//
ifl=0;
do {
{
//
fscanf_s(f_ptr_seed_inf,"%lf %lf %s\n",&sd_dis[ifl],&time_onset[ifl], ftitle[ifl].GetBuffer(MAX_PATH));
ftitle[ifl].ReleaseBuffer();
}
ifl += 1;
} while (!feof(f_ptr_seed_inf)&&(ifl<120));
nfile=ifl;
//
This is my input file:
4171.000 0.28600 ECO61_4171_Hole1_seeds.txt
4157.000 0.24600 ECO61_4157_Hole2_seeds.txt
Please help me.
|
|
|
|
|
The problem is readying the string with fscanf_s .
If you replace fscanf_s with fscanf , you will notice that it works without errors.
The _s (secure) versions of the C-Runtime requires that the size of the buffer be known and this is validated by the function.
So you need to pass in the size of the string as an argument following the actual string buffer as shown -
fscanf_s(f_ptr_seed_inf,"%lf %lf %s\n",&sd_dis[ifl],&time_onset[ifl], ftitle[ifl].GetBuffer(MAX_PATH), MAX_PATH);
Here is an excerpt from the documentation for scanf_s -
Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size to be specified for all input parameters of type c, C, s, S, or string control sets that are enclosed in []. The buffer size in characters is passed as an additional parameter immediately following the pointer to the buffer or variable. For example, if you are reading a string, the buffer size for that string is passed as follows:
char s[10];
scanf_s("%9s", s, _countof(s)); // buffer size is 10, width specification is 9
|
|
|
|
|
Hi All,
I have a BOOST test case as below
BOOST_AUTO_TEST_CASE( BoostUnitTestSample )
{
// seven ways to detect and report the same error:
BOOST_CHECK( add( 2,2 ) == 4 ); // #1 continues on error
BOOST_REQUIRE( add( 2,2 ) == 4 ); // #2 throws on error
somefunction_whichleaksmemory();----------->memory leak function.
if( add( 2,2 ) != 4 )
BOOST_ERROR( "Ouch..." ); // #3 continues on error
}
I want to programmatically detect the memory leak in function somefunction_whichleaks() and get information like line number and filename where the leaked occurred.
And most importantly I should know in which test case this leaked occured.May be I would like to have a dump of all this information in some file.
Does anybody knows a solution to this?
|
|
|
|
|
If you're using MFC, add this snippet above your code:
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
Your memory leaks will then appear in the output window.
Note that it doesn't work correctly with overloaded new constructors, so for those you may need some $ifdef guards.
|
|
|
|
|
I am not able to understand the output of below lines.
As per my understanding output should be 8 because we are subtracting int address which is having 8 byte diffrence but output is coming 2. Please expalin.
int a[]={5,10,15,20};
int d = &a[2]-&a[0];
|
|
|
|
|
|
See this;
&a[2] - &a[0]
(a + 2) - (a + 0)
a + 2 - a - 0
2 - 0
2
the above is true because use pointers you will always get the difference of elements
You talk about Being HUMAN. I have it in my name
AnsHUMAN
|
|
|
|
|
_AnsHUMAN_ wrote: a + 2 - a - 0
2 - 0 While your end result is correct, shouldn't that be:
a + 2 - a + 0
2 + 0
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Show me a community that obeys the Ten Commandments and I'll show you a less crowded prison system." - Anonymous
|
|
|
|
|
If the address of (the first item in) a is, for example, 0x1000 and each item in a is 4 bytes, then the difference between the third item (0x1008) and the first item would be 8 divided by the size of an int (most likely 4), thus 2 would be the output.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Show me a community that obeys the Ten Commandments and I'll show you a less crowded prison system." - Anonymous
|
|
|
|
|
You are correct, the differene in the addresses is 8. I can only assume the compiler is dividing that by the type of dm which being an int, makes the result 2.
Did you try it with char d = &a[2] - &a[0] ?
It wold be interesting.
IMO the compiler shouldnt do this, it is unexpected. I would expect to get 8 back, after all, that is the difference in the pointers.
==============================
Nothing to say.
|
|
|
|
|
Erudite_Eric wrote: IMO the compiler shouldnt do this, it is unexpected.
Quite the opposite, the compilers must do that, because it is a C programming language rule (you may find it, for instance, in the B&K book).
Veni, vidi, vici.
|
|
|
|
|
Erudite_Eric wrote: You are correct, the differene in the addresses is 8. On the contrary he is totally wrong. The difference is the count of elements in the array, between the first and last item. This is C language, not machine code, as designed by Kernighan & Ritchie.
Use the best guess
|
|
|
|
|
What happens if you do the following?
int d = ((void*)&a[2])-((void*)&a[0]);
|
|
|
|
|
You can subtract two pointers of the same base type, and the result is the number of elements of the base type that fit between the addresses which the pointers hold. Likewise, you can add an integer value to a pointer, and that will result in the address of a data type instance so and so many steps above the original pointer.
Confusing? - Take your example:
int a[]={5,10,15,20};
Assume a starts at address 0x00040000. This is also the address of a[0] . In C, a is the same as &a[0] . a+1 is &a[1] or 0x00040004, and a+2 is &a[2] or 0x00040008.
&a[2]-2 is &a[0] or 0x00040000.
When x-y==z is true, then x-z==y should also be true; when &a[2]-2==&a[0] is true, then &a[2]-&a[0]==2 should also be true. The C language is nice enough to fulfil this.
To calculate the number of bytes between two memory locations, convert the pointers to BYTE* like this:
(BYTE*)&a[2]-(BYTE*)&a[0]
This would evaluate to 8, as you expected. Assuming, of course, that 'int' is a 32-bit integer type.
|
|
|
|
|
Hi,
i am not able to get Date value from ADSI directory
VARIANT var;
hr = ADsOpenObject(path,NULL,NULL,0, IID_IADsUser, id**)&pUsr);
HRESULT h1= pUsr->Get(L"pwdLastSet", &var);
INT8 bb=var.date;
This code is not working pwdLastSet type is integer8 .it stores date value how can i get date value from adsi with c++ code please help anyone
|
|
|
|
|
Check your return codes to see if any function calls have failed and find out why. Single stepping through your code with the debugger should quickly show what is happening.
Use the best guess
|
|
|
|
|
Hi Richard,
Thanks for reply .The method is return success var.date value returns 2.613867737909e-316#DEN .
i am not able to understand this value.
|
|
|
|
|
What does the documentation say about the format of this value? Your original sample code stated that it is an INT8 , but you are displaying it as (a very small) floating point number.
Use the best guess
|
|
|
|
|
hello Friends
I am accessing USB Devices through SetupDiCalls. I am able to get USb printers'Device Path to communicate with them and its working fine. I want to know that How can I access their name also using SetuDiCalls so that I can differentiate between USB Printer Devices to with whom I have to communicate.
I tried EnumPrinters to get Printers name but that doesn't provide device Path for which we needed to pass to createFile fn for communication with USB Printer. And Nothing else I found common between ENumprinter returns or setupDicalls so that I will access from their.
Any Ideas ?
Thanks & Regards
Y
|
|
|
|
|
When already using Setup API functions, call one that accepts a pointer to a SP_DEVINFO_DATA structure (e.g. SetupDiGetDeviceInterfaceDetail() or SetupDiEnumDeviceInfo() ). Then call SetupDiGetDeviceRegistryProperty() passing the structure to get the SPDRP_FRIENDLYNAME property which contains the name as shown by Windows. If that fails, you can fallback to get the SPDRP_DEVICEDESC property.
|
|
|
|
|
Thanks For your Reply.
I tried Friendlyname,it is returning NULL. then I tried DeviceDesc , it is returning
"USB PRINTING SUPPORT " for each USB connected Printer.
I tried by passing SPDRP_MFG even, it is returning Microsoft.
Any other way to get name so, I can differentiate.
Thanks & Regards
Y
|
|
|
|
|
It seems that you have enumerated the generic Microsoft USB printing support devices. You should look up the specific printers instead which usually provide a friendly name. If that did not provide the device path, you must perform two enumerations and compare common data (e.g. the hardware ID).
|
|
|
|
|
Ahh, But I used Class ID
#define CLSID_STR_WEIUSB (L"{28D78FAD-5A12-11D1-AE5B-0000F803A8C2}") to get List of USB Printer Devices.
I tried one another too #define CLSID_STR_WEIUSB1 (L"{A5DCBF10-6530-11D2-901F-00C04FB951ED}")
but this one was not showing some of printers while Enumerating.
Give me some Idea.How can I look up specific printers only and their Friendlynames?
Regards
Y
|
|
|
|