Discussion:
Como hacer esto?
(demasiado antiguo para responder)
Manu Exposito
2006-06-18 22:10:19 UTC
Permalink
Tengo esta definicion:

typedef unsigned char BYTE;

char * _miReturn( char * )

Y en programa quiero hacer esto:

main()
{
BYTE Letra;

Letra = 'A';

_miReturn( Letra );
}

el problema es que Letra no es (char *), como haerlo?

Saludos y perdonen si esta es una pregunta de primero, pero acabo
deempezar con C...

Gracias amigos
ROC
2006-06-18 22:29:50 UTC
Permalink
Post by Manu Exposito
typedef unsigned char BYTE;
char * _miReturn( char * )
main()
{
BYTE Letra;
Letra = 'A';
_miReturn( Letra );
// prueba con:
_miReturn( &Letra);
// tienes que pasar una referencia (dirección) al puntero del
parámetro.
// Si todavía te da error de tipo estricto (cosa poco probable),
// prueba declarar la función así:
// char * _miReturn( BYTE * ).


ROC
Post by Manu Exposito
}
el problema es que Letra no es (char *), como haerlo?
Saludos y perdonen si esta es una pregunta de primero, pero acabo
deempezar con C...
Gracias amigos
Manu Exposito
2006-06-19 01:39:35 UTC
Permalink
Funciona perfecto...

