2010-12-18 17 views
17
setText mb $ "Hello World" 
    qshow mb() -- Segmentation Failt 
    --print ("Hello world") -- it works 

Używam qtHaskell, ale jedyny problem, który znalazłem przykłady śledzenia tutaj jest qshow błąd segmentacji.Qshow Błąd segmentacji

Czy może ktoś ma jakieś pomysły, jak mogę to naprawić?

dziękuję.

dodania: pełny kod programu:

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

dodany valgrind dziennika

> > [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 

dodania: polecenie zbudować

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

@foo Bah pytanie został poproszony w dniu 18 grudnia , Nie mogę być pewny z moimi odpowiedziami, ale OS to Windows7, powiedz mi, co dokładnie mogę powiedzieć o systemie?

@Vlad Lazarenko wiem, ale było okien na pewno)

@foo Bah Korzystanie Cygwin, hę? Gdzie muszę go użyć? Jestem na tym komputerze i mogę zrobić kolejną próbę dla qtHaskell i sprawdzić obecną sytuację, ale myślę, że będą inne wersje.

+0

Co jest kompletnym programem? W jaki sposób zdefiniowano 'mb'? Czy najpierw wywołujesz 'qApplication()? – luqui

+0

Hmm, robisz wszystko, co mówią doktorzy ... Jestem zdumiony. – luqui

+1

Twój kod działał poprawnie, przycisk i okno dialogowe było w porządku. Testowane na ghc 6.10.4; dev-haskell/qt-1.1.4; x11-libs/qt-gui-4.6.2; dev-haskell/cabal-1.8.0.6. Przebudowa QtHaskell może rozwiązać Twój problem. Mam nadzieję, że masz więcej niż 1 GB pamięci RAM; zajęło mi cztery dni, aby zbudować w 1G z powodu stronicowania. – frayser

Odpowiedz

1

Istnieje kilka miejsc, w których może powodować problemy w twoim przykładzie. Podkreślam, że tutaj kwestia pamięci może być bardzo zależna od tego, którą bibliotekę zarządzasz pamięcią.

Po pierwsze, będziesz chciał powiadomić qtHaskell, kiedy powinno być uruchamiane usuwanie śmieci. Umieściłbym to na końcu twojej procedury on_hello_clicked. Odpowiednie wywołanie to returnGC. Dobrym pomysłem jest również umieszczenie kolejnego połączenia returnGC na końcu funkcji main.

Po drugie, twoją główną funkcją jest określenie parametru całkowitego, który nie istnieje. Należy określić main jak main :: IO()

So, pełny kod byłoby:

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 

To kompiluje i działa dobrze na Windows XP + Cygwin jak i MacOS 10.6

Powiązane problemy