qt - socioeconomica - Falla de segmentación de Qshow
segmentacion socioeconomica marketing (1)
Hay un par de manchas que pueden causar problemas en su ejemplo. Enfatizo que aquí, como ocuparse de los problemas de memoria puede ser muy dependiente de qué biblioteca tiene su gestión de memoria.
En primer lugar, deseará notificar a qtHaskell cuando se debe ejecutar la recolección de basura. on_hello_clicked
esto al final de su rutina on_hello_clicked
. La llamada apropiada es returnGC
. También es una buena idea colocar otra llamada a returnGC
al final de su función main
.
En segundo lugar, su función principal es especificar un parámetro entero que no existe. Debes especificar main
como main :: IO ()
Entonces, el código completo sería:
module Main where
import Qtc.Classes.Qccs
import Qtc.Classes.Gui
import Qtc.ClassTypes.Gui
import Qtc.Core.Base
import Qtc.Gui.Base
import Qtc.Gui.QApplication
import Qtc.Gui.QWidget
import Qtc.Gui.QPushButton
import Qtc.Gui.QAbstractButton
import Qtc.Gui.QMessageBox
type MyQPushButton = QPushButtonSc (CMyQPushButton)
data CMyQPushButton = CMyQPushButton
myQPushButton :: String -> IO (MyQPushButton)
myQPushButton b = qSubClass $ qPushButton b
main :: IO ()
main = do
qApplication ()
hello <- myQPushButton "Hello qtHaskell World"
resize hello (200::Int, 60::Int)
mb <- qMessageBox hello
connectSlot hello "clicked()" hello "click()" $ on_hello_clicked mb
qshow hello ()
qApplicationExec ()
returnGC
on_hello_clicked :: QMessageBox () -> MyQPushButton -> IO ()
on_hello_clicked mb this
= do
tt <- text this ()
setText mb $ "You have clicked " ++ tt
qshow mb ()
returnGC
Esto compila y funciona muy bien en Windows XP + Cygwin y MacOS 10.6
setText mb $ "Hello World"
qshow mb () -- Segmentation Failt
--print ("Hello world") -- it works
Estoy usando qtHaskell, pero el único problema que encontré aquí es la falla de segmentación de qshow.
¿Puede alguien tener alguna idea de cómo puedo tratar de solucionarlo?
gracias.
agregado: código de programa completo:
module Main where
import Qtc.Classes.Qccs
import Qtc.Classes.Gui
import Qtc.ClassTypes.Gui
import Qtc.Core.Base
import Qtc.Gui.Base
import Qtc.Gui.QApplication
import Qtc.Gui.QWidget
import Qtc.Gui.QPushButton
import Qtc.Gui.QAbstractButton
import Qtc.Gui.QMessageBox
type MyQPushButton = QPushButtonSc (CMyQPushButton)
data CMyQPushButton = CMyQPushButton
myQPushButton :: String -> IO (MyQPushButton)
myQPushButton b = qSubClass $ qPushButton b
main :: IO Int
main = do
qApplication ()
hello <- myQPushButton "Hello qtHaskell World"
resize hello (200::Int, 60::Int)
mb <- qMessageBox hello
connectSlot hello "clicked()" hello "click()" $ on_hello_clicked mb
qshow hello ()
qApplicationExec ()
on_hello_clicked :: QMessageBox () -> MyQPushButton -> IO ()
on_hello_clicked mb this
= do
tt <- text this ()
setText mb $ "You have clicked " ++ tt
qshow mb ()
registro valgrind agregado
> > ncdy@Cndy ~/Haskell $ valgrind ./a
> ==13467== Memcheck, a memory error detector
> ==13467== Copyright (C) 2002-2010, and GNU GPL''d, by Julian Seward et al.
> ==13467== Using Valgrind-3.6.0 and LibVEX; rerun with -h for copyright
> info
> ==13467== Command: ./a
> ==13467==
>
> ==13467== Syscall param writev(vector[...]) points to
> uninitialised byte(s)
> ==13467== at 0x40008D2: ??? (in /lib/ld-2.11.2.so)
> ==13467== Address 0x6e85d97 is 2,703 bytes inside a block of size 16,384
> alloc''d
> ==13467== at 0x4027834: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
> ==13467== by 0x69C4BD4: XOpenDisplay (in
> /usr/lib/libX11.so.6.3.0)
> ==13467== by 0x4C505F53: ???
> ==13467==
> ==13467==
> ==13467== Process terminating with default action of signal 11 (SIGSEGV)
> ==13467== General Protection Fault
> ==13467== at 0x5957480: ??? (in /usr/lib/qt4/libQtGui.so.4.7.1)
> ==13467== by 0x5B5FD81: ??? (in /usr/lib/qt4/libQtGui.so.4.7.1)
> ==13467== by 0x5B6BC19: ??? (in /usr/lib/qt4/libQtGui.so.4.7.1)
> ==13467== by 0x5B71B3C: ??? (in /usr/lib/qt4/libQtGui.so.4.7.1)
> ==13467== by 0x5AE757D: QPainter::drawPixmap(QRectF const&,
> QPixmap const&, QRectF const&) (in
> /usr/lib/qt4/libQtGui.so.4.7.1)
> ==13467== by 0xA71AA68: Oxygen::Helper::renderWindowBackground(QPainter*,
> QRect const&, QWidget const*, QWidget
> const*, QColor const&, int, int) (in
> /usr/lib/liboxygenstyle.so.4.5.0)
> ==13467== Invalid free() / delete / delete[]
> ==13467== at 0x402868B: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
> ==13467== by 0x52F78DB: ??? (in /lib/libc-2.11.2.so)
> ==13467== by 0x105FFFF: ???
> ==13467== Address 0x5133a98 is not stack''d, malloc''d or (recently) free''d
> ==13467==
> ==13467==
> ==13467== HEAP SUMMARY:
> ==13467== in use at exit: 1,968,209 bytes in 27,864 blocks
> ==13467== total heap usage: 65,595 allocs, 37,732 frees, 6,175,162 bytes
> allocated
> ==13467==
> ==13467== LEAK SUMMARY:
> ==13467== definitely lost: 18,054 bytes in 259 blocks
> ==13467== indirectly lost: 94,591 bytes in 628 blocks
> ==13467== possibly lost: 489,039 bytes in 5,656 blocks
> ==13467== still reachable: 1,366,525 bytes in 21,321 blocks
> ==13467== suppressed: 0 bytes in 0 blocks
> ==13467== Rerun with --leak-check=full to see details of leaked memory
> ==13467==
> ==13467== For counts of detected and suppressed errors, rerun with: -v
> ==13467== Use --track-origins=yes to see where uninitialised values come
> from
> ==13467== ERROR SUMMARY: 3 errors from 2 contexts (suppressed: 15 from 8)
> Segmentation fault
agregado: comando de compilación
ghc --make -package qt -fglasgow-exts -O2 -o a HCK.hs -i
@Foo Bah, la pregunta fue hecha el 18 de diciembre, no puedo estar seguro con mis respuestas, pero el sistema operativo era Windows7, dime qué es exactamente lo que puedo decir sobre el sistema.
@Vlad Lazarenko lo sé, pero seguro que era Windows)
@Foo Bah Usando cygwin, ¿eh? Donde necesito usarlo? Estoy en esta máquina y puedo hacer otra prueba para qtHaskell y verificar la situación actual, pero supongo que habrá otras versiones.