|
61
|
Programación / Programación C/C++ / [C++][Consulta] Error inesperado con destructor
|
en: 3 Febrero 2017, 04:28 am
|
Hola, muy buenas. Estoy realizando un árbol binario en C++. Lo estoy encapsulando en una clase. Como cualquier árbol binario, este tiene un dato, un puntero a la izquierda y otro a la derecha. El problema es que al llamar al destructor (el cual lo elimina), el programa finaliza brúscamente. El constructor es el siguiente: template <typename T> class ArbolBinario { private: T dato; ArbolBinario *izda; ArbolBinario *dcha; void Eliminar(ArbolBinario *rama) { if(NULL != rama->izda) Eliminar(rama->izda); if(NULL != rama->dcha) Eliminar(rama->dcha); delete rama; } public: [...] ~ArbolBinario() { EliminarRamaIzda(); EliminarRamaDcha(); } [...] void EliminarRamaIzda() { if(NULL != izda) { Eliminar(izda); izda = NULL; } } void EliminarRamaDcha() { if(NULL != dcha) { Eliminar(dcha); dcha = NULL; } } [...] };
Este es la función main: int main() { ArbolBinario<int> arbol; arbol.SetDato(7, ""); arbol.ReemplazarRamaIzda(20, ""); arbol.ReemplazarRamaIzda(5, "0"); arbol.ReemplazarRamaDcha(7, "00"); arbol.ReemplazarRamaDcha(4, "0"); arbol.ReemplazarRamaIzda(1, "01"); arbol.ReemplazarRamaDcha(2, "01"); arbol.ReemplazarRamaDcha(8, ""); arbol.ReemplazarRamaIzda(10, "1"); cout << arbol.ToString(); return 0; }
Cuando uso el depurador, pongo un punto de ruptura en el destructor, y obtengo lo siguiente: Breakpoint 1, ArbolBinario<int>::~ArbolBinario (this=0x28fddc, __in_chrg=<optimized out>) at main.cpp:84 84 EliminarRamaIzda(); (gdb) continue Continuing.
Breakpoint 1, ArbolBinario<int>::~ArbolBinario (this=0x720fb0, __in_chrg=<optimized out>) at main.cpp:84 84 EliminarRamaIzda(); (gdb) continue Continuing.
Breakpoint 1, ArbolBinario<int>::~ArbolBinario (this=0x7212f0, __in_chrg=<optimized out>) at main.cpp:84 84 EliminarRamaIzda(); (gdb) continue Continuing.
Program received signal SIGSEGV, Segmentation fault. 0x004099bb in ArbolBinario<int>::Eliminar (this=0x0, arbol=0x726f58) at main.cpp:13 13 void Eliminar(ArbolBinario *arbol) { Lo que no sé es: ¿por qué se llama 3 veces al constructor? En la última llamada, ¿por qué el puntero this vale 0 (supongo que por esto el programa crashea)? Muchas gracias
|
|
|
62
|
Informática / Electrónica / (Arduino) ¿Qué estructura de paquete me recomiendan para comunicación serial?
|
en: 29 Enero 2017, 22:26 pm
|
Hola, muy buenas! Estoy estableciendo una comunicación serial entre mi Arduino y mi PC, pero me doy cuenta de que pierdo a veces algún byte. Entonces creo que usar un sistema de paquetes evitaría este problema en mayor medida (lo he supuesto, no demostrado). Me baso en que la transmisión de datos por red se hace por paquetes.
Entonces la pregunta es: ¿qué estructura de paquete me aconsejan que tenga? Principalmente espero enviar variables tipo entero pero quizás envíe otras cosas.
Sé que la estructura básica (y lógica) de estos es:
Cabecera Datos Cola
Lo que no sé es cuantos bytes debería ocupar cada cosa, sobre todo los datos. En la cabecera no tengo ni idea de qué debería incluir, y en la cola tampoco.
Muchas gracias!
|
|
|
63
|
Programación / Programación C/C++ / Re: Me pueden ayudar a convertir este codigo C++ a C
|
en: 16 Enero 2017, 09:00 am
|
eso no es C++, eso es arduino que es más parecido a java que otra cosa...
teoricamente y si tienes las funciones predefinidas, de get_corriente en adelante es 100% compatible con C
En realidad, si que es C++. Usa un compilador en C++. He aquí el código que se incluye (el cual incluye la función main). #include <Arduino.h> int atexit(void (* /*func*/ )()) { return 0; } void initVariant() __attribute__((weak)); void initVariant() { } void setupUSB() __attribute__((weak)); void setupUSB() { } int main(void) { init(); initVariant(); #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } return 0; }
|
|
|
64
|
Programación / Programación C/C++ / Re: Doble buffer en OpenGL (glfw)
|
en: 16 Enero 2017, 08:48 am
|
Seguramente hayas quitado del while la función glfwPollEvents(). Lo que hace esta función es actualizar los eventos que le manda Windows o los periféricos, y si no se actualizan, Windows entiende que la aplicación se ha quedado colgada.
|
|
|
65
|
Programación / Programación C/C++ / Re: aprender a usar la API de windows.
|
en: 7 Enero 2017, 06:05 am
|
La API de Windows se compone principalmente de funciones y estructuras. Si no sabes muy bien qué significan estos términos, mejor aprende primero a programar bien en C o en C++ (aconsejo C porque la API de Windows se basa en C). Si sabes bien lo que es una estructura o función, aprender la API de Windows es tan "simple" como ver de qué funciones dispone y tal. Si no entiendes el funcionamiento de alguna función puedes preguntarlo. Aquí dejo un tutorial en español sobre creación de ventanas, diálogos... con la API de Windows: http://winapi.conclase.net/curso/index.php
|
|
|
66
|
Programación / Programación C/C++ / Re: Ayuda con ejercicio basico en C
|
en: 11 Diciembre 2016, 19:31 pm
|
void leerMediciones(int m[NUMPIPETAS][MAXMEDICIONES])
Ni en C ni en C++ puedes pasar arreglos multidimensionales por parámetros, lo que puedes pasar son punteros dobles. Cuando haces este prototipo, el programa compila, pero cuando llamas a la función con un arreglo multidimensional, este se convierte a puntero a puntero, por lo que produce efectos indeterminados.
|
|
|
67
|
Sistemas Operativos / GNU/Linux / Re: (Consulta) Instalar Dual-Boot desde Ubuntu 16.04
|
en: 13 Noviembre 2016, 22:08 pm
|
Cuando intento instalar el grub-customizer, me sale que hay dependencias que no son instalables: grub-customizer:i386 : Depende: libatkmm-1.6-1:i386 (>= 2.22.1) pero no es instalable Depende: libcairomm-1.0-1:i386 (>= 1.6.4) pero no es instalable Depende: libglibmm-2.4-1c2a:i386 (>= 2.32.0) pero no es instalable Depende: libgtkmm-2.4-1c2a:i386 (>= 1:2.24.0) pero no es instalable Depende: libpangomm-1.4-1:i386 (>= 2.27.1) pero no es instalable Depende: libsigc++-2.0-0c2a:i386 (>= 2.0.2) pero no es instalable Recomienda: hwinfo:i386 pero no va a instalarse
|
|
|
68
|
Sistemas Operativos / GNU/Linux / Re: (Consulta) Instalar Dual-Boot desde Ubuntu 16.04
|
en: 13 Noviembre 2016, 15:36 pm
|
Esto es muy curioso... He cambiado la configuración de la bios de "Legacy support" a "UEFI", y ha arrancado desde linux, y cuando cambio de nuevo a "Legacy support", arranca desde Ubuntu...
He probado ese Super Grub Disk. Quizás sea ese "gestor" el que me permite hacer lo que he descrito antes, pero no he conseguido instalar ningún "cargador de cargadores de sistemas operativos" con ese cargador... Ahora que puedo trabajar desde Windows, ¿cómo podría hacer para instalar un cargador de cargadores de sistemas operativos desde Windows? Según tengo entendido, es más sencillo.
Muchas gracias
|
|
|
69
|
Sistemas Operativos / GNU/Linux / (Consulta) Instalar Dual-Boot desde Ubuntu 16.04
|
en: 12 Noviembre 2016, 22:52 pm
|
Hola, muy buenas. En mi afán por preservar Windows, pero a su vez poder usar Ubuntu sin una molesta máquina virtual, decidí instalar Ubuntu desde Windows. Después de una serie de problemas (básicamente Ubuntu no detectaba Windows 8.1), desde Windows creé una partición para Ubuntu, creé desde el instalador de Ubuntu las particiones swap, el directorio raíz, y un MB de partición para (supongo) la MBR (seleccioné algo de BIOS). El caso es que no esperaba que directamente me dejara la opción de seleccionar sistema operativo, pero lo que si esperaba es que el ordenador arrancara desde Windows. No es un problema grave (creo), porque no he perdido mis datos. En resumidas cuentas, me gustaría saber cómo puedo instalar algo parecido (sino este) al Dual-Boot desde Ubuntu. Muchas gracias! ______________________________________ Cuando ejecuto "sudo fdisk -l | grep sda", me sale: Disk /dev/sda: 465,8 GiB, 500107862016 bytes, 976773168 sectors /dev/sda1 2048 616447 614400 300M Windows recovery environment /dev/sda2 616448 821247 204800 100M EFI System /dev/sda3 821248 1083391 262144 128M Microsoft reserved /dev/sda4 1083392 554534911 553451520 263,9G Microsoft basic data /dev/sda5 554534912 554536959 2048 1M BIOS boot /dev/sda6 970913792 976771071 5857280 2,8G Linux swap /dev/sda7 554536960 970913791 416376832 198,6G Linux filesystem
|
|
|
70
|
Foros Generales / Dudas Generales / (wxMaxima) Consulta sobre enunciado de un ejercicio (conjuntos y ordenación)
|
en: 4 Noviembre 2016, 00:04 am
|
Hola, muy buenas. Antes de nada, quiero aclarar que no voy a pedir que se me haga el ejercicio. Simplemente me gustaría que se me explicase una parte del enunciado que, sinceramente, no entiendo. El enunciado es el siguiente: Sea X = {1, 2, 3, 4, 5, 6, 7}, e Y = X x X x X. Consideramos en X el orden lexicográfico. Dadas las siguientes parejas x,y pertenecientes a Y determina quien es mayor, y encuentra el conjunto de todos los elementos de Y comprendidos entre x e y.
* x = (4, 2, 1), y = (5, 6, 2) * x = (1, 4, 7), y = (7, 4, 1) * x = (6, 4, 5), y = (2, 4, 1) El ejercicio lo tengo que hacer en wxMaxima, el cual es un programa para el manejo de varios objetos matemáticos, como conjuntos, listas, funciones (aplicaciones)... Bien, la parte que no entiendo que quiere decir es esta: Consideramos en X el orden lexicográfico¿Qué quiere decir con que consideremos en X el orden lexicográfico? Sé lo que es el orden lexicográfico, pero no sé qué quiere decir eso de "consideremos en X ..." ¡Muchas gracias por su ayuda!
|
|
|
|
|
|
|