C/Visual C - ayuda memcpy

 
Vista:

ayuda memcpy

Publicado por daniela (2 intervenciones) el 15/12/2007 12:06:09
Hola!!!!tengo un problema con la función memcpy y si alguien pudiera ayudarme se lo agradecería.
struct thread_struct{
int thread_id;
state_t state;
ucontext_t context;
...
};

struct thread_struct *current;
void scheduler(int s,siginfo_t *siginfo,void *contexto){
...
memcpy(¤t->context,&contexto,sizeof(ucontext_t);
...
}

Hago esto, pero no me lo copia bien...seguramente estoy pasando mal los parámetros al memcpy.

¿ALguien puede ayudarme??GRACIAAAAAS!!!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:ayuda memcpy

Publicado por fernando.gomez (1603 intervenciones) el 16/12/2007 06:03:42
Mmm... ten cuidado con los void*s, son un arma de doble filo.

En fin, el caso es que "contexto" es un puntero, y al memcpy le pasas la dirección de memoria de "contexto". Supongo yo que lo que en realidad quieres hacer sería:

memcpy(¤t->context, contexto, sizeof(ucontext_t));

para copiar el contenido de "contexto" al miembro de tu estructura. Es lo único que se me ocurre que pueda estar mal, dado el código que muestras.

Por cierto, una de dos. Según el código que muestras, "contexto" es de un tipo cualquiera, sin embargo en el memcpy asumes que es de tipo "ucontext_t" (o mejor dicho, asumes que son del mismo tamaño, contando la alineación de bits de tu compilador). En caso de que "contexto" sea siempre de tipo "ucontext_t", creo que sería mejor que eliminaras el void* y declararas tal cuál tu variable:

void scheduler(int s,siginfo_t* siginfo, ucontext_t* contexto)
{
...
memcpy(¤t->context, contexto, sizeof(ucontext_t));
...
}

Ahora, si en realidad "contexto" tiene que ser de tipo variable, creo que lo más recomendable sería que hicieras:

memcpy(¤t->context, contexto, sizeof(contexto));

Claro, estas sugerencias son más de legibilidad y no implica que estés mal.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ayuda memcpy

Publicado por daniela (2 intervenciones) el 16/12/2007 13:33:52
Muchas gracias!!!
Lo que me dices de que ponga q es tipo ucontext_t* no puedo,porque se me indica que tiene q estar declarado como void* pero que es de tipo ucontext_t.

Y bueno, lo que me dices del memcpy lo he probado pasándole contexto, y me da "violación de segmento" al compilarlo..asi que nose...pero gracias de todas formas!!!
Seguiré intentandolo..a ver

Gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ayuda memcpy

Publicado por fernando.gomez (1603 intervenciones) el 16/12/2007 22:41:00
Mmm... violación de segmento, quiere decir que estás accesando a un bloque de memoria sin inicializar. A ver, en tu ejemplo tienes:

struct thread_struct *current;
void scheduler(int s,siginfo_t *siginfo,void *contexto){
...
memcpy(¤t->context,&contexto,sizeof(ucontext_t);
...
}

obvio, yo estaba asumiendo que "current" había sido inicializado... Pero por lo que me dices es posible que en efecto no lo esté. ¿Si estás inicializando "current"? Digo, ¿a través de un new, malloc o apuntando a otra variable?

La otra, es que en tu función "scheduler" le estés pasando (a través de "contexto") memoria sin inicializar, o bien, que "contexto" no sea del tamaño de "ucontext_", es decir, que sizeof(contexto) < sizeof(ucontext_t).

Son las dos opciones que se me ocurren por las que te pudiera estar dando ese error de acceso a memoria.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ayuda memcpy

Publicado por Nelek (816 intervenciones) el 17/12/2007 08:40:38
No asumas, comprueba. Y si no puedes comprobar... pregunta. Y si no puedes preguntar... toma siempre el peor de los casos posibles ;) :P
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar