C/Visual C - puntero como parametro de una funcion y alloc

 
Vista:

puntero como parametro de una funcion y alloc

Publicado por Betty (5 intervenciones) el 04/03/2006 12:24:29
Hola a todos! Llevo muchos dias dándole vueltas a este problema y no le veo la manera. Evidentemente es debido a mi falta de experiencia, a ver si alguien puede ayudarme.
La situación es la siguiente. Tengo una imagen en blanco y negro (no en escala de grises, los únicos colores que hay son el blanco y el negro) e intento hacer una función que me devuelva las coordenadas de los pixeles blancos. Para ello me defino un puntero a un tipo "punto", donde quiero que esté la solución, y llamo a la función metiendo la imagen y el puntero mencionado. Lo voy a poner en código, supongo que así se verá mas claro:

CvPoint *arrayPuntosT;
totalpuntos2=image2points8b(imgSrc,arrayPuntosT);

Y la función image2points básicamente lo que hace es definir una estructura que puede crecer dinámicamente e ir añadiendole las coordenadas de los puntos blancos para después copiarla al puntoero-array original. Es la siguiente:

int image2points8b(IplImage *imagen,CvPoint *array)
{
CvPoint punto;
CvMemStorage* almacen = cvCreateMemStorage(0);
CvSeq* secuenciaPuntos = cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),almacen);

int numpuntos=0;
for (int j=0;j<ysize;j++)
{
for (int i=0;i<xsize;i++)
{
if (imagen->imageData[(j*xsize)+(i)])
{
punto.x=i+1;
punto.y=j+1;
cvSeqPush(secuenciaPuntos,&punto);
numpuntos++;
}
}
}

//Reservar memoria para un array de CvPoint:
array = (CvPoint *)malloc(numpuntos * sizeof(CvPoint));

//Copiamos los puntos al array:
cvCvtSeqToArray(secuenciaPuntos, array,CV_WHOLE_SEQ);
cvReleaseMemStorage( &almacen );
return numpuntos;
}

He comprobado que la función funciona, lo único que pasa es que fuera no puedo leer el array que me he creado dentro, pero si hago la reserva de memoria fuera, entonces todo va bien. Osea, que el problema es que no puedo pasar un puntero al que no le he reservado la memoria. Sin embargo, no puedo hacer la reserva de memoria fuera pq no se a priori cuantos puntos blancos tendré en la imagen.

Hay alguna forma de solucionar esto?? De qué manera puedo pasarle el puntero a la función sin haber reservado memoria?? Estoy desesperada. Gracias por leerme.
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
sin imagen de perfil

RE:puntero como parametro de una funcion y alloc

Publicado por chuidiang (73 intervenciones) el 06/03/2006 06:38:25
Hola:

Un ejemplo sencillo, imagina la funcion

void funcion (int *b)
{
b = alloc (10); // Por poner algo;
}

Y ahora la llamas así

int *a;
funcion (a);

El problema es que aunque no lo parezca, en C TODAS las variables se pasan por copia. En este caso, estás pasando un puntero a que se copia en b. Los punteros a de fuera y b de dentro de la función, son punteros distintos. Si a la variable b le asignas algo haciéndola apuntar a algún lado, la variable a de fuera permanece inalterada puesto que es una variable distinta de b y lo unico que tiene en comun con ella es que en el momento de llamar a la función apuntan al mismo sitio.

Para que esto funcione, debes pasar un puntero al puntero. La funcion debe quedar asi

void funcion (int **b)
{
*b = alloc (10);
}

y la llamada asi

int *a;
funcion (&a);

Ahora es el puntero al puntero el que se copia. Estas pasando un puntero que apunta al puntero a. Dentro de la funcion, b es un puntero que apunta al puntero a. Si haces algo con *b, lo estás haciendo con a.

En http://www.geocities.com/chuidiang/funciones/punteros.html tienes un pequeño tutorial de punteros, y este caso en concreto se menciona. Puedes verlo si quieres la explicación un poco más detallada.

Otra opción quizás más sencilla es que reserves espacio en a fuera de la función y en la función simplemente rellenes los datos, sin hacer alloc.

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:puntero como parametro de una funcion y alloc

Publicado por Betty (5 intervenciones) el 06/03/2006 13:05:40
Muchísimas gracias por tu respuesta!! Una explicación fantástica, de verdad. Y tu página parece supercompleta, la estudiaré a fondo. He puesto en práctica tu solución y ahora se me bloquea en otro sitio, este es el cuento de nunca acabar :) Gracias otra vez.
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