Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda urgente plis

Estas en el tema de Ayuda urgente plis en el foro de C/C++ en Foros del Web. Miren necesito hacer este ejercicio y weno e escrito el codigo pero no me va. ME podrian ayudar? Ejercicio 2 (40 puntos) En la fábrica ...
  #1 (permalink)  
Antiguo 23/08/2008, 09:42
 
Fecha de Ingreso: agosto-2008
Mensajes: 25
Antigüedad: 15 años, 8 meses
Puntos: 0
Ayuda urgente plis

Miren necesito hacer este ejercicio y weno e escrito el codigo pero no me va.
ME podrian ayudar?



Ejercicio 2 (40 puntos)

En la fábrica de automóviles de la marca Ferrault se tiene un robot encargado de dar el último toque a la pintura de la carrocería. Por defectos naturales de la pintura, es posible que, de vez en cuando, aparezcan manchas y el acabado no sea perfecto. Con el fin de detectar estos casos, se ha instalado una cámara para inspeccionar el proceso de forma automática. La Dirección de la fábrica ha encargado al departamento de informática que añada al programa de control de la fábrica una función en lenguaje C que determine si un vehículo está mal pintado a partir de una imagen de 256 niveles de gris tomada con la cámara.
El equipo de ingenieros ha estimado que cuando un automovil está bien pintado con el color de valor color_auto, entonces el valor de la media de los píxeles de la imagen pertenece al intervalo [color_auto-20, color_auto+40]. Si no es así, es que ha habido defectos durante el proceso de pintado y hay que repetirlo.

Escribe el código de la función repetir_pintura que devuelva el valor 1 (cierto) si ha habido defectos de pintura, y 0 (falso) en caso contrario. Ten en cuenta que la función recibe como argumentos de entrada los siguientes:
int * imagen; // zona de memoria en la que se alojan los valores de los píxeles de la imagen
int nfilas; //número de filas de la imagen
int ncols; //número de columnas de la imagen
int color_auto; //color con que se ha pintado el vehículo que aparece en la imagen
Escribe el trozo de código de la función principal que se necesitaría para comprobar si hay que pintar un coche nuevamente. Suponga que la imagen del automóvil está guardada en una variable de nombre foto_coche, que el número de filas y columnas están almacenadas en las variables f y c, respectivamente, y que el color de la pintura está almacenada en la variable color. Dicho código debe mostrar por pantalla un mensaje que indique si hay que repintar o no. Nota: Si es necesario declarar alguna variable adicional, indícalo.






#include <stdio.h>
#include <stdlib.h>
int repetir(int* img,int ncols, int nfilas, int color);

int main(int argc,char* argv)
{


int alto,ancho,pause;
int* imagen;
int color;




printf("introduce el ancho\n");

scanf("%d",&ancho);
printf("introduce el alto\n");

scanf("%d",&alto);

printf("escribe el color\n");
scanf("%d",&color);
imagen=(int*)malloc(ancho*alto*sizeof(int));
printf("el resultado es %d",repetir(imagen,ancho,alto,color));

scanf("%d",&pause);
return 0;
}



int repetir(int* img,int ncols, int nfilas, int color)

{
int i,j,error;
int mono;
int alto=0;
for(i=0;i<=ncols;i++)
for (j=0;j<=nfilas;j++)
printf("%d",*(img + i * j));


for(i=0;i<=ncols;i++)
{for (j=0;j<=nfilas;j++)
{ mono=*(img+i *0+j);
if ((mono<(color-20))||(mono>(color+40)))

{
printf("ubo un error al comparar %d con %d\n",*(img+i * j),color);
error=1;
i=ncols;
}}}

return error;
}





Weno en la funcion repetir, lo que he puesto para que supuestamente impirma todo lo del puntero imagen, es para ver que valores coge, y el coge los valores de direccion me parece, pruebenlo.
Creo ke mi error esta en eso ke señalo en azul.


AYUDA PORFA::
GRACIAS:
  #2 (permalink)  
Antiguo 23/08/2008, 15:48
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda urgente plis

Hay algunos detalles:

