Seite 1 von 1

[gelöst]Compiler spricht in Rätseln

Verfasst: 6. Januar 2008 21:44
von qtNiko
hallo,

nachdem ich ein wenig Übung mit Qt4 habe, begann ich ein neues Projekt - ganz nach dem Muster eines vorhergehenden, welches ich gut hingekriegt hatte.

Ich möchte wieder mal ein C-Programm, das auf der Kommandozeile funktioniert, mit einer Qt4-GUI umgeben.
Die GUI, MainWin_GUI, habe ich mit dem Designer erstellt. Mit qmake entsteht daraus eine automatisch erzeugte Datei, ui_MainWin_GUI.h, die in meinem h-File includiert wird. Die Klasse dazu heisst MilFKM. Ich fange gerade erst an, aber sofort hänge ich an einigen rätselhaften Fehlermeldungen.
Dazu mein mainWindow.h-File (noch recht leer):

Code: Alles auswählen

#include "ui_MainWin_GUI.h"  // enthält u.a. QMainWindow

class MilFKM : public QMainWindow, private Ui::MainWin_GUI
{
	Q_OBJECT
	
	public:
	MilFKM(QMainWindow *parent=0);
	
}
Dazu die Implementierung, mainWindow.cpp (get_fk_position.h gehört zu dem C-Programm, zu dem die GUI gedacht ist):

Code: Alles auswählen

#include <QtGui>

#include "mainWindow.h"

extern "C" {                                               <------------- hier wird 1 Fehler gemeldet
	#include "get_fk_position.h"
}

MilFKM::MilFKM(QMainWindow *parent) : QMainWindow(parent)
{		/* Constructor */
	setupUi(this);
	
}

Das Hauptprogramm dazu, mainAppl.cpp:

Code: Alles auswählen

#include <QApplication>
#include "mainWindow.h"

int main(int argc, char *argv[])    <---- hierzu gibt es 4 Fehlermeldungen
{
    QApplication app(argc, argv);
    MilFKM guiWin;
    guiWin.show();
    return app.exec();
}
Und jetzt gibt es folgende Fehlermeldungen:
1. In mainAppl.cpp (alle 4 Fehler an der markierten Zeile):
error: new types may not be defined in a return type
error: two or more data types in declaration of 'main'
error: '::main' must return 'int'
note: (perhaps a semicolon is missing after the definition of ‘MilFKM’) mainAppl.cpp
Ich fürchte, ich habe Scheuklappen auf, aber was ist am Code denn falsch? (ich habe ihn aus dem funktionierenden, vorhergehenden Qt4-Programm kopiert und nur die Namen entsprechend modifiziert - dort hatte es geklappt)

2. In mainWindow.cpp:
error: expected unqualified-id before string constant mainWindow.cpp

Ich habe so das Gefühl, dass der Fehler in mainWindow.cpp die eigentliche Ursache ist und die anderen Fehler nur Folgeeffekte darstellen.
Bei meinem ersten Versuch, eine GUI für ein C-Programm zu schreiben, hatte ich zunächst auch Probleme, mit der extern "C" Anweisung. Irgendwann, ich weiss nicht warum, ging es dann. Dieses "irgendwann" fehlt hier noch :(

Über Tipps würde sich ein völlig frustrierter Programmierer sehr freuen.

Verfasst: 6. Januar 2008 21:47
von qtNiko
noch ein Nachtrag:

Ich arbeite mit Eclipse 3.1.1 und CDT3.0.2 auf SuseLinux 10.1

Verfasst: 6. Januar 2008 22:36
von qtNiko
Der Verdacht, dass mit extern "C" etwas nicht stimmt, verdichtet sich:
Testweise habe ich die Zeilen

Code: Alles auswählen

extern "C" {
	#include "get_fk_position.h"
}
von mainWindow.cpp nach mainWindow.h verschoben mit folgenden Auswirkungen:
1. in mainAppl.cpp und mainWindow.cpp gibt es keine Fehler mehr!
2. in mainWindow.h (wo jetzt die Anweisung extern "C" steht) gibt es den Fehler
error: expected declaration before ‘}’ token
und in get_fk_position.h gibt es weitere Fehler. Der Code dort

Code: Alles auswählen

...
typedef enum {FALSE=0, TRUE} BOOL ;          <--------- Fehler 1, siehe Text

int get_fk_position(USINT *pBild, 
					 BILDPKT *pFKPos,
					 fov iFOV,
					 BOOL fErstMessg,              <-------Fehler 2, siehe Text
					 FK_LAGE *pFKLage);
...
Fehler 1: error: expected '}' before 'false'
error: expected constructor, destructor, or type conversion before ‘;’ token
error: expected identifier before 'false'
error: expected unqualified-id before 'false'
Fehler 2: error: BOOL has not been declared -- das ist die Folge von Fehler 1

Vermutung: FALSE und TRUE sind bekannte Bezeichner. Allerdings war dies beim Compilieren als reines C-Programm kein Problem.

Deshalb weiterer Versuch:
aus FALSE und TRUE in obigem typedef enum mache ich falsch und gut mit folgenden Auswirkungen:
1. die Fehler in get_fk_position.h sind weg :)
2. in mainAppl.cpp habe ich wieder die obigen 4 Fehlermeldungen :(
und dazu noch in mainWindow.cpp einen neuen:

Code: Alles auswählen

#include <QtGui>
#include <QtCore>  // für QString, etc.
#include "mainWindow.h"

MilFKM::MilFKM(QMainWindow *parent) : QMainWindow(parent)    <---- Fehlermeldung 3
{		/* Constructor */
	setupUi(this);
	
}
Fehler 3: error: new types may not be defined in a return type mainWindow.cpp
error: return type specification for constructor invalid
error: (perhaps a semicolon is missing after the definition of 'MilFKM')
und noch 2 weitere Fehler in moc_mainWindow.cpp, das allerdings automatisch durch qmake erzeugt wird.

Ich beginne, mich im Kreis zu drehen
:x

Verfasst: 6. Januar 2008 23:16
von Christian81
C++ basics, aber an der Stelle kann der Compiler nichts anderes tun als in Rätseln zu sprechen - ist mir auch schon ab und zu passiert.

Hinter der Klassendefinition fehlt ein ';'

Code: Alles auswählen

class foo {
...
};

Verfasst: 7. Januar 2008 10:06
von qtNiko
danke für den Hinweis.

Die C++ Syntax hat es aber auch in sich :wink: