Qt Qshow分段故障
我使用的是qtHaskell,但我在这里发现的唯一问题是qshow分割错误 也许有人知道我该怎么解决它吗 多谢各位 新增:完整程序代码:Qt Qshow分段故障,qt,haskell,Qt,Haskell,我使用的是qtHaskell,但我在这里发现的唯一问题是qshow分割错误 也许有人知道我该怎么解决它吗 多谢各位 新增:完整程序代码: setText mb $ "Hello World" qshow mb () -- Segmentation Failt --print ("Hello world") -- it works 添加:build命令 > > ncdy@Cndy ~/Haskell $ valgrind ./a > ==13467== Memch
setText mb $ "Hello World"
qshow mb () -- Segmentation Failt
--print ("Hello world") -- it works
添加:build命令
> > 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
@Foo-Bah这个问题是在12月18日提出的,我不能确定我的答案,但操作系统是Windows7,请告诉我该系统的具体情况
@Vlad Lazarenko我知道,但肯定是窗户)
@Foo-Bah使用cygwin,嗯?我需要在哪里使用它?我在这台机器上,我可以再次尝试使用qtHaskell并检查当前情况,但我猜还会有其他版本。在您的示例中,有几个地方可能会导致问题。我在此强调,处理内存问题可能非常依赖于您使用的内存管理库 首先,您需要在垃圾收集应该运行时通知qtHaskell。我会把它放在你点击的例程的
末尾。适当的调用是returnGC
。在main
函数的末尾放置另一个returnGC
调用也是一个好主意
其次,您的主函数是指定一个不存在的整数参数。您应该将main
指定为main::IO()
因此,完整的代码是:
ghc --make -package qt -fglasgow-exts -O2 -o a HCK.hs -i
modulemain其中
导入Qtc.Classes.qcc
导入Qtc.Classes.Gui
导入Qtc.ClassTypes.Gui
导入Qtc.Core.Base
导入Qtc.Gui.Base
导入Qtc.Gui.QApplication
导入Qtc.Gui.QWidget
导入Qtc.Gui.QPushButton
导入Qtc.Gui.QAbstractButton
导入Qtc.Gui.QMessageBox
键入MyQPushButton=QPushButtonSc(CMyQPushButton)
数据CMyQPushButton=CMyQPushButton
myQPushButton::字符串->IO(myQPushButton)
myQPushButton b=qSubClass$qPushButton b
main::IO()
main=do
qApplication()
你好,伊奥()
在_hello _点击了这个
做
你的完整计划是什么?如何定义mb
?你是在先调用qApplication()
吗?嗯,你在做文档要求你做的一切。。。我被难住了。你的代码运行得很好,按钮和对话框都正常。根据ghc 6.10.4进行试验;dev-haskell/qt-1.1.4;x11 libs/qt-gui-4.6.2;dev haskell/cabal-1.8.0.6。重建QtHaskell可能会解决您的问题。希望你有超过1G的内存;由于分页的原因,我花了四天时间在1G中构建。@nCdy--如果您能提供有关系统的更多信息,您应该在评论部分回复评论人,这会有所帮助,因为它更干净,而且如果您回复评论人,他们会收到警报。如果您将响应编辑到答案中,他们将不会收到警报。如果我错了,请纠正我。
ghc --make -package qt -fglasgow-exts -O2 -o a HCK.hs -i
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