C/Visual C - Cómo capturar un dato de una estructura???

   
Vista:

Cómo capturar un dato de una estructura???

Publicado por M@verick (4 intervenciones) el 13/09/2007 19:03:40
Hola, estoy realizando un DLL que debe de obtener diferentes datos de un scanner usando el API del fabricante la cual está hecho en C plano, tengo un problema al intentar obtener un dato string (que contiene los nombres de los archivos de imagenes generadas por dicho scanner) de una estructura ligada, el código propuesto es el siguiente:

int CCON getImgName(void *p){
//Declaraciones locales
char tempo[255];
struct RDSScan *lRDSScanInd;
lRDSScanInd = (struct RDSScan *)p;
strcpy(tempo,lRDSScanInd->rdsi[0]->filename);
return (1);
}

void *p es un dato que el API retorna cuando se manda llamar este función por funciones callback de la propia API.

Esta sección de código está en el DLL y al compilar y construirla no marca errores, pero al usarla desde un aplicativo externo, ocurre un error de violación de memoria. El Punto es que lo que trae la variable "lRDSScanInd->rdsi[0]->filename" sea asignado a una variable en programa para que lo pueda manejar como yo desee, en C++ esto se resuelve como sigue:

char *Name=new char[255];
strcpy(Name, lRDSScanInd->rdsi[0]->filename);

Pero la sentencia "new" no es soportada en C plano y yo lo requiero en C plano, entonces requiero encontrar alguna declaración o manera en C plano para capturar el dato de "lRDSScanInd->rdsi[0]->filename" que es una estructura en donde la variable "filename" está declarado como char *filename, he realizado diferentes pruebas declarando:

char *tempo;
char* tempo;
char *tempo[255];
char **tempo;
char tempo[255][255];

y he obtenido el mismo error.

Sabe alguien qué puedo hacer?

Gracias...

By M@verick
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:Cómo capturar un dato de una estructura???

Publicado por fernando.gomez (1604 intervenciones) el 13/09/2007 21:34:31
En lugar del new, puedes emplear:

char* Name = malloc(sizeof(char)*255);

y en lugar del delete:

free(Name);

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:Cómo capturar un dato de una estructura???

Publicado por M@verick (4 intervenciones) el 13/09/2007 22:06:26
De antemano gracias por la atención que brindas al presete, he realizado los cambios que me dijiste de la siguiente manera:

int CCON getImgName(void *p){
//Declaraciones locales
char* chrName = malloc(sizeof(char)*255);
struct RDSScan *lRDSScanInd;

lRDSScanInd = (struct RDSScan *)p;
strcpy(chrName,&lRDSScanInd->rdsi[0]->filename);
return (1);
}//Fin de getImgName

de igual manera al compilar y construir mi DLL no tengo ningún problema, pero al utilizarla desde un aplicativo externo, obtengo el mismo error cuya descripción es:

La instrucción en "0x60567702" hace referencia a la memoria en "0x00000004". La memoria no se puede "read"

Sabes porqué puede ser?

Salu2.
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:Cómo capturar un dato de una estructura???

Publicado por Tom (476 intervenciones) el 14/09/2007 08:54:50
strcpy(chrName, lRDSScanInd->rdsi[0]->filename);

Además, comprueba que los punteros no valen 0. Puedes estar teniendo problemas (en el código que se ve) con chrName, por ejemplo, ya que no compruebas si falla el malloc().
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:Cómo capturar un dato de una estructura???

Publicado por M@verick (4 intervenciones) el 14/09/2007 17:33:53
Como checo si los punteros valen cero y si la función malloc funciona?, aunque no creo que sea eso...
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:Cómo capturar un dato de una estructura???

Publicado por fernando.gomez (1604 intervenciones) el 14/09/2007 18:35:46
if (puntero == 0)
{ // es cero
}

Si malloc falla, te regresará un puntero nulo:

char* p = malloc(sizeof(char)*255);
if (p == 0)
{ // malloc falló
}

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:Cómo capturar un dato de una estructura???

Publicado por M@verick (4 intervenciones) el 14/09/2007 20:17:59
Pues no ehh los punteros son diferentes de cero y el error persiste, que más puede ser???

Salu2...
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:Cómo capturar un dato de una estructura???

Publicado por fernando.gomez (1604 intervenciones) el 14/09/2007 23:25:17
Mmm... puede ser que el índice del array al que estás intentando acceder se pase del número de elementos...

La otra es que tu DLL no esté asignando bien la memoria... Para ver esto último, lo que puedes hacer es lo siguiente. En el ID, pon un breakpoint antes de la llamada. En el "watch", revisa la dirección de memoria de la variable que te causa problemas. Luego, has click para sacar la ventana de "direcciones de memoria". Navega a la que corresponde a tu variable y revisa que los datos que tenga sean correctos (i.e. si los ves marcados con signos de interrogación, se trata de un segmento de memoria sin inicializar).

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:Cómo capturar un dato de una estructura???

Publicado por Tom (476 intervenciones) el 17/09/2007 13:04:12
¿ Te has acordado de arreglar esta línea ?:

strcpy(chrName, lRDSScanInd->rdsi[0]->filename);

Comprueba que 0 <= strlen(lRDSScanInd->rdsi[0]->filename) < 255

¿ Seguro, seguro que p apunta a una estructura RDSScan ?
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