Título: Ayuda!! duda en un programa Publicado por: BlerofonT en 4 Junio 2012, 22:05 pm Buenos dias chic@s. Tengo una duda con un programa. Realmente le he hecho de dos formas, de la primera no funciona y de la segunda si. Como estoy aprendiendo programacion, me gustaria que alguien me explique porke narices no funciona la primera(creo que es relacionado con el paso por punteros o direcciones de memoria, pero no lo se...). Aqui dejo el codigo. No os asusteis porke sea muy largo, con que mireis la ultima funcion llamada "eliminar"(elimina una estructura de un arreglo) que es donde esta el problema, ya vale(dejo el programa por si alguien le kiere ejecutar y para que se entienda mejor). El problema es que aunque paso a la funcion el arreglo como puntero, no me elimina la estructura del arreglo(aunke la "n" si disminuye una unidad). Realmente parece que si la elimina(si miramos las llamadas a visualizar), pero no llega bien a la funcion main. Supongo para alguien que sepa programar bien la duda sera estupida, pero yo no lo entiendo :(
Gracias a todos!!! Código
Funcion "eliminar" corregida y SI FUNCIONA: Código
El problema esta en: Código
que lo he cambiado por lo siguiente y si funciona: Código
Título: Re: Ayuda!! duda en un programa Publicado por: durasno en 5 Junio 2012, 08:10 am Hola! una pregunta esto es C++??? porque veo q usas int &n, creo q en C++ usan & en los parametros de la funcion, a menos q en C tambien se emplee y no me entere :)...
Te respondo como si esto fuese C: es raro que te deje compilar con Código el compilador deberia darte error. El problema es que "x" y "auxiliar" son arreglos; a pesar de q son arreglos de estructuras, para asignar uno a otro siempre se hace copiando cada elemento(como si fuesen arreglos comunes). Es por eso que te funciona bien con Código
Saludos PD: la asignacion de estructuras si es valida, la de arreglos no Título: Re: Ayuda!! duda en un programa Publicado por: BlerofonT en 5 Junio 2012, 10:46 am Gracias por la ayuda durasno!! El codigo es C++ y efectivamente es un paso por referencia el int &n. La verdad que no sabia que para copiar los arreglos tenias que ir elemento a elemento, asike muchas gracias. Yo pense que como los nombres de los arreglos (x y auxiliar en mi caso) son direcciones de memoria del primer elemento del arreglo, pense que asignando x = auxiliar; me serviria(que por cierto no da ERROR).
Lo que me extraña mucho es que si te fijas en las funciones visualizar que tenemos justo debajo de x = auxiliar; , ambas lo muestran correctamente, con el elemento eliminado. E problema es que cuando vuelvo a la funcion "main" y tengo una nueva llamada a visualizar(justo el case 8 del switch) con el arreglo "producto" que deberia ser el mismo que el arreglo "x" de la funcion eliminar, pues este arreglo muestra un elemento menos(ya que pase la n por referencia) pero no elimina el que yo keria, sino el ultimo. ¿Alguien sabe porque? Título: Re: Ayuda!! duda en un programa Publicado por: maxim_o en 5 Junio 2012, 11:09 am Supongo que será por que n no es un puntero y esa funcion tampoco devuelve nada... por lo que el n-- que haces en la funcion eliminar en la funcion main no se "resta"... (es la unica diferencia que puedo ver desde la llamada visualizar de la funcion eliminar a la del main... en el main n vale 1 mas...
Además en esa funcion (eliminar), pasas la n como referencia, pero a la hora de llamarla no le pasas un puntero? le pasas un int normal y corriente? O estoy muy perdido yo... o ahí falla algo.... Y igual saldria bien cada vez que elimines rellenar de valor nulo la ultima posicion o entonces tendras que usar la n como puntero siempre para que una vez la modifiques en una funcion este en el main modificada tambien? Me explico ("con numeros"); si un arreglo tiene 5 1 3 4 5 Imagina que el array es de tamaño 10 (posiciones de 0 -9), y decides borrar el 3... copiaria en auxiliar el 5 1 4 5 y luego al volver a su "array original") pondria 5 1 4 5 (pero el ultimo 5 no está borrado....) por lo que quedaria 5 1 4 5 5 Título: Re: Ayuda!! duda en un programa Publicado por: BlerofonT en 5 Junio 2012, 12:05 pm Hola de nuevo!!! Gracias maxim_o!!! Pero tu ejemplo del final con numeros no esta bien, te explico.
El codigo es C++ por eso hago el paso por referencia del entero "n"(no hace falta pasarle un puntero) y funciona perfecto. El problema con numeros es: Yo tengo el array 1 3 5 7 9, llamo a eliminar y quiero borrar por ejemplo 5, entonces me retorna 1 3 5 7 (sin el 9) ya que como he dicho, la "n" si que se resta una unidad, pero el array cambia de tamaño(uno menos) pero no cambia sus elementos. En cambio, coloqué las llamadas a visualizar dentro de la funcion "eliminar" y al visualizar "auxiliar" se ve 1 3 7 9 y lo mas gracioso es que si visualizo "x" tambien se ve 1 3 7 9, EL PROBLEMA es que al retornar a main y llamar a visualizar con "producto" (que deberia ser igual que "x" debido a la llamada de la funcion "eliminar"), se visualiza como dije al principio 1 3 5 7. ¿Alguien me puede ayudar?... no lo entiendo :( Título: Re: Ayuda!! duda en un programa Publicado por: Ferno en 5 Junio 2012, 16:30 pm Estoy casi seguro que es un problema de referencias.
Prueba esto en tu función eliminar: Código
Título: Re: Ayuda!! duda en un programa Publicado por: STANHMAL en 5 Junio 2012, 17:01 pm Wenaz,
El código es C no C++, ahora te explico porque no funciona de ambas maneras : Código
Cuando lo haces de esta forma estas asignándole a la variable x el valor que tiene auxiliar, pero como x y auxiliar no son simples variables, si no que son arreglos de variables, y para copiar un arreglo en otro, es necesario hacerlo elemento por elemento, tal y como lo haces de la segunda forma : Código
Veo que usas variables de tipo bool, es incorrecto usarlas, pues son de C++ y no de C, te recomiendo hacer un enum para no tener que modificar tanto así: Código
y su utilización así : Código
es decir donde estas declarando las bool, le antepones el enum y listo. bien, aparte de eso tienes otro reguero de cosas que no deberías de hacer, pásate por este post : |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html) $4!u2 Título: Re: Ayuda!! duda en un programa Publicado por: maxim_o en 5 Junio 2012, 19:06 pm El ha dicho que es C++....
aunque mas bien es una mezcla de ambos... Título: Re: Ayuda!! duda en un programa Publicado por: durasno en 5 Junio 2012, 21:48 pm Hola! es raro lo que te pasa, asi que decidi adapatarlo a C puro :P (sacando el & de las funciones, paso n por valor y retorno esa n....) lo compile y probe el problema que decias, a mi me anda perfecto. Elimino y despues imprime correctamente ya sea desde el main o desde la funcion.
Seguro es como dijo ferno, tenes un problema de referencias pero eso ya pasa a un problema de C++, xq a mi me anda :) Saludos Título: Re: Ayuda!! duda en un programa Publicado por: BlerofonT en 5 Junio 2012, 22:55 pm Hola chic@s!!!
Primero de todo agradecer de nuevo a durasno, maxim_o, STANHMAL y ferno por vuestra ayuda (gracias tambien a STANHMAL por indicarme otros errores y pasarme el link, ya q para la gente q estamos empezando es una buena ayuda). Bueno esta tarde a las 2:00 di con el problema pero me tuve q ir de casa, asike paso a indicarosle por si stais interesados,jejeje.(Por cierto el codigo es una mezcla de C y C++ como habeis dicho, pero esque me compre un libro para empezar que es bastante bueno, y explica junto el C y C++ y segun el libro lo de C te vale para C++ asike siempre guardo como .cpp) SOLUCION DEL PROBLEMA El problema esta en la linea "x = auxiliar;" (como dijo STANHMAL) que en principio no da ERROR ya que "auxiliar" si es un array pero "x" es una direccion de memoria y lo que hace es asignarle la direccion de memoria del primer elemento de "auxiliar" a "x". Cual es el problema, las direcciones de memoria. Al llamar a la funcion la paso como parametro "producto" cuya posicion es ABCF001 y se la asigna a "x", luego la posicion de "x" es ABCF001. Posteriormente se crea el array "auxiliar[ELEM]" cuya direccion de memoria del primer elemento (escribiendo "auxiliar") es CDEF005. Despues hago todo bien, peeeeero llegamos a "x = auxiliar;" sin haber cambiado nada en "x", y por tanto no he cambiado nada en "producto", y al hacer "x = auxiliar;" la "x" pasa a valer CDEF005. Por lo que justo antes de retornar a main, tenemos: auxiliar => Direccion: CDEF005 => array con el elemento bien eliminado x => Direccion: CDEF005 => apunta a "auxiliar" luego apunta al array con el elemento bien eliminado producto => Direccion: ABCF001 => array que en ningun momento se modifico, ya que o le tenia que haber modificado antes de "x = auxiliar;" o sino tenia q tener actualmente la direccion CDEF005 Espero se me haya entendido :D Por lo tanto, uso el bucefor. Ya dije desde el principio que el programa funcionaba con el bucle, pero solo estaba interesado en entender el problema de porque no funcionaba de la otra forma. Ahora ya sta todo claro. NOTAS Ferno Estaba casi convencido cuando lei tu mensaje que funcionaria tal y como tu decias, ya que ya entendia el problema q tenia yo primero y tu solucion me parecia buena, pero fui a compilar y me dio ERROR, este era: "In function 'void eliminar(Producto*, int&)': non-Ivalue in assignment" que si alguien sabe lo que significa que me lo explike, q stoy aprendiendo!!!!jejeje Saludos a todos!!! Título: Re: Ayuda!! duda en un programa Publicado por: STANHMAL en 6 Junio 2012, 04:58 am ...(Por cierto el codigo es una mezcla de C y C++ como habeis dicho, pero esque me compre un libro para empezar que es bastante bueno, y explica junto el C y C++ y segun el libro lo de C te vale para C++ asike siempre guardo como .cpp) ... Es correcto que todo lo de C es aplicable en C++, pero la idea es no combinar estos dos, que libro compraste? $4!u2 Título: Re: Ayuda!! duda en un programa Publicado por: BlerofonT en 6 Junio 2012, 10:56 am Es correcto que todo lo de C es aplicable en C++, pero la idea es no combinar estos dos, que libro compraste? $4!u2 "Manual imprescindible C/C++. Edicion actualizada 2012" Ed: Anaya Multimedia. Auto: M.A. Acera Lei en foros y decian q staba bastante bien, y a mi la verdad me gusto mucho y le recomiendo. Tambien tengo alquilado de la biblioteca el de Deitel/Deitel de C/C++, pero ese le uso para dudas, porke leerme ese PEDAZO de libro creo q tardaria un año...jejeje Empece en Marzo y ahora sigo por mi cuenta haciendo ejercicios, ¿me recomiendas algun libro o manual de internet? Título: Re: Ayuda!! duda en un programa Publicado por: elkiy en 6 Junio 2012, 18:09 pm Hola, mira no se mucho de esto, pero te recomiendo usar enves de #define, una constante. Saludos
Título: Re: Ayuda!! duda en un programa Publicado por: STANHMAL en 8 Junio 2012, 17:53 pm "Manual imprescindible C/C++. Edicion actualizada 2012" Ed: Anaya Multimedia. Auto: M.A. Acera ... Holas, no encontré el libro para mirarlo a ver que tal es, pero igual, no te quedes con solo ese libro, mira varios, ya que no en todos enseñan los mismos "trucos" y demás, el de deitel & deitel "Cómo programar en C/C++ y Java" (Cuarta edición), es muy bueno, esta bien explicado. $4!u2 |