|
So you don't want to use the standard C library with your program.
Than you have to implement all necessary functionality provided by that library and required by your application yourself. The common method to do such things is to place such functions in a library to be re-used by other projects. As a result, you will have your own standard C library (or a sub set) when using the same function declarations (which makes sense). The LIBCTINY mentioned in your article link is such an implementation.
The StringCch... functions mentioned above are just MS specific extensions to the standard library providing safe and ANSI/Unicode operations. If you have a look at StrSafe.h where they are defined, you will notice that they use the standard C library functions. So you have to implement the used functions when not using the default library.
You may search further for some Windows API function that can perform a required operation. The FormatMessage function (Windows)[^] is a candidate but did not support floating point values. However, it allows passing a pre-formatted floating point argument as string. So it may be sufficient to have a function that converts a floating point number to a string.
As far as I know the Windows API did not provide such a function. I guess there is an internal / undocumented one. But that might not be available.
So the solution is to write your own. As starting point you may have a look at some C standard library source. Candidates are for example The GNU C Library[^] and diet libc - a libc optimized for small size[^].
Finally you should know that your program will use a special standard library version when calling Windows API functions because the OS contains it's own implementations of required functions.
|
|
|
|
|
Thanks for the thoughtful responses Jochen and Richard. Much appreciated.
Here's where I'm at. Just got Raymond Filiatreault's fpulib working for me from www.masm32.com. Its part of the masm32 install. Really nice. So next my intent is to write a C prototype for the function I need and either link against the *.obj or even the lib.
However, I'm some disappointed at this point. I was really hoping to solve my 64 bit bloat issues with all this, but Raymond Filiatreault's fpu lib is 32 bit.
By the way, it was easy to get Matt Pietrek's LibCTiny.lib working in x64; just a tweak here and there.
But while it would be satisfying to get all my stuff working in 32 bit, I really want 64 bit. Would either of you guys know of a 64 bit fpu lib available anywhere? As you mentioned Jochen, maybe I ought to check out the GCC sources.
As an aside, looking at Microsoft's printf.c and _output.c code gets into some pretty ugly stuff. There's an array of function pointers like so...
_cfltcvt
...and some other undocumented functions involved in the floating point conversions.
But I'm tickled at the size reductions I've achieved. A simple "Hello, World!" with my string class is around 70 k with VC 9 from VS 2008, /MT build. With the C++ Std. Lib's string class we're at around 92 k. With my String Class and LibCTiny plus a half dozen additions to it I had to make, I'm only at like 6 K!!!!!
|
|
|
|
|
I don't see the relation between 64 bit and basic floating point operations (regardless if implemented by emulation, FPU, or vector instructions) when using a C compiler.
Functions like _fcvt[^], ecvt , and gcvt are part of the standard library and usually call sprintf so that they are not helpful (at least the GLIBC does that).
|
|
|
|
|
[QUOTE]
I don't see the relation between 64 bit and basic floating point operations (regardless if implemented by emulation, FPU, or vector instructions) when using a C compiler.
[/QUOTE]
Well, perhaps I'm laboring under false knowledge. I have a 32 bit masm created FPU lib, i.e., fpulib.lib, which has within it the function I need, e.g., ...
FpuFLtoA(...)
...which returns through an out parameter my floating point number converted to a Z string. I can't link that 32 bit library into 64 bit code can I? I just assummed not, because of the fact 32 bit dlls can't be directly used by 64 bit binaries.
And thanks again for the information on those various functions deep in the internals of printf. I hadn't looked into that end of it deep enough to determine where they were implemented, but what you told me closes that possibility, apparently.
Where I'm at now is if I'm to use your links to download the GCC sources I apparently have to install and learn to use git. Years ago I worked with Linux some but never became terribly proficient in that world. Never could find anything comparable to the Windows Api for writing GUI apps. About the closest thing I could find that I could marginally tolerate was GTK. I liked XLib but it wasn't suitable for creating GUI apps (no controls (widgets). But unless you tell me I can link 32 bit libraries into 64 bit executables, or somehow I can come up with a 64 bit FPU lib (if I need it), I see studying the GCC sources as my only hope?
|
|
|
|
|
You can't off course link a 32-bit library to a 64-bit application. You have to build your own 64-bit library using a 64-bit assembler. But the assembly code should be quite identical (besides the register names / width) because the FPU commands does not depend on 32/64 bit.
Alternatively you can try to port the assembler code to C.
You can download the GLIBC sources also as tar ball: Index of /gnu/glibc[^] which can be extracted on Windows with 7-Zip[^].
But be aware that finding the code used by the printf functions to format floating point might took some time (there will be calls to other functions located in other files and various macros). Maybe diet libc - a libc optimized for small size[^] is an alternative option.
Note also that the above may use assembler code too.
A quick check with my GLIBC sources show that a starting point might be the file stdio-common/printf_fp.c.
|
|
|
|
|
Thanks Jochen! I'm making progress. Put in a brutal day yesterday and got that asm code working for me in both asm and VC9 C++. Lost some hide but finally got it to work. Here's some of my by now dried blood...
Uggh. Don't know how to do links here.
What you said above about there not being much change in the fpu unit between the various processors makes sense and I'm heartened by it. It also says that in the fpu tutorials at masm32.com I have the asm source for the code that is doing what I need. Perhaps I could get myself a 64 bit assembler and reassemble it. But at this point I'm making progress and today hopefully will be able to incorporeate my newly working float routine into my string class code.
If I can't then I'll tackle the GCC sources. I appreciate your pointing me in that direction and providing the links and info.
|
|
|
|
|
Fine to heat that you got some kind of success.
To post a link just copy it to the clipboard, insert in the CP editor, and wait a short time. It will be inserted as link with the title of the page as pre-selected link text (so it can be edited).
|
|
|
|
|
Frederick J. Harris wrote: a Win32 function which can be used to convert a floating point number into a provided character string buffer How would that help, since it will use the C runtime under the covers. If you do not wish to use the standard library then you will need to write your own function to do the work; and all the other pieces that would be needed. Remember, all string handling is done in the library, it's not part of the C language.
|
|
|
|
|
Good day. Please am writing an application, though things are going good. But am stucked in the area where l need to copy the text of what the user selected from a combo box and use that text to initialize the text field of the TC_ITEM struct to show on the tab control. l had tried many tactics. Code snippet below:
static WCHAR subject1tab[MAX_LOADSTRING];
INITCOMMONCONTROLSEX icce = {0};
TC_ITEM tie={0};
icce.dwICC=ICC_TAB_CLASSES;
icce.dwSize=sizeof(INITCOMMONCONTROLSEX);
InitCommonControlsEx(&icce);
tie.mask = TCIF_TEXT;
subjecthwnd=GetDlgItem(hwnd,IDC_UNICALPTUME_SUBJECT1);
GetWindowText(subjecthwnd,subject1tab,100);
tie.pszText=subject1tab;
SendMessage(SubjectTabs,TCM_INSERTITEM,(WPARAM)0,(LPARAM)&tie);
So please can someone help me on how to get the text string of selection from a combobox and use it to initialize a tab.
Thanks in advance.
modified 27-Jan-16 15:09pm.
|
|
|
|
|
|
@blingg: TC_ITEM is same as TCITEM but according to MSDN, TCITEM supercedes TC_ITEM.
However, l have done the corrections, still it doesn't work. l also used SendMessage, still yet no avail. l don't know what's wrong.
|
|
|
|
|
Set tie.iImage to -1 and make sure SubjectTab is a valid tab control HWND.
|
|
|
|
|
You first need to check that you are actually retrieving some text from your control. Is this code inside the dialog that holds the combobox? You also need to set the text length in your TCITEM before sending the TCM_INSERTITEM message.
|
|
|
|
|
Member 12139442 wrote: So please can someone help me on how to get the text string of selection from a combobox and use it to initialize a tab. So which do you need help with? They are mutually exclusive things. If subject1tab contains the correct, expected value, then retrieving text from a combobox has nothing to do with your issue.
"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
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
I am trying to build XULRunner from sources, and I am getting a 'Too Many Initializers' error, and I have no idea why.
The code is as follows (Register is a struct):
static MOZ_CONSTEXPR_VAR Register CallTempNonArgRegs[] = { edi, eax, ebx, ecx, esi, edx };
the values in the array are defined earlier in the file (X86Encoding is a namespace, and the values are defined in an enum):
static MOZ_CONSTEXPR_VAR Register eax = { X86Encoding::rax };
static MOZ_CONSTEXPR_VAR Register ecx = { X86Encoding::rcx };
static MOZ_CONSTEXPR_VAR Register edx = { X86Encoding::rdx };
static MOZ_CONSTEXPR_VAR Register ebx = { X86Encoding::rbx };
static MOZ_CONSTEXPR_VAR Register esp = { X86Encoding::rsp };
static MOZ_CONSTEXPR_VAR Register ebp = { X86Encoding::rbp };
static MOZ_CONSTEXPR_VAR Register esi = { X86Encoding::rsi };
static MOZ_CONSTEXPR_VAR Register edi = { X86Encoding::rdi };
The Register struct is defined as follows:
struct Register {
typedef Registers Codes;
typedef Codes::Encoding Encoding;
typedef Codes::Code Code;
typedef Codes::SetType SetType;
Codes::Encoding reg_;
static Register FromCode(Code i) {
MOZ_ASSERT(i < Registers::Total);
Register r = { Encoding(i) };
return r;
}
static Register FromName(const char* name) {
Code code = Registers::FromName(name);
Register r = { Encoding(code) };
return r;
}
MOZ_CONSTEXPR Code code() const {
return Code(reg_);
}
Encoding encoding() const {
MOZ_ASSERT(Code(reg_) < Registers::Total);
return reg_;
}
const char* name() const {
return Registers::GetName(code());
}
bool operator ==(Register other) const {
return reg_ == other.reg_;
}
bool operator !=(Register other) const {
return reg_ != other.reg_;
}
bool volatile_() const {
return !!((SetType(1) << code()) & Registers::VolatileMask);
}
bool aliases(const Register& other) const {
return reg_ == other.reg_;
}
uint32_t numAliased() const {
return 1;
}
void aliased(uint32_t aliasIdx, Register* ret) const {
MOZ_ASSERT(aliasIdx == 0);
*ret = *this;
}
SetType alignedOrDominatedAliasedSet() const {
return SetType(1) << code();
}
static uint32_t SetSize(SetType x) {
return Codes::SetSize(x);
}
static uint32_t FirstBit(SetType x) {
return Codes::FirstBit(x);
}
static uint32_t LastBit(SetType x) {
return Codes::LastBit(x);
}
};
I am using Visual Studio 2015/MSV14 Update 1.
This build is for x86, but it does the same thing for a x64 build (this code is shared for both architectures)
What do you get when you cross a joke with a rhetorical question?
The metaphorical solid rear-end expulsions have impacted the metaphorical motorized bladed rotating air movement mechanism.
Do questions with multiple question marks annoy you???
|
|
|
|
|
Brisingr Aerowing wrote: static MOZ_CONSTEXPR_VAR Register CallTempNonArgRegs[] = { edi, eax, ebx, ecx, esi, edx }; What about:
static MOZ_CONSTEXPR_VAR Register CallTempNonArgRegs[6] = { edi, eax, ebx, ecx, esi, edx };
"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
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Same error. I even tried larger numbers with the same result.
What do you get when you cross a joke with a rhetorical question?
The metaphorical solid rear-end expulsions have impacted the metaphorical motorized bladed rotating air movement mechanism.
Do questions with multiple question marks annoy you???
|
|
|
|
|
|
I found this bug report[^], and it turns out that this is a VS2015u1 compiler bug.
What do you get when you cross a joke with a rhetorical question?
The metaphorical solid rear-end expulsions have impacted the metaphorical motorized bladed rotating air movement mechanism.
Do questions with multiple question marks annoy you???
|
|
|
|
|
Just ran into something I thought was odd today, if you had the following
namespace A
{
enum Things
{
Apple,
Orange,
HamSandwich,
RocketPoweredElephant
};
void Function(Things thing)
{
}
}
namespace B
{
void Function(A::Things thing)
{
}
void Ambiguous()
{
Function(A::Orange); }
}
void main()
{
Function(A::Orange); }
Because one of the parameters is type contained within namespace A, A::Function is being brought into scope, causing an error for the function Ambiguous .
Is this part of the spec or is it some compiler (VS2012) jiggery pokery?
|
|
|
|
|
I assume it's part of the spec, based on the following error messages:
AConsole.cpp
1>c:\users\richard\documents\visual studio 2010\projects.c++\aconsole\aconsole\aconsole.cpp(98): error C2668: 'B::Function' : ambiguous call to overloaded function
1> c:\users\richard\documents\visual studio 2010\projects.c++\aconsole\aconsole\aconsole.cpp(91): could be 'void B::Function(A::Things)'
1> c:\users\richard\documents\visual studio 2010\projects.c++\aconsole\aconsole\aconsole.cpp(83): or 'void A::Function(A::Things)' [found using argument-dependent lookup]
1> while trying to match the argument list '(A::Things)'
|
|
|
|
|
It's Argument Dependent Lookup (ADL) also known as Koenig lookup. It's invaluable when you're trying to define operations on a type in a namespace using functions in that namespace. Say you have:
namespace N
{
class A
{};
friend A operator+( const A &, const A& );
}
A a, b;
auto c = a + b;
if the compiler didn't know to look for the operator in the namespace A was declared in you wouldn't be able to use operator functions in namespaces that easily. It would be a particular headache for <, << and >> which are required by chunks of the standard library.
|
|
|
|
|
Super. I've probably got operator functions around that work because of this, I've just never noticed or thought about it before.
|
|
|
|
|
Hi, I have two processes running on a system. One process is of socket based connection type and another process is of a serial based connection type. Here the requirement is the information provided by one process should be sent across to another process based on which it will perform some action.
Could anyone please let me know a suitable solution for this in vc++ and if any example project for the same. Thanks in advance.
|
|
|
|
|
Examples of IPC include:
Sockets
Clipboard
COM
Pipes
Data Copy
"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
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|