Código:
imagen=(int*)malloc(ancho*alto*sizeof(int));
printf("el resultado es %d",repetir(imagen,ancho,alto,color));
Estás asignando la memoria, pero no estas inicializando los valores de la imagen, yo lo he puesto así para poder ver los datos y saber que se están leyendo bien:
Código:
imagen=(int*)malloc(ancho*alto*sizeof(int));
// Inicio todos los datos a 0, 1, 2, 3, 4... para ver con claridad las pruebas.
for(int i=0; i<ancho*alto; i++) *(imagen+i)=i;
printf("el resultado es %d",repetir(imagen,ancho,alto,color));
free(imagen); // Liberar la memoria usada. 
El cálculo correcto para acceder a los elementos de una matriz que está representada de forma lineal es x+(y*ancho), quedando así en el código:
Código:
printf("%d ",*(img + (i + (j*ncols))));
por último la comparación de las variables en el for no es hasta j<=nfilas es hasta j<nfilas, recuerda que empieza en 0 no en 1, y por motivos de comodidad yo invertiría los for para que así vaya en orden recorriendo la matriz y escriba los valores en pantalla como en la imagen, así:
Código:
for(j=0;j<nfilas;j++)
 for(i=0;i<ncols;i++)
  printf("%d ",*(img + (i + (j*ncols))));
No he revisado que haga bien el trabajo que pone en el ejercicio, solo me he limitado a revisar que los datos se lean bien desde "imagen".

PD: ¿Por qué el código en verde? casi no se lee.

Saludos.
  #3 (permalink)  
Antiguo 23/08/2008, 16:02
 
Fecha de Ingreso: agosto-2008
Mensajes: 25
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ayuda urgente plis

nu me rula, no entiendo sigue metiendo las direcciones de memoria.
  #4 (permalink)  
Antiguo 23/08/2008, 16:03
 
Fecha de Ingreso: agosto-2008
Mensajes: 25
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ayuda urgente plis

porque has puesto free(imagen)??eso no libera la memoria?me kedaria sin imagen no?
  #5 (permalink)  
Antiguo 23/08/2008, 16:57
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda urgente plis

Si la libera, pero lo hace cuando ya la has usado y no la vas a necesitar más, me explico:

Código:
...
printf("escribe el color\n");
scanf("%d",&color);
imagen=(int*)malloc(ancho*alto*sizeof(int)); // Se asigna la memoria
printf("el resultado es %d",repetir(imagen,ancho,alto,color)); // Se usa la memoria y se obtienen los resultados deseados
// como ya no se va a usar más la memoria, porque se va a terminar el programa, la libero
free(imagen);

scanf("%d",&pause); // Solo se hace para poder ver los resultados
return 0; // Se termina el programa
Que extraño que aún no te sirva, pongo el código completo, como lo he probado yo, para que lo pruebes, a ver que tal:
Código:
#include <stdio.h>
#include <stdlib.h>
int repetir(int* img,int ncols, int nfilas, int color);

int main(int argc,char* argv)
{
int alto,ancho,pause;
int* imagen;
int color;

printf("introduce el ancho\n");

scanf("%d",&ancho);
printf("introduce el alto\n");

scanf("%d",&alto);

printf("escribe el color\n");
scanf("%d",&color);
imagen=(int*)malloc(ancho*alto*sizeof(int));
// Inicio todos los datos a 0, 1, 2, 3, 4... para ver con claridad las pruebas.
for(int i=0; i<ancho*alto; i++) *(imagen+i)=i;
printf("el resultado es %d",repetir(imagen,ancho,alto,color));
free(imagen); // Como ya no se necesita se libera la memoria.

scanf("%d",&pause);
return 0;
}

int repetir(int* img,int ncols, int nfilas, int color)
{
int i,j,error;
int mono;
int alto=0;
for (j=0;j<nfilas;j++) {
 for(i=0;i<ncols;i++)
  printf("%d ",*(img + (i + (j*ncols))));
 printf("\n");
}

for(i=0;i<ncols;i++)
{for (j=0;j<nfilas;j++)
// a partir de este punto no he cambiado ni revisado nada
{ mono=*(img+i *0+j);
if ((mono<(color-20))||(mono>(color+40)))

{
printf("ubo un error al comparar %d con %d\n",*(img+i * j),color);
error=1;
i=ncols;
}}}

return error;
}
He puesto en negrita y subrayado las cosas que he modificado del código, si se le pasa como ancho = 2 alto = 2 y color = 2 debería poner en pantalla:
Código:
0 1
2 3
el resultado es 0
  #6 (permalink)  
Antiguo 24/08/2008, 16:38
 
Fecha de Ingreso: agosto-2008
Mensajes: 25
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ayuda urgente plis

Ya me rula, muxas gracias.

Solouna cosita, me podrias explicar la referencia ke aces aki?

*(imagen+i)=i;

eso no se referiria solo al compuesto "i" del puntero de dos dimensiones?:S:S


Es decir no lo pones como aqui --> *(img + (i + (j*ncols))));

