setText mb $ "Hello World"
qshow mb () -- Segmentation Failt
--print ("Hello world") -- it works
I'm using qtHaskell but the only trouble I found tracking examples here is qshow segmentation fault.
Can maybe someone have any ideas how can I try to fix it ?
thank you.
added : complete program code :
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 ()
added valgrind log
> > 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
added : build command
ghc --make -package qt -fglasgow-exts -O2 -o a HCK.hs -i
@Foo Bah the question was asked on 18 December, I can't be sure with my answers but OS was Windows7 , tell me what exactly can I tell about the system ?
@Vlad Lazarenko I know but it was windows for sure )
@Foo Bah Using cygwin, huh ? Where I need to use it ? I am on this machine and I can make another try for qtHaskell and check the current situation but I guess there will be another versions.
There are a couple spots that may cause trouble in your example. I emphasize may here as dealing with memory issues can be very dependent on which library you have doing your memory management.
First, you will want to notify qtHaskell when garbage collection should run. I would place this at the end of your on_hello_clicked
routine. The appropriate call is returnGC
. It is also a good idea to place another returnGC
call at the end of your main
function.
Second, your main function is specifying an integer parameter that doesn't exist. You should specify main
as main :: IO ()
So, the full code would be:
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
This compiles and runs nicely on WindowsXP + Cygwin as well as MacOS 10.6
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With