Muchísimas gracias ;-)
Post by ROC
Post by Manu Exposito
typedef unsigned char BYTE;
char * _miReturn( char * )
main()
{
BYTE Letra;
Letra = 'A';
_miReturn( Letra );
_miReturn( &Letra);
// tienes que pasar una referencia (dirección) al puntero del
parámetro.
// Si todavía te da error de tipo estricto (cosa poco probable),
// char * _miReturn( BYTE * ).
ROC
Post by Manu Exposito
}
el problema es que Letra no es (char *), como haerlo?
Saludos y perdonen si esta es una pregunta de primero, pero acabo
deempezar con C...
Gracias amigos
Oscar Garcia
2006-06-19 07:30:51 UTC
Permalink
Post by ROC
Post by Manu Exposito
typedef unsigned char BYTE;
char * _miReturn( char * )
main()
{
BYTE Letra;
Letra = 'A';
_miReturn( Letra );
_miReturn( &Letra);
// tienes que pasar una referencia (dirección) al puntero del
parámetro.
// Si todavía te da error de tipo estricto (cosa poco probable),
// char * _miReturn( BYTE * ).
¡¡Ciudado!!

Eso es seguro sólo si defines Letra como estática (static).

En este caso en particular, como es una variable local definida en la
función main, va a tener la suerte de que la zona de memoria usada por
Letra no va a ser reutilizada por ninguna otra función, pero en una
función como esta no sería válido.

char * _miReturn ((char *) letra) {
char Letra = 'S';
return &Letra;
}

Por supuesto este ejemplo carece un poco de sentido porque ha sido una
muestra del error, no un ejemplo real.

La variable Letra tendrá sentido sólo durante la ejecución de dicha
función (se crea 'S' y todas las variables locales en una zona de
memoria llamada "heap"), una vez que salgamos de la función dicha
memoria puede ser reutilizada por cualquier otra función que sea
llamada posteriormente, por lo que los datos almacenados en ella
podrían corromperse.

Esta advertencia te la hago porque me he fijado que tu función
devuelve un (char *), de modo que corres el riesgo de cometer dicho
error.

Por otro lado, como la función necesita como parámetro un (char *)
necesitas hacer un cast (o conversión) tal y como:

_miReturn ((char *) Letra);

O bien, hacer como te ha dicho ROC y cambiar el tipo de entrada de la
función.

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Manu Exposito
2006-06-19 16:25:02 UTC
Permalink
Realmente esto era solo un ejemplo de muestra, el tema es un poco mas
complicado...

Realmente tengo una función en la que defino una estructura local en la
que uno de sus miembros es Letra.

Asi mas o menos:

miFuncion()
{
miStr *LaStruct = alloc( sizeof( miStr ) );

if( miStr )
{
LaStruct->Letra = 'A';
...
}
}

Luego hago uso de la estructura de funcion en funcion pasando el puntero
a esta como argumento...

void otraFuncion( miStr *pmiStr )
{
if( pmiStr )
{
pmiStr->Letra = 'A';
}
}

Al final hay otra funcion que libera la memoria reservada con free...

En este caso hay el peligro que comentas?

Saludos y muchas gracias por vuetra ayuda...
Post by Oscar Garcia
Post by ROC
Post by Manu Exposito
typedef unsigned char BYTE;
char * _miReturn( char * )
main()
{
BYTE Letra;
Letra = 'A';
_miReturn( Letra );
_miReturn( &Letra);
// tienes que pasar una referencia (dirección) al puntero del
parámetro.
// Si todavía te da error de tipo estricto (cosa poco probable),
// char * _miReturn( BYTE * ).
¡¡Ciudado!!
Eso es seguro sólo si defines Letra como estática (static).
En este caso en particular, como es una variable local definida en la
función main, va a tener la suerte de que la zona de memoria usada por
Letra no va a ser reutilizada por ninguna otra función, pero en una
función como esta no sería válido.
char * _miReturn ((char *) letra) {
char Letra = 'S';
return &Letra;
}
Por supuesto este ejemplo carece un poco de sentido porque ha sido una
muestra del error, no un ejemplo real.
La variable Letra tendrá sentido sólo durante la ejecución de dicha
función (se crea 'S' y todas las variables locales en una zona de
memoria llamada "heap"), una vez que salgamos de la función dicha
memoria puede ser reutilizada por cualquier otra función que sea
llamada posteriormente, por lo que los datos almacenados en ella
podrían corromperse.
Esta advertencia te la hago porque me he fijado que tu función
devuelve un (char *), de modo que corres el riesgo de cometer dicho
error.
Por otro lado, como la función necesita como parámetro un (char *)
_miReturn ((char *) Letra);
O bien, hacer como te ha dicho ROC y cambiar el tipo de entrada de la
función.
Un saludo.
Oscar Garcia
2006-06-19 16:32:13 UTC
Permalink
On Mon, 19 Jun 2006 16:25:02 GMT, Manu Exposito
Post by Manu Exposito
void otraFuncion( miStr *pmiStr )
{
if( pmiStr )
{
pmiStr->Letra = 'A';
}
}
Al final hay otra funcion que libera la memoria reservada con free...
En este caso hay el peligro que comentas?
Depende: si Letra está definido como un valor (char o BYTE) entonces
no habrá problema porque estás asignando un valor a una zona de
memoria ya reservada con el alloc y 'A' es un valor (en ASCII) del
carácter A (65).

Si llegas a hacer eso mismo con una cadena de caracteres entonces
hubieras sufrido dicho problema.
Post by Manu Exposito
Saludos y muchas gracias por vuetra ayuda...
De nada, un placer.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Manu Exposito
2006-06-19 16:41:18 UTC
Permalink
Muchas gracias Oscar...
En la estructura está asignado como BYTE.

Hasta ahora ha ido bien y por tus palabras estoy más seguro ;-)
Post by Oscar Garcia
On Mon, 19 Jun 2006 16:25:02 GMT, Manu Exposito
Post by Manu Exposito
void otraFuncion( miStr *pmiStr )
{
if( pmiStr )
{
pmiStr->Letra = 'A';
}
}
Al final hay otra funcion que libera la memoria reservada con free...
En este caso hay el peligro que comentas?
Depende: si Letra está definido como un valor (char o BYTE) entonces
no habrá problema porque estás asignando un valor a una zona de
memoria ya reservada con el alloc y 'A' es un valor (en ASCII) del
carácter A (65).
Si llegas a hacer eso mismo con una cadena de caracteres entonces
hubieras sufrido dicho problema.
Post by Manu Exposito
Saludos y muchas gracias por vuetra ayuda...
De nada, un placer.
Loading...