| |
 | Posted by Regan Heath in reply to aelmetwaly | Permalink Reply |
|
Regan Heath 
Posted in reply to aelmetwaly
| On Mon, 20 Sep 2004 21:37:33 +0300, aelmetwaly <aelmetwaly@gawab.com> wrote:
> // Questions
> Hi there,
> Please I need advice on the following subjects:
>
> 1- Some macro #defines are deficult to implement on D. eg.:
> #define rvaDLLName szName
> don't tell me to do a global search and replace! the code is generic and
> need to still generic
Can't you use 'alias' or typedef eg.
alias szName rvaDLLName;
typedef szName rvaDLLName;
> 2- How I can implement template functions in D. eg.:
> in C++:
> template <class T> void DumpOptionalHeader(T* pImageOptionalHeader);
> I converted it to:
> template DumpOptionalHeader(T = IMAGE_OPTIONAL_HEADER32) {
> void DumpOptionalHeader(T* pImageOptionalHeader) // 'T' is
> IMAGE_OPTIONAL_HEADER32/64
> { ... } }
> Is this right? or is there any beter way?
That looks right, tho I wish there was a slightly shorter way to do it, something like:
template(T = IMAGE_OPTIONAL_HEADER32) DumpOptionalHeader(T* pImageOptionalHeader) {
}
basically if the template only contains 1 function we shouldn't need to repeat the template/function name, and the {} for the template aren't really necessary either.
This may be ambiguous to parse however, only Walter could say for sure.
> 3- The following code compile in C++ but not in D and compiler give outside
> array bounds error. why?
> in C++:
> typedef struct DATASYM32 {
> unsigned short reclen; // Record length
> unsigned short rectyp; // S_LDATA32, S_GDATA32 or S_PUB32
> CV_uoff32_t off;
> unsigned short seg;
> CV_typ_t typind; // Type index
> unsigned char name[1]; // Length-prefixed name
> } DATASYM32;
> typedef DATASYM32 PUBSYM32;
>
> PCSTR pszUndecoratedName = (PCSTR)&pDataSym32->name[1]; // < == NOTE this
So it looks to me like the string resides in the memory after the "unsigned char name[1]" array, which itself simply holds the length of the string?
> I converted it to but the markered array line give outside array bounds
> error [0..1]
> struct DATASYM32 {
> ushort reclen; // Record length
> ushort rectyp; // S_LDATA32, S_GDATA32 or S_PUB32
> CV_uoff32_t off;
> ushort seg;
> CV_typ_t typind; // Type index
> ubyte name[2]; // Length-prefixed name // originally, it was
> name[1] but the code below
> // gives outside of array bounds error although it compiles wright
> in C++. ??!!!
> } ;
> alias DATASYM32 PUBSYM32;
>
>
> PCSTR pszUndecoratedName = cast(PCSTR)&pDataSym32.name[1];
In order to stop D doing bounds checking you have to either:
1. compile using -release.
2. stop using an array.
#1 will likely solve the problem right now, but you'll never be able to do a debug build again, so #2 is IMO the better solution, try this...
struct DATASYM32 {
ushort reclen;
ushort rectyp;
CV_uoff32_t off;
ushort seg;
CV_typ_t typind;
ubyte name;
}
alias DATASYM32 PUBSYM32;
PCSTR pszUndecoratedName = cast(PCSTR)(&pDataSym32.name + ubyte.sizeof);
I think that is correct. Someone will no doubt correct me if I am wrong.
> 4- about primitive types in C++ is:
> unsigned long => ulong or uint ?
> and other types, and it's equivelent in d ?
See
http://www.digitalmars.com/d/type.html
> 5- Is there any documentation or references about OMF lib format on the
> internet. maybe I can relate the data
> structures with the new Microsoft COFF archive format!
I have no idea :)
Regards,
Regan
--
Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/
|