PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > comp.lang.cplus > void * pointers
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
void * pointers

Réponse
 
LinkBack Outils de la discussion
Vieux 24/12/2007, 11h02   #1
Rahul
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut void * pointers

Hi Everyone,

There was a discussion on the need of void * in C and C++. In C, it
is a generic pointer which can be typecasted to and from that of other
types.

And it is developer's head ache to take care that the cast to and
from void * is correct. C++ enhanced type cast dynamic_cast doesn't
in this case, as it needs the type information. This makes me
wonder, why make a cast to void * and pass the info to other
functions? Why not simply pass the direct pointer?

Does anyone know the reason where void* only can solve the problem?
  Réponse avec citation
Vieux 24/12/2007, 12h22   #2
Barry
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: void * pointers

Rahul wrote:
> Hi Everyone,
>
> There was a discussion on the need of void * in C and C++. In C, it
> is a generic pointer which can be typecasted to and from that of other
> types.
>
> And it is developer's head ache to take care that the cast to and
> from void * is correct. C++ enhanced type cast dynamic_cast doesn't
> in this case, as it needs the type information. This makes me
> wonder, why make a cast to void * and pass the info to other
> functions? Why not simply pass the direct pointer?
>


In C++, we don't use void* in this case, we use base_class* as
parameter, and we don't have to do explicit cast before passing it.

An good example why using void* in C is thread entry function,
an thread entry function often defined as following:

void entry_fn(void* param) // client programmer
{
// cast param to the exact type and use it
}

CRT function on Win32 to create a thread.

uintptr_t _beginthread(
void( *start_address )( void * ),
unsigned stack_size,
void *arglist
);

// client programmer create a thread like the following

_beginthread(entry_fn, 0, NULL);

entry_fn is also considered as callback function, _beginthread can't
foresee what kind of param, number of params that the client programmer
will use, so leave it to a generic type (void*).


> Does anyone know the reason where void* only can solve the problem?

  Réponse avec citation
Vieux 24/12/2007, 14h13   #3
john
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: void * pointers

Rahul wrote:
> Hi Everyone,
>
> There was a discussion on the need of void * in C and C++. In C, it
> is a generic pointer which can be typecasted to and from that of other
> types.
>
> And it is developer's head ache to take care that the cast to and
> from void * is correct. C++ enhanced type cast dynamic_cast doesn't
> in this case, as it needs the type information. This makes me
> wonder, why make a cast to void * and pass the info to other
> functions? Why not simply pass the direct pointer?
>
> Does anyone know the reason where void* only can solve the problem?



In C generic programming is made by using void pointers and id
parameters. In C++ we use templates instead:


For example:

/*C */

void somefunc(void *p, char id)
{
if (id=='i')
/* ... */

if (id== 'n')
/* ... */
}


// C++
void somefunc(T &obj)
{
//...

}



  Réponse avec citation
Vieux 24/12/2007, 14h17   #4
john
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: void * pointers

Some corrections:


john wrote:
>
>> Does anyone know the reason where void* only can solve the problem?

>
>
> In C generic programming is made by using void pointers and id
> parameters. In C++ we use templates instead:
>
>
> For example:
>
> /*C */
>
> void somefunc(void *p, char id)
> {
> if (id=='i')
> /* ... */
>

==> else if (id== 'n')
> /* ... */
> }
>
>
> // C++

==> template <class T>
> void somefunc(T &obj)
> {
> //...
>
> }

  Réponse avec citation
Vieux 24/12/2007, 17h14   #5
Dave Rahardja
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: void * pointers

In article
<e2fdaa19-9566-47b9-a838-7ddaa87c1568@e23g2000prf.googlegroups.com>,
Rahul <sam_cit@yahoo.co.in> wrote:

> Hi Everyone,
>
> There was a discussion on the need of void * in C and C++. In C, it
> is a generic pointer which can be typecasted to and from that of other
> types.
>
> And it is developer's head ache to take care that the cast to and
> from void * is correct. C++ enhanced type cast dynamic_cast doesn't
> in this case, as it needs the type information. This makes me
> wonder, why make a cast to void * and pass the info to other
> functions? Why not simply pass the direct pointer?
>
> Does anyone know the reason where void* only can solve the problem?


As I see it, void* shows the pedigree of C++ as coming from C, a system
programming language.

While implementing very low level routines, there are cases where you
want to deal with a "bucket of bits" that is untyped. For example, the
following endian-reversing routine (inherently compiler- and
platform-dependent) may not care what the type is of the thing you're
reversing:

namespace Compiler_Dependent
{
void reverse_endian(void*, std::size_t size);
}

You can then add your own type-safe wrappers around it:

template <typename T>
inline void reverse_endian(T& item)
{
Compiler_Dependent::reverse_endian(&T, sizeof(T));
}

Other examples include raw-bytes buffer implementations.

-dr
  Réponse avec citation
Vieux 24/12/2007, 19h41   #6
Aragon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: void * pointers

On 2007-12-24 11:14:56 -0600, Dave Rahardja <moc.xobop@ajdrahard.com> said:
>
> template <typename T>
> inline void reverse_endian(T& item)
> {
> Compiler_Dependent::reverse_endian(&T, sizeof(T));
> }


Whoops, reverse_endian(&item... of course.


  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 22h49.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,15743 seconds with 14 queries