Qt4: Segmention Fault ohne Fehler beim kompilieren



  • Ich habe ein kleines Qt-Programm erstellt, doch jetzt, da ich noch zusätzlich eine andere( in C geschriebene) Bibliothek hinzunehme, und versuche irgendwelche Daten die von der Bibliothek kommen zu nutzen, kompiliert er zwar erreignislos, aber laufen tut nichts. Hier mal die betreffenden Code-Ausschnitte:
    pnditem.hpp:

    /*
     * pnditem.hpp
     *
     *  Created on: 17.07.2010
     *      Author: xxxx
     */
    
    #ifndef PNDITEM_HPP_
    #define PNDITEM_HPP_
    #include <iostream>
    #include <qt4/QtGui/qlistwidget.h>
    #include <qt4/QtCore/QtCore>
    
    class pnditem : public QListWidgetItem
    {
    public:
    ...
    QString fromFile(char pndfile[100]);
    

    pndfile.cpp:

    /*
     * pnditem.cpp
     *
     *  Created on: 17.07.2010
     *      Author: xxxx
     */
    #include "pnditem.hpp"
    
    #include <qt4/QtGui/qlistwidget.h>
    #include <qt4/QtCore/QtCore>
    
    #include <cstdio> 
    #include <cstdlib>
    #include <cstring>/
    #include <cctype>
    
    #include "pnd_conf.h"
    #include "pnd_container.h"
    #include "pnd_apps.h"
    #include "pnd_discovery.h"
    #include "pnd_locate.h"
    #include "pnd_pndfiles.h"
    #include "pnd_pxml.h"
    ...
    QString pnditem::fromFile(char pndfile[100])
    {
    	char *path, *filename;
    
    	 if ( strchr ( pndfile, '/' ) ) {
    	   char *foo = rindex ( pndfile, '/' );
    	   *foo = '\0';
    	   path = pndfile;
    	   filename = foo + 1;
    	  }
    	pnd_box_handle h = pnd_disco_file(path,filename);
    	pnd_disco_t *d = (pnd_disco_t*)pnd_box_get_head ( h );
    	QString appdata_dir = QString(d->appdata_dirname);
    	return appdata_dir;
    
    }
    

    mainwindow.cpp:

    /*
     * mainwindow.cpp
     *
     *  Created on: 17.07.2010
     *      Author: luca
     */
    
    #include <qt4/QtGui/QtGui>
    #include <qt4/QtCore/QtCore>
    #include <iostream>
    #include "pnditem.hpp"
    ...
    void mainwindow::setApps()
    {
    ...
    pnditem *quake2 = new pnditem("/home/luca/IOquake2.pnd","Quake 2","FPS-Games");
    ...
    QString appdata = quake2->fromFile(pathname);
    ...
    

    In der Zeile "QString appdata_dir = QString(d->appdata_dirname);"(pnditem.cpp) sollte von "d->appdata_dirname" ein Zeiger auf ein char-Array ausgegeben werden.
    Aber irgendwie packt er das nicht.

    Ich hoffe irgendjemand kann mir helfen.
    Danke schonmal.

    greeesce

    P.S. Gentoo LInux x86_64 - Eclipse Helios



  • Also, prinzipiell etwas wenig Info 😕
    Bist du mit dem Debugger ( emerge gdb ) durchgegangen? Sagt der dir genau die Zeile als Ursache deines SegFaults an?
    Es wäre auch noch interessant, was genau das pnd_box_get_head zurückgibt (weil du das castest).



  • Also, die Funktion pnd_box_get_head ist im Headerfile als void deklariert, was aber nicht ganz stimmt. In C kann man anscheinend auch andere Werte als in der Funktionsdeklaration angegeben zurückgeben. Denn der C-Compiler kontrolliert offenbar nicht nach ob der Typ des Rückgabewertes übereinstimmt. Der C++ Compiler tut das und meldet mir den Fehler, dass ja die Funktion nichts(void) zurückgebe und so auch keinem Zeiger zugewiesen werden kann. Also mit gbd bin ich noch nicht durchgegangen, aber werde ich noch. Ich bin mir aber ziemlich sicher das es an dieser Zeile liegt, denn wenn ich die Zeile "QString appdata_dir = QString(d->appdata_dirname);" Durch beispielsweise "    QString appdata_dir = QString("irgendwas"); ersetze, dann funktioniert alles.



  • void != void*
    ersteres ist "nichts", zweiteres ist ein Zeiger auf "irgendetwas" 😉
    Die Annahme, dass man einen void* auch jederzeit nach "irgendetwas" casten kann, ist falsch.
    Kannst du mal bitte die Funktionsdeklaration samt Doku posten? 100% liegt der Fehler an deiner falschen Annahme 🙂



  • Also, ne Doku gibt es leider nicht, es gibt lediglich die kommentierten Header-Dateien: http://git.openpandora.org/cgi-bin/gitweb.cgi?p=pandora-libraries.git;a=tree;f=include;h=47993f00ab1710287192c8150218b2b08f14d7cd;hb=HEAD
    Die Funktion findet sich in der Datei pnd_container.h
    Zudem findet man noch ein paar Anwendungsbeispiele der Funktionen: http://git.openpandora.org/cgi-bin/gitweb.cgi?p=pandora-libraries.git;a=tree;f=apps;hb=HEAD

    Danke für dein Verständnisse.



  • Aus pnd_container.c:

    void *pnd_box_get_head ( pnd_box_handle box ) {
      pnd_box_t *p = (pnd_box_t*) box;
      if ( ! p ) {
        return ( NULL ); // fubar!
      }
      if ( ! p -> head ) {
        return ( NULL );
      }
      return ( NODE2PAYLOAD(p -> head) );
    }
    

    Es gibt Fälle, in denen NULL zurückgegeben wird. Das solltest du natürlich testen!



  • Also Danke für deine Hilfe, ich habe jetzt den Fehler gefunden, es lag lediglich daran das beim Pfad das letzte / nicht angegeben werden durfte. Trotzdem Danke für deine Mühe.


Log in to reply