C/Visual C - ERROR DE LECTURA DE MEMORIA (VC++)

 
Vista:

ERROR DE LECTURA DE MEMORIA (VC++)

Publicado por ifer (52 intervenciones) el 18/05/2004 18:26:27
hola, tengo un puntero hacia un array VARIABLE de estructuras definidas como:
struct MYTYPE{
long int X;
long int Y;
float Score;};

struct MYTYPE *ptrMyPuntero;

incremento el tamaño del array con:

// UnContador es una variable global int que se inicia en 0

UnContador ++;
ptrMyPuntero = (MYTYPE*) realloc( ptrMyPuntero, UnContador * sizeof(MYTYPE) );

// por si no lo saben realloc funciona como malloc si el punero es nulo.

la idea es obtener la estructura con mayor score (fScore) al inicio
de la lista, asi que hice lo usual:

struct TYPE_FACE *ptrPuntero_1 = NULL;
struct TYPE_FACE *ptrPuntero_2 = NULL;

// aca apunto a primer elemento en la posicion 0
ptrPuntero_1 = ptrMyPuntero;

// busco desde la posicion 1
for ( a = 1; a <= UnContador -1; a++ ) {
ptrPuntero_2 = ptrMyPuntero;
ptrPuntero_2 += (a * sizeof(MYTYPE));
if ( ptrPuntero_1->Score < ptrPuntero_2->Score )
ptrPuntero_1 = ptrPuntero_2;
}

// pongo el contenido de la estructura elegida a la posicion 0
ptrMyPuntero->X = ptrPuntero_1->X;
ptrMyPuntero->Y = ptrPuntero_1->Y;
ptrMyPuntero->Score = ptrPuntero_1->Score;

// pongo a null los punteros locales (por si acaso)
ptrPuntero_1 = NULL;
ptrPuntero_2 = NULL;

luego de mostrar el resultado libero memoria:
if (ptrMyPuntero!=NULL) {
free (ptrMyPuntero);
ptrMyPuntero = NULL;
UnContador = 0;
}

la corr
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:ERROR DE LECTURA DE MEMORIA (VC++)

Publicado por chuidiang (677 intervenciones) el 19/05/2004 09:35:38
No pones que es TYPE_FACE, de todas formas, esta linea

ptrPuntero_2 += (a * sizeof(MYTYPE));

es un poco rara.
Cuando incrementas un puntero, él sabe el tamaño de la estructura a la que apunta, por lo que no necesitas decirle el sizeof(). Salvo que TYPE_FACE sea una estructura de tamaño un char (un byte), no es necesario ese sizeof(). Bastaría con esto

ptrPuntero_2 += a;

Se bueno.
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:ERROR DE LECTURA DE MEMORIA (VC++)

Publicado por JoseGR (41 intervenciones) el 19/05/2004 10:43:54
El error de lectura viene porque en el ciclo for accedes a posiciones no reservadas, para que tu cliclo funcione debes sustituir

ptrPuntero_2 += (a * sizeof(MYTYPE));

por

ptrPuntero_2 = (a * sizeof(MYTYPE));

o por

ptrPuntero_2 += (sizeof(MYTYPE));

ya que sino suma erroneamente.

Un ciclo mas eficiente y claro seria:

// busco desde la posicion 1
ptrPuntero_2 = ptrMyPuntero;
for ( a = 1; a <UnContador; a++ ) {
if ( ptrPuntero_1->Score < ptrPuntero_2->Score )
ptrPuntero_1 = ptrPuntero_2;
ptrPuntero_2++;
}

Espero que te sirva.
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

ERROR RESUELTO

Publicado por ifer (52 intervenciones) el 21/05/2004 21:17:40
en cuanto a la pregunta misma, pues en:

struct TYPE_FACE *ptrPuntero_1 = NULL;
struct TYPE_FACE *ptrPuntero_2 = NULL;

TYPE_FACE es lo mismo que MYTYPE, me olvide renombrarç
pero el problema radicaba en esto:

// pongo el contenido de la estructura elegida a la posicion 0
ptrMyPuntero->X = ptrPuntero_1->X;
ptrMyPuntero->Score = ptrPuntero_1->Score;

pues algo sucede aca, pues descargue el contenido en una variables asi:

int x = ptrPuntero_1->X;
float s = ptrPuntero_1->Score;
ptrMyPuntero->X = x;
ptrMyPuntero->Score = s;

y todo va ok, entonces el recorrido que hice con los puntero esta bien (aun cuando parescan medio raros), pero gracias por su ayuda. 8)
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