No entendo eso y tb si m podrias explicar de esto ultimo como se aria referencia a ello??
es decir a mi me abian enseñado asi *(img+i *ancho+j) pero no como tu lo aces. Me pdrias explicar-?'
Gracias
  #7 (permalink)  
Antiguo 25/08/2008, 02:30
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda urgente plis

Cita:
me podrias explicar la referencia ke aces aki?

*(imagen+i)=i;
for(int i=0; i<ancho*alto; i++) *(imagen+i)=i;

Lo voy a desglosar en partes:

Primero hay que recordar que un apuntador es simplemente un número que indica un determinado sector en la memoria, por ejemplo si tengo un apuntador con valor = 1024 es porque está apuntando al sector 1024 de la memoria.

imagen+i // imagen es un apuntador a un sector de memoria asignado por malloc, es decir es un número, esa memoria es en realidad memoria lineal, por ejemplo si malloc me ha asignado el sector 1024 y he pedido 1024 bytes de memoria, la memoria entre el sector 1024 y 2048 me pertenece, al sumarle i al apuntador lo que estoy haciendo es recorrer la memoria, si i==512 entonces imagen+i es un apuntador a 1536 que está dentro de mi sector de memoria.

*(imagen+i) // aquí lo que se está haciendo es acceder al contenido de la memoria en la posición imagen+i, es lo mismo que el siguiente código:

Código:
int i=612;
int *apuntador;
apuntador=&i; // Se le asigna a "apuntador" la dirección de memoria donde está el valor de i
printf("%d\n", *apuntador); // Si se le quita el * escribe la posición en memoria donde se encuentra i
NOTA: los paréntesis son muy importantes porque si fuese *imagen+i se estaría tomando el valor guardado en imagen y sumándole i a ese valor.

*(imagen+i)=i // está asignando a la posición de memoria imagen+i el valor de i

Cita:
eso no se referiria solo al compuesto "i" del puntero de dos dimensiones?
No te entiendo bien, la memoria siempre es lineal sin importar lo que contenga:

imagen=(int*)malloc(ancho*alto*sizeof(int));
se está solicitando memoria por un tamaño x en este caso ancho*alto*tamaño de int, por ejemplo con ancho y alto igual a 2 tendríamos: 2*2*4 (siendo 4 el tamaño en bytes de un int en un equipo de 32bits) por lo tanto se está pidiendo memoria para almacenar 16 bytes, malloc sólo está retornando un apuntador a un sector de la memoria donde hay al menos 16 bytes libres.
for(int i=0; i<ancho*alto; i++)
Estoy recorriendo toda la memoria asignada ( i<ancho*alto ), suponiendo ancho y alto igual a 3, 3*3=9 por lo que estoy asignando a los 9 int del arreglo el valor de i

Cita:
Es decir no lo pones como aqui --> *(img + (i + (j*ncols))));
Bueno en este caso sólo quise aplicarlo a tu código, como vi que estabas accediendo a la memoria como si fuese una matriz, mantuve la idea para que se adaptara a lo que necesitaras, tal vez puedes resolver el ejercicio leyendo la memoria de la forma simple *(imagen+i), pero como dije:
Cita:
No he revisado que haga bien el trabajo que pone en el ejercicio, sólo me he limitado a revisar que los datos se lean bien desde "imagen"
Cita:
Es decir no lo pones como aqui --> *(img + (i + (j*ncols))));

No entendo eso y tb si m podrias explicar de esto ultimo como se aria referencia a ello??
imaginemos que la siguiente lista es la memoria:

[0][1][2][3][4][5][6][7][8][9][A][B][C][D][E][F]

Esta memoria es el contenido de una matriz de 4 x 4, y queremos acceder al sector x=3 y=2 de la matriz, hay que convertir estos valores en la posición en memoria, sabemos que el tamaño de la matriz es de 4 x 4, entonces:

memoria vista como matriz:

[0][1][2][3] // Fila 0
[4][5][6][7] // Fila 1
[8][9][A][B] // Fila 2 ( esta es la que queremos )
[C][D][E][F] // Fila 3

Fíjate que cada fila tiene 4 columnas (el ancho) por lo que y*ancho (2*4) es el número de elementos que hay antes de la fila que necesitamos ( 8 ) si se le suma la posición en x ya estamos en la posición que necesitamos 8+3=11;

En la posición 11 de la memoria está la [B]

No se me ha ocurrido otra forma de explicarlo, espero que este claro.

Cita:
a mi me abian enseñado asi *(img+i *ancho+j)
Para poder usar ese método los datos tendrían que estar en la memoria de la siguiente forma, para el ejemplo anterior:

[0][4][8][C][1][5][9][D][2][6][A][E][3][7][B][F]
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:54.