|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Eternal Idol
Páginas: 1 ... 43 44 [45] 46 47 ... 205
1101
« en: Miércoles 29 de Octubre de 2008, 08:17 »
Sirve pero en C++ se puede hacer uso de otros paradigmas (Programacion Orientada a Objetos y Programacion Generica) y aprovechar las plantillas de la STL (ademas de declarar variables al vuelo  ) .
1102
« en: Lunes 27 de Octubre de 2008, 11:06 »
En cualquier libro para principiantes se encuentra la respuesta.
1103
« en: Viernes 24 de Octubre de 2008, 21:23 »
1) Supongo que si, para comprobarlo tendria que intentar ensamblar la instruccion en cuestion, mejor lo haces vos que tenes las herramientas y el codigo a mano.
2) A. Guarda AX (que es modificado por shl eax, 16) en DX. B. Restaura AX de DX (que obviamente no sufre modificacion).
Entonces te quedara un eax de este estilo, siendo AX al principio 0FFFFh: 0FFFFFFFFh.
Y los pasos completos (no solo incluyendo esas dos lineas) serian: A. EAX=0000FFFFh por mov al,[col] y mov ah,al. B. EAX=FFFF0000h por el shl eax, 16. C. EAX=FFFFFFFFh por el mox ax, dx.
Todo esto para copiar de 4 bytes cada vez con stosd (D de DWORD, double word, doble palabra, 4 bytes).
Como te dije antes estos juegos - y su codigo claro esta - son arcaicos y obsoletos.
1104
« en: Viernes 24 de Octubre de 2008, 18:22 »
NULL es 0, no hay duda, cualquier otro valor seria una aberracion sin ningun sentido.
1105
« en: Viernes 24 de Octubre de 2008, 14:01 »
Habría que tener en cuenta también lo que han dado en clase.... BAJO NINGUN CONCEPTO. no puedes usar cosas que no hayan dado (o eso creo yo) porque podría decirte que no lo quiere así, que lo quiere como el diga... Ese seria pura y exclusivamente SU problema si es que viene a pedir soluciones a tareas escolares. Espero que te quede claro y vayas comprendiendo la dinamica del foro. GRACIAS.
1106
« en: Jueves 23 de Octubre de 2008, 12:05 »
Asi no lo hagas, ese puntero a caracter (char *) esta apuntando (valga la redundancia) a una posicion indefinida y lo mas probable es que de una excepcion al acceder a memoria invalida. Podes usar memoria estatica o dinamica para leer la cadena.
VC++ advierte del problema: warning C4700: local variable 'str' used without having been initialized.
1107
« en: Martes 21 de Octubre de 2008, 14:46 »
Para copiar desde el primer byte de cada segmento, por eso despues se incrementan (en este caso) y cx se decrementa en cada bucle. Mira los enlaces que deje sobre mov* y rep.
1108
« en: Lunes 20 de Octubre de 2008, 22:22 »
Hola, no hace falta que construyas dinámicamente el array, lo puedes hacer de forma estática en ningun lado use allocacion dinamica de memoria, intenta leer bien mi codigo!

Nadie dijo que lo hubieras hecho, lee nuevamente lo que se dijo ya que es correcto.
1109
« en: Lunes 20 de Octubre de 2008, 20:42 »
No podes usar switch asi: The expression must be of an integral type or of a class type for which there is an unambiguous conversion to integral type. Integral promotion is performed as described in Integral Promotions. Pasalo a numero primero o hace una clase llamada Mes -constructor recibe cadena y sobrecarga el operador () que hace una conversion a entero -.
1111
« en: Sábado 18 de Octubre de 2008, 23:52 »
Podes usar un metodo de la clase pero tiene que ser ESTATICO y por lo tanto carecer de this, normalmente las funciones de callback permiten pasar un parametro que es justamente el objeto en cuestion y despues la funcion de callback recibe y puede trabajar con el usando un casting pero no veo donde se pueda hacer con esta funcion (cvCreateTrackbar). Salvo que ese int que recibe on_trackbar sea para ese proposito ...
1112
« en: Sábado 18 de Octubre de 2008, 23:35 »
El primero incrementa k y el segundo incrementa *k. #include <windows.h> #include <stdio.h> void main() { int x[] = { 0, 1 }; int *k = (int*)&x; printf("k:: 0x%xrn", k); *k++; printf("k:: 0x%xrn", k); printf("x[0] %drn", x[0]); printf("x[1] %drn", x[1]); getchar(); k = (int*)&x; printf("k:: 0x%xrn", k); (*k)++; printf("k:: 0x%xrn", k); printf("x[0] %drn", x[0]); printf("x[1] %drn", x[1]); }
1113
« en: Sábado 18 de Octubre de 2008, 18:36 »
Seguramente tengas hacer el metodo on_trackbar estatico ya que los callbacks no pueden pasarte el valor del objeto this.
1114
« en: Sábado 18 de Octubre de 2008, 18:33 »
De nadas
1115
« en: Sábado 18 de Octubre de 2008, 18:23 »
Tenes que depurar un poco mas:
int comparaCadenas(void *a, void *b){ return ((int)strcpy((char *)a, (char*)b)); //0 si son iguales, > 1 si b < a; < 1 si a < b }
strcpy es string copy, strcmp es lo que queres, string compare.
1116
« en: Sábado 18 de Octubre de 2008, 18:17 »
No uses conio, ni clrscr, ni getch, no son standard. Dos errores claros, en el bucle for usa %c que es para caracter y no %s que es para cadena, despues no podes imprimir la cadena por separado basandote en ese codigo, eso lo podes hacer por ejemplo usando otra cadena y asignandole en cada iteracion del bucle el caracter correspondiente.
1117
« en: Sábado 18 de Octubre de 2008, 17:49 »
Ambos elementos apuntan entre si en el next asi que nunca termina el bucle ...
1118
« en: Sábado 18 de Octubre de 2008, 13:22 »
Entonces olvidemonos del problema original, cerremos el hilo y hagamos otra implementacion mas simple. Si m0skit0 considera valido cambiar el main muy bien, creamos otro hilo, mientras tanto en este el problema es claro: "El destructor me vuelve loco....".
GRACIAS.
1119
« en: Sábado 18 de Octubre de 2008, 12:33 »
Está saliendo un código un poco lioso, no es más fácil implementarle una función a la clase para que concatene dos colas pasadas como parametros? Puede ser pero tal vez la gracia es usar sobrecarga de operadores ... Una pregunta... porque no usais varios archivos... lo introducis todo en un mismo .cpp. Es mucho mejor y más cómodo luego revisar código si los separas en cabeceras (.h) y código (.cpp). En mi caso tengo colaIntDoble.h, colaIntDoble.cpp y main.cpp. Es solo por comentar... no reprocho nada xDDD Ciertamente es preferible modularizar el codigo pero para resolver este problema es irrelevante (y cuantos menos archivos haya que subir/bajar de la red mejor).
1120
« en: Sábado 18 de Octubre de 2008, 10:16 »
¿Cómo no? Ese objeto se asigna a la vuelta de la función (en este caso a cola3) y se llama a su destructor. ¿O me estoy equivocando? Eso (casi, el delete obviamente es manual) pasaria si cola3 fuera un puntero, como NO lo es, simplemente se asigna un puntero (pCabecera) pero cola3 siempre apunta a la misma direccion de memoria en la pila. EDIT: efectivamente, la depuración dice que sí se destruye. Es la misma dirección de memoria (del pCabecera) la que se la asigna a aux en el operador que a la hora de destruir cola3. ¡Por fin! Nopes, ciertamente cola3.pCabecera es la misma direccion que paux = this-> pCabecera pero cola3 (&cola3 si queres) no es la misma que aux = new cColaEnteros;. Para comprobarlo experimentalmente lo que hice fue sobrecargar new y delete en la clase ... se llama a un new y nunca a delete. Tene en cuenta que el destructor de cColaEnteros se llama por cola1, cola2 y cola3, jamas para el objeto creado dinamicamente (otra cosa es que este objeto, cola3, comparta campos - punteros - que son liberados con el objeto creado dinamicamente, pero no es suficiente para liberar el objeto en si mismo). Una forma de solucionarlo simple pasa por liberar ese objeto en el operador de asignacion, por ejemplo de esta otra manera: cColaEnteros &cColaEnteros::operator + (cColaEnteros &cola) { cColaEnteros * aux; tNodoCola * paux; aux = new cColaEnteros(false); //la unica diferencia es que pasamos false al constructor //sigue como siempre } cColaEnteros::cColaEnteros(bool fMemory = true) { pCabecera = new tCabeceraCola; pCabecera->primero = NULL; pCabecera->ultimo = NULL; pCabecera->numelementos = 0; freeMemory = fMemory; //miembro privado freeMemory, indica si liberamos o no la memoria DENTRO el objeto } cColaEnteros::~cColaEnteros(void) { tNodoCola * aux1, * aux2; if (!freeMemory) { return; } //si fue creado por el operador + solo liberamos el objeto de la clase cColaEnteros, en sintesis los 4 bytes del puntero a pCabecera, y retornamos sin tocar lo de adentro //sigue como siempre } cColaEnteros& operator= (/*const*/ cColaEnteros& param) { pCabecera = param.pCabecera; //lo unico que hace el operador de asignacion normalmente delete ¶m; //ahora si, liberamos lo reservado en aux = new cColaEnteros; return *this; //lo unico que hace el operador de asignacion normalmente } En cColaEnteros agregamos un miembro privado de tipo bool llamado freeMemory.
Puede que me confunda pero creo que al final lo que hace la STL es algo asi, devolviendo por valor y marcando la no destruccion interna (nos olvidamos de new, delete y el operador =): cColaEnteros cColaEnteros::operator + (cColaEnteros &cola) { cColaEnteros aux(false); //objeto temporal señalado para no destruir internamente en el destructor ... el objeto en si mismo es destruido despues de la asignacion, estas dos afirmaciones son clave para garantizar que pCabecera es valido. No puede sobreescribirse el puntero pCabecera ya que la asignacion es anterior a su destruccion y no tocamos los campos internos por lo que al usarlos desde el operando de la asignacion seran validos. paux = this->pCabecera->primero; while (paux) { aux.Insertar_Elemento_Ultimo(paux->valor); paux = paux->sig; } paux = cola.pCabecera->primero; while (paux) { aux.Insertar_Elemento_Ultimo(paux->valor); paux = paux->sig; } return aux; } cColaEnteros::~cColaEnteros(void) //es lo mismo que la solucion anterior { tNodoCola * aux1, * aux2; if (!freeMemory) { return; } //si fue creado por el operador + solo liberamos el objeto de la clase cColaEnteros, en sintesis los 4 bytes del puntero a pCabecera, y retornamos sin tocar lo de adentro //sigue como siempre } cColaEnteros::cColaEnteros(bool fMemory = true) //es lo mismo que la solucion anterior { pCabecera = new tCabeceraCola; pCabecera->primero = NULL; pCabecera->ultimo = NULL; pCabecera->numelementos = 0; freeMemory = fMemory; //miembro privado freeMemory, indica si liberamos o no la memoria DENTRO el objeto }
1121
« en: Sábado 18 de Octubre de 2008, 03:42 »
Mierda, funciona pero tiene un memory leak de esta manera, nadie llama a delete por este new: aux = new cColaEnteros;. Todos los ejemplos que encuentro devuelven por VALOR (usando un objeto temporal!  ) y ninguno parece funcionar en este caso ya que como vimos el destructor es llamado al terminar el operador y los valores son basura desde ese momento en adelante. Si usaras punteros no habria problema  Un hack para que funcione usando como decias el operador =: bool cColaEnteros::Esta_Vacia(void) { return pCabecera ? !pCabecera->numelementos : true; } cColaEnteros& operator= (/*const*/ cColaEnteros& param) { pCabecera = param.pCabecera; param.pCabecera = 0; delete ¶m; return *this; }
O tambien en combinacion con el operador = usar un constructor especial con un parametro tipo allocatedMemory a true en el operador + y comprobar eso en el destructor antes de llamar a Esta_Vacia, creo que la STL hace algo parecido a esto. Igual no me cierra el tema todavia ...
1122
« en: Sábado 18 de Octubre de 2008, 01:24 »
Sí, tienes razón, sí que funciona mejor con el & (no sé cómo demonios lo puse antes ), pero da otro error de puntero corrupto al ejecutar el destructor de cola3 (sé que es cola3 porque primero pasa por cola1 y cola2): ¿Miraste el codigo generado? En el mio al menos se destruyen en orden inverso (cola3, cola2, cola1) y sin problemas ...
1123
« en: Sábado 18 de Octubre de 2008, 01:02 »
Subi el codigo, el ejecutable y el pdb ... sino compilalo desde linea de comandos y fijate que pasa ... EDIT: Ahora que lo pienso, es posible que a ti te salgan los números raros porque te accede a una memoria accesible por tu proceso, y en el mío no, ya que los valores que pueden tomar las referencias erróneas diferirán en cada PC. Si, muy bien, pero eso solo pasa cuando se usa el operador + con los parametros por valor y el destructor liberando la memoria. Fijate CUANDO se llama al destructor depurando ...
1124
« en: Sábado 18 de Octubre de 2008, 00:44 »
¿Recompilaste? ¿No es este el output que queres acaso?: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10
Sin ese cambio se obtenia un loop infinito con numeros sin sentido ...
Acabo de volver a bajar tu codigo:
1. Compilo y ejecuto, sale el output de arriba. 2. Descomento el destructor, salen numeros hasta que me canso y le doy a ctrl+c. 3. Agrego las referencias mencionadas, sale el output de arriba.
Todo esto simplemente haciendo cl archivo.cpp (o mejor cl archivo.cpp /EHsc /Zi). VC++ 8 (Visual Studio 2005).
1125
« en: Viernes 17 de Octubre de 2008, 22:46 »
Como te decia antes simplemente cambiando la signature del operador solucionas el problema:
cColaEnteros &operator + (cColaEnteros &cola);
cColaEnteros &operator + (cColaEnteros &cola) { //tu codigo actual }
Páginas: 1 ... 43 44 [45] 46 47 ... 205
|
|
|