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

J'utilise qtHaskell mais le seul problème que j'ai trouvé des exemples de suivi ici est qshow segmentation fault.Qshow Segmentation Fault

Peut-être que quelqu'un peut avoir des idées comment puis-je essayer de le réparer?

merci.

ajouté: Code de programme complet:

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

ajouté valgrind journal

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

ajouté: construire commande

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

@foo Bah a posé la question le 18 Décembre , Je ne peux pas être sûr de mes réponses, mais OS était Windows7, dites-moi ce que je peux dire exactement sur le système?

@Vlad Lazarenko Je sais, mais il était sûr pour les fenêtres)

@foo Bah! avec Cygwin, hein? Où dois-je l'utiliser? Je suis sur cette machine et je peux faire un autre essai pour qtHaskell et vérifier la situation actuelle mais je suppose qu'il y aura d'autres versions.

+0

Quel est votre programme complet? Comment 'mb' est-il défini? Appelez-vous 'qApplication()' en premier? – luqui

+0

Hmm, vous faites tout ce que les docs disent de faire ... Je suis perplexe. – luqui

+1

Votre code a bien fonctionné, le bouton et le dialogue étaient ok. Testé sur ghc 6.10.4; dev-haskell/qt-1.1.4; x11-libs/qt-gui-4.6.2; dev-haskell/cabal-1.8.0.6. La reconstruction de QtHaskell peut résoudre votre problème. J'espère que vous avez plus de 1 Go de RAM; il m'a fallu quatre jours pour construire en 1G en raison de la pagination. – frayser

Répondre

1

Il ya quelques taches que peut causer des problèmes dans votre exemple. Je souligne que la gestion des problèmes de mémoire peut être très dépendante de la bibliothèque que vous utilisez pour gérer votre mémoire. Tout d'abord, vous souhaiterez informer qtHaskell lorsque la récupération de place doit s'exécuter. Je placerais ceci à la fin de votre routine on_hello_clicked. L'appel approprié est returnGC. C'est aussi une bonne idée de placer un autre appel returnGC à la fin de votre main fonction. Deuxièmement, votre fonction principale est de spécifier un paramètre entier qui n'existe pas. Vous devez spécifier main comme main :: IO()

Ainsi, le code complet serait:

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 

Cette compile et fonctionne bien sur Windows XP + Cygwin ainsi que MacOS 10.6