[C con Clase] Como interpretar el siguiente

Steven Davidson steven en conclase.net
Sab Jul 7 02:41:19 CEST 2007


Hola ERVA,

El pasado 2007-07-06 22:52:54, ERVA escribió:

E> Hola que tal. Estoy leyendo un codigo y me encontre con una linea que no comprend. Se las dejo por si es posible me puedan ayudar, de favor, a interpretarla.
E> // ------------------------------------
E> WSAQUERYSET wsa; // Es una estructura.
E> char buf[100];
E> ...
E> wsa = (WSAQUERYSET *) &buf;
E> ...
E> // ------------------------------------
E> Segun mi lectura es 'wsa' apunta a 'buf' y como se tratan de tipos de datos diferentes por eso se hace un 'cast' al tipo de 'wsa'. Pero me surgen varias dudas:

Sería más bien 'LPWSAQUERYSET' o 'WSAQUERYSET *', ya que como dices 'wsa' debe ser un puntero.

E> 1) Por que asignarle una cadena de caracteres a una estructura?

No estamos haciendo tal asignación. Lo que estamos haciendo - o intentando hacer - es reinterpretar la información de tipo 'char' guardada en el array 'buf' como información de tipo 'WSAQUERYSET'. En C++, usamos el operador de cásting 'reinterpret_cast<>()' para que no haya sorpresas y por mayor legibilidad. Esto sería,

WSAQUERYSET *wsa;
char buf[100];

wsa = reinterpret< WSAQUERYSET * >( buf );

E> 2) Por que se usa el WSAQUERYSET *, por que no simplemente se usa WSAQUERYSET?

Bueno, el código que nos has pasado declara 'wsa' como una estructura y no como un puntero. Esto es un error: 'wsa' debería ser un puntero. Por esta razón, hacemos un cásting a 'WSAQUERYSET *', porque 'wsa' debería ser un puntero.

El cásting de reinterpretación se hace entre punteros, ya que al fin y al cabo estamos copiando direcciones de memoria. La única diferencia está en los tipos secundarios - es decir, los tipos de los objetos siendo apuntados - de cada puntero.

E> 3) Muy similar a la anterior pero referente a 'buf', por que se usa '&buf' que 'buf'.

Esto es un error; debería ser 'buf' "a secas".


La razón de hacer todo esto realmente depende de la información guardada en 'buf'. No se trata de una cadena de caracteres sino más bien un array de bytes. Sospecho que la información fue obtenida por algún mecanismo genérico de transmitir información a este programa; por ejemplo, entre procesos comunicados por tuberías (pipes, en inglés), a través de una red o internet, o algo parecido, o incluso desde un fichero binario.


Espero haber aclarado la duda.

Steven


Más información sobre la lista de distribución Cconclase