473,388 Members | 1,335 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,388 software developers and data experts.

void* versus uint32*

I have never really understood the difference between the two notations
below.

I often run into code where they are passing in the address of some
location.

Some people do something like this:

foo( void* p_data ) // pass in a pointer to some data

while I see others do this.

foo( uint32* p_data) // pass in a pointer to some data

Can someone please explain to me why you would choose one over the other.

Someone once told me using the uin32 guarantees alignment on a 32 bit
boundary.

Any help is greatly appreciated.
Jul 23 '05 #1
4 3346
john smith wrote:

I have never really understood the difference between the two notations
below.

I often run into code where they are passing in the address of some
location.

Some people do something like this:

foo( void* p_data ) // pass in a pointer to some data

while I see others do this.

foo( uint32* p_data) // pass in a pointer to some data

Can someone please explain to me why you would choose one over the other.


I use void pointers only to signal to the user of some functionality:
"Here you get a pointer, but is not of your business whats behind
that pointer, leave that alone!"

Eg. I have a geometry engine (from my dark ages). On request that
engine creates an object. It gives back a pointer to that object.
If any operation on that object needs to be done, the users code
has to present that pointer again. So the pointer acts as some sort
of 'handle' to the users code. He gets one from me, he has to present
it again in operations. But he definitly should not care what data
structure is behind that handle.

--
Karl Heinz Buchegger
kb******@gascad.at
Jul 23 '05 #2
In message <42***************@gascad.at>, Karl Heinz Buchegger
<kb******@gascad.at> writes
john smith wrote:

I have never really understood the difference between the two notations
below.

I often run into code where they are passing in the address of some
location.

Some people do something like this:

foo( void* p_data ) // pass in a pointer to some data

while I see others do this.

foo( uint32* p_data) // pass in a pointer to some data

Can someone please explain to me why you would choose one over the other.

Given the choice, use neither.

I use void pointers only to signal to the user of some functionality:
"Here you get a pointer, but is not of your business whats behind
that pointer, leave that alone!"

Eg. I have a geometry engine (from my dark ages). On request that
engine creates an object. It gives back a pointer to that object.
If any operation on that object needs to be done, the users code
has to present that pointer again. So the pointer acts as some sort
of 'handle' to the users code. He gets one from me, he has to present
it again in operations. But he definitly should not care what data
structure is behind that handle.

Ugh. Surely *you* care that what he's giving you back pointers to isn't
garbage, and if you're giving him more than one kind of object, you're
asking for trouble. You'd be far safer giving him a pointer to a
distinct but incomplete type. He still can't tell what lies behind it,
but at least he knows that different structures have different types and
the compiler helps to enforce that their pointers can't be mixed.

Unless you're stuck with a C-style third-party API that mandates it, the
only place for void * is inside library code.

Say what you mean, and mean what you say.

--
Richard Herring
Jul 23 '05 #3
Richard Herring wrote:
Eg. I have a geometry engine (from my dark ages). On request that
engine creates an object. It gives back a pointer to that object.
If any operation on that object needs to be done, the users code
has to present that pointer again. So the pointer acts as some sort
of 'handle' to the users code. He gets one from me, he has to present
it again in operations. But he definitly should not care what data
structure is behind that handle.

Ugh. Surely *you* care that what he's giving you back pointers to isn't
garbage, and if you're giving him more than one kind of object, you're
asking for trouble. You'd be far safer giving him a pointer to a
distinct but incomplete type. He still can't tell what lies behind it,
but at least he knows that different structures have different types and
the compiler helps to enforce that their pointers can't be mixed.


As said: This code originated in the 'dark ages' :-)
But of course, in the debug version the pointer is stored in a map
and checked when given back. Worked reasonable well since more then
10 years with a surprising low number of pointer type mismatches ( that
is *0* in all those >10 years).

--
Karl Heinz Buchegger
kb******@gascad.at
Jul 23 '05 #4

"john smith" <pr**************@charter.net> wrote in message
news:Ps***************@fe08.lga...
I have never really understood the difference between the two notations
below.

I often run into code where they are passing in the address of some
location.

Some people do something like this:

foo( void* p_data ) // pass in a pointer to some data

while I see others do this.

foo( uint32* p_data) // pass in a pointer to some data

Can someone please explain to me why you would choose one over the other.

Someone once told me using the uin32 guarantees alignment on a 32 bit
boundary.


There is no standard type uint32. Apparently, it's something defined by
your compiler's library (such as Visual C++).

I'd use uint32* if I was passing the address of a uint32 variable. It has
nothing whatsoever to do with alignment. It's a pointer to an object of
some known type, and it should point to the type of object it says it points
to! To do anything else would require a cast (and could possibly cause
problems at some point).

Perhaps that person's statement about alignment had to do with choosing the
uint32 type for a variable, such as the one whose address gets passed to
this function. But you should choose variable types based on design
requirements. If the actual size isn't that vital to know, use int, because
that is defined to be the size used by the system it's being compiled for
(e.g., 64 bits for a 64-bit system).

I rarely declare any functions that take a void* pointer. Really, the only
use I have for them is to provide a place for API callbacks to store a
pointer to one of my objects (the one that registers to receive the
callback). That lets me cast the void* pointer to a pointer of the type I
*know* it really is, so that I can call a member function of that object to
actually do the callback work. This kind of trick is needed because the API
generally has no way of knowing what type of object it's going to call back
to, so it calls a free-standing function which I write, which *does* know
the type of object to make the call to.

Jul 23 '05 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

9
by: Pushker Pradhan | last post by:
I've a function which accepts void * as the arg because the actual datatype can be char or float or anything. The fuction: void convolve(void *x, float *convx, uint32 numrowsx, uint32 numcolsx,...
8
by: Luc Le Blanc | last post by:
I have 2 APIs that store/recall a void *. Since all I need to store is a 32-bit struct, I pass the actual data (instead of a pointer to it) as a void *: typedef { UInt8 color;...
9
by: Xiangliang Meng | last post by:
Hi, all. I see a very strange fragment code today. Uint32 enum { a = 100; b = 200; }; NOTE: Uint32 is defined to be 'unsigned' in other source files.
4
by: LordHog | last post by:
Hello all, I am having a little problem getting my (void *) assignment to work correctly. Basically it is some code for a circular queue buffer I am trying to implement, but getting the...
1
by: Michel Racicot | last post by:
Hi there, The following code is troubling me: UInt32 nOffset = nStringEntriesOffset + (40 * nIndex); nStringEntriesOffset is a UInt32 containing 2124 nIndex is a UInt32 containing 5213 ...
9
by: Chris Botha | last post by:
Hi, I have an UInt32 and want to stick the value into an Integer and get an Overflow exception, BUT using C# the same value can be casted into an int and the value is as expected. The Hex value is...
21
by: ashish.sadanandan | last post by:
Hi, I haven't done a lot of C++ programming (done a lot of it in C) and the reason why I'm considering switching now is also the question I'm posting here. I have some library functions that...
2
by: Bern McCarty | last post by:
In the old MEC++ syntax I can do this: // compile in VS 2005 shell with cl -clr:oldsyntax -LD ArrayCopyOldSyntax.cpp #using <mscorlib.dll> public __gc class CopyTest { private:...
11
by: Yaniv | last post by:
Hi How can I convert Uint32 variable to System.drawing.color ?? Thanks in advanced Yaniv
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.