Accessing an integer value in class constructor is causing failed assertion (Real Studio Plugins Mailinglist archive)

Back to the thread list
Previous thread: vsprintf crashes in Mach-O
Next thread: REALbasic font handling - System to Vista font and such


macosx and unix paths   -   GOLD
  Accessing an integer value in class constructor is causing failed assertion   -   Dave Addey
   Re: Accessing an integer value in class constructor is causing failed assertion   -   Marco Bambini
    Re: Accessing an integer value in class constructor is causing failed assertion   -   Dave Addey

Accessing an integer value in class constructor is causing failed assertion
Date: 21.04.06 08:37 (Fri, 21 Apr 2006 08:37:28 +0100)
From: Dave Addey

Hi all,

I¹m having an incredibly frustrating problem, which probably means I¹m doing
something stupid.

I have a class, HIDManager, which has the following data setup:

struct HIDManager_Data
{
Boolean Initialised;

#if TARGET_OS_WIN32

LPDIRECTINPUT8 myDirectInput8Object;
GUID* GUIDArray; // will store the array of current GUIDs
UInt32 NumberOfDevices;

#endif

};

typedef HIDManager_Data* HIDManager_DataRef;

...and the class has the following constructor:

static void HIDManager_Constructor (REALobject instance)
{

ClassData (HIDManager, instance, HIDManager_Data, me);
me->Initialised = false;

#if TARGET_OS_MAC

if (RebuildDeviceList(instance) == noErr) {
me->Initialised = true;
}

#elif TARGET_OS_WIN32

// blank the GUID list
me->GUIDArray = NULL;
// reset the count
me->NumberOfDevices = 0;

// create the DirectInput object
HRESULT osErr = DirectInput8Create(GetModuleHandle(NULL),
DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&me->myDirectInput8Object,
NULL);
if (osErr == noErr) {
me->Initialised = true;
CountDevices(instance);
RebuildDeviceList(instance);
}

#endif

}


What I am finding is that the ³me->NumberOfDevices = 0² line causes the
following error (for a Win32 app, built using this plugin and RB 2006r1 on
Mac OS X) when the built application quits:

Runtime Error 4: Failed Assertion
Dump.cpp: 111
Failure Condition: 0
Overwrote start of block

If I comment out this line, everything works fine without the failed
assertion.

Any idea what could be causing this? I can manipulate the Initialised and
GUIDArray values fine.

Thanks in advance for any help!

Dave.
_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>

Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>

Re: Accessing an integer value in class constructor is causing failed assertion
Date: 21.04.06 08:45 (Fri, 21 Apr 2006 09:45:07 +0200)
From: Marco Bambini
Have you tried to add padding at the end of your to your struct?
I am quite sure that class data must be on the same size both on
Windows and on Mac.

Maybe something like:

struct HIDManager_Data
{
Boolean Initialised;

#if TARGET_OS_WIN32

LPDIRECTINPUT8 myDirectInput8Object;
GUID* GUIDArray; // will store the array of
current GUIDs
UInt32 NumberOfDevices;

#elif

// assuming that LPDIRECTINPUT8 and GUID are 4 bytes each
char pad[12];

#endif

};

---
Marco Bambini
http://www.sqlabs.net
http://www.sqlabs.net/blog/


On Apr 21, 2006, at 9:37 AM, Dave Addey wrote:

>
> Hi all,
>
> I’m having an incredibly frustrating problem, which probably means
> I’m doing
> something stupid.
>
> I have a class, HIDManager, which has the following data setup:
>
> struct HIDManager_Data
> {
> Boolean Initialised;
>
> #if TARGET_OS_WIN32
>
> LPDIRECTINPUT8 myDirectInput8Object;
> GUID* GUIDArray; // will store the array of
> current GUIDs
> UInt32 NumberOfDevices;
>
> #endif
>
> };
>
> typedef HIDManager_Data* HIDManager_DataRef;
>
> ...and the class has the following constructor:
>
> static void HIDManager_Constructor (REALobject instance)
> {
>
> ClassData (HIDManager, instance, HIDManager_Data, me);
> me->Initialised = false;
>
> #if TARGET_OS_MAC
>
> if (RebuildDeviceList(instance) == noErr) {
> me->Initialised = true;
> }
>
> #elif TARGET_OS_WIN32
>
> // blank the GUID list
> me->GUIDArray = NULL;
> // reset the count
> me->NumberOfDevices = 0;
>
> // create the DirectInput object
> HRESULT osErr = DirectInput8Create(GetModuleHandle(NULL),
> DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&me-
> >myDirectInput8Object,
> NULL);
> if (osErr == noErr) {
> me->Initialised = true;
> CountDevices(instance);
> RebuildDeviceList(instance);
> }
>
> #endif
>
> }
>
> What I am finding is that the “me->NumberOfDevices = 0” line causes
> the
> following error (for a Win32 app, built using this plugin and RB
> 2006r1 on
> Mac OS X) when the built application quits:
>
> Runtime Error 4: Failed Assertion
> Dump.cpp: 111
> Failure Condition: 0
> Overwrote start of block
>
> If I comment out this line, everything works fine without the failed
> assertion.
>
> Any idea what could be causing this? I can manipulate the
> Initialised and
> GUIDArray values fine.
>
> Thanks in advance for any help!
>
> Dave.
> _______________________________________________
> Unsubscribe or switch delivery mode:
> <http://www.realsoftware.com/support/listmanager/>
> Search the archives of this list here:
> <http://support.realsoftware.com/listarchives/lists.html>

_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>

Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>

Re: Accessing an integer value in class constructor is causing failed assertion
Date: 21.04.06 08:52 (Fri, 21 Apr 2006 08:52:42 +0100)
From: Dave Addey
Hi Marco,

Yes - that worked! Thank you *very* much - I would never have guessed that
that was the problem, and it was driving me mad :-)

Now I can get back to work!

All the best,

Dave.

> From: Marco Bambini <<email address removed>>
> Reply-To: REALbasic Plugins <<email address removed>>
> Date: Fri, 21 Apr 2006 09:45:07 +0200
> To: REALbasic Plugins <<email address removed>>
> Subject: Re: Accessing an integer value in class constructor is causing failed
> assertion
>
> Have you tried to add padding at the end of your to your struct?
> I am quite sure that class data must be on the same size both on
> Windows and on Mac.
>
> Maybe something like:
>
> struct HIDManager_Data
> {
> Boolean Initialised;
>
> #if TARGET_OS_WIN32
>
> LPDIRECTINPUT8 myDirectInput8Object;
> GUID* GUIDArray; // will store the array of
> current GUIDs
> UInt32 NumberOfDevices;
>
> #elif
>
> // assuming that LPDIRECTINPUT8 and GUID are 4 bytes each
> char pad[12];
>
> #endif
>
> };
>
> ---
> Marco Bambini
> http://www.sqlabs.net
> http://www.sqlabs.net/blog/
>
>
>
> On Apr 21, 2006, at 9:37 AM, Dave Addey wrote:
>
>>
>> Hi all,
>>
>> I¹m having an incredibly frustrating problem, which probably means
>> I¹m doing
>> something stupid.
>>
>> I have a class, HIDManager, which has the following data setup:
>>
>> struct HIDManager_Data
>> {
>> Boolean Initialised;
>>
>> #if TARGET_OS_WIN32
>>
>> LPDIRECTINPUT8 myDirectInput8Object;
>> GUID* GUIDArray; // will store the array of
>> current GUIDs
>> UInt32 NumberOfDevices;
>>
>> #endif
>>
>> };
>>
>> typedef HIDManager_Data* HIDManager_DataRef;
>>
>>
>> ...and the class has the following constructor:
>>
>> static void HIDManager_Constructor (REALobject instance)
>> {
>>
>> ClassData (HIDManager, instance, HIDManager_Data, me);
>> me->Initialised = false;
>>
>> #if TARGET_OS_MAC
>>
>> if (RebuildDeviceList(instance) == noErr) {
>> me->Initialised = true;
>> }
>>
>> #elif TARGET_OS_WIN32
>>
>> // blank the GUID list
>> me->GUIDArray = NULL;
>> // reset the count
>> me->NumberOfDevices = 0;
>>
>> // create the DirectInput object
>> HRESULT osErr = DirectInput8Create(GetModuleHandle(NULL),
>> DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&me-
>>> myDirectInput8Object,
>> NULL);
>> if (osErr == noErr) {
>> me->Initialised = true;
>> CountDevices(instance);
>> RebuildDeviceList(instance);
>> }
>>
>> #endif
>>
>> }
>>
>>
>>
>> What I am finding is that the ³me->NumberOfDevices = 0² line causes
>> the
>> following error (for a Win32 app, built using this plugin and RB
>> 2006r1 on
>> Mac OS X) when the built application quits:
>>
>> Runtime Error 4: Failed Assertion
>> Dump.cpp: 111
>> Failure Condition: 0
>> Overwrote start of block
>>
>> If I comment out this line, everything works fine without the failed
>> assertion.
>>
>>
>> Any idea what could be causing this? I can manipulate the
>> Initialised and
>> GUIDArray values fine.
>>
>> Thanks in advance for any help!
>>
>> Dave.
>> _______________________________________________
>> Unsubscribe or switch delivery mode:
>> <http://www.realsoftware.com/support/listmanager/>
>>
>> Search the archives of this list here:
>> <http://support.realsoftware.com/listarchives/lists.html>
>
> _______________________________________________
> Unsubscribe or switch delivery mode:
> <http://www.realsoftware.com/support/listmanager/>
>
> Search the archives of this list here:
> <http://support.realsoftware.com/listarchives/lists.html>

_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>

Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>