2010-12-18 20 views
17

Ich benutze qtHaskell, aber das einzige Problem, das ich gefunden Tracking-Beispiele hier ist Qshow Segmentierung Fehler.Qshow Segmentation Fault

Kann vielleicht jemand Ideen haben, wie kann ich versuchen, es zu beheben?

danke.

hinzugefügt: komplette Programmcode:

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() 

hinzugefügt valgrind log

> > [email protected] ~/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 

hinzugefügt: bauen Befehl

ghc --make -package qt -fglasgow-exts -O2 -o a HCK.hs -i 

@foo Bah die Frage am 18. Dezember wurde gebeten, Ich kann mir mit meinen Antworten nicht sicher sein, aber OS war Windows7, Sag mir, was genau kann ich über das System sagen?

@Vlad Lazarenko Ich weiß, aber es war Fenster sicher)

@foo Bah Mit Cygwin, nicht wahr? Wo muss ich es verwenden? Ich bin an diesem Rechner und kann einen weiteren Versuch für qtHaskell machen und die aktuelle Situation überprüfen, aber ich denke, es wird noch weitere Versionen geben.

+0

Was ist Ihr komplettes Programm? Wie ist 'mb' definiert? Rufen Sie zuerst 'qApplication()' an? – luqui

+0

Hmm, du machst alles, was die Ärzte sagen ... Ich bin ratlos. – luqui

+1

Ihr Code funktionierte gut, der Button und der Dialog waren in Ordnung. Getestet auf ghc 6.10.4; dev-haskell/qt-1.1.4; x11-libs/qt-gui-4.6.2; dev-haskell/cabal-1.8.0.6. Der Wiederaufbau von QtHaskell könnte Ihr Problem beheben. Hoffentlich haben Sie mehr als 1G RAM; Es hat vier Tage gedauert, bis ich dank Paging in 1G eingebaut habe. – frayser

Antwort

1

Es gibt ein paar Flecken, die in Ihrem Beispiel verursachen können. Ich betone, dass hier der Umgang mit Speicherproblemen sehr davon abhängig sein kann, in welcher Bibliothek Sie Ihr Speichermanagement betreiben.

Zuerst möchten Sie qtHaskell benachrichtigen, wenn die Garbage Collection ausgeführt werden soll. Ich würde dies am Ende Ihrer on_hello_clicked Routine setzen. Der entsprechende Anruf lautet returnGC. Es ist auch eine gute Idee, einen weiteren returnGC Anruf am Ende Ihrer main Funktion zu platzieren.

Zweitens ist Ihre Hauptfunktion die Angabe eines Integer-Parameters, der nicht existiert. Sie sollten main als main :: IO()

also der vollständige Code angeben würde:

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 

Dies kompiliert und läuft gut auf WindowsXP + Cygwin sowie MacOS 10.6