typedef Problem bei mehreren Tasks / Klassen

MaRlik

Mitglied
Huhu alles zusammen,

hier kurz die Beschreibung bezüglich meinem Projekt. Ich habe eine VCL Anwendung welche somit die Klasse TForm hat. (Borland Builder C++ 2009).
In der Klasse klappt soweit alles. Erster Punkt wo ich mir nicht zu 100% sicher bin. Ich habe einen Typedef bei "public" definiert für meine vectoren die ich ebenfalls in public verwende.

Code:
	typedef struct {
		int DB;         		// DB Aus Datei
		int Byte;            	// Byte Aus Datei
		int Bit;                // Bit Aus Datei
		string Projekt;         // Projekt
		string Kurzname;        // Kurzname
		bool no_nc;             // Schliesser Oeffner
		// für ReadMix_2
		bool Dig_NeuerZustand;	// Neuer Zustand
		bool Dig_AlterZustand;	// Alter Zustand
	} DIG_Vector_typ;

Ich hatte eine Funktion, die ca. 5 Sekunden ausgeführt wird, die auf diesen typedef zurückgreift. Da durch die 5 Sekunden das ganze Projekt angehalten wird, wollte ich es in einen Task auslagern.

Im C++ Builder gibt es ein Objekt Task mittels dem man mehrere Tasks erstellen kann. Hat soweit auch geklappt.
Ich habe nun zwei Header Files, sowie 2 CPP Files. In der Header File sind die Klassen usw deklariert und in der jeweiligen cpp implementiert.
Dass die beiden Dateien voneinander wissen habe ich in jeder CPP beide Headerfiles eingebunden, und ab dann bekomme ich das Problem mit dem Typedef, dass er zweimal vorkommt.

Als Fehlermeldung spuckt mit der Compiler das hier aus:
Code:
[BCC32 Fehler] Sourcecode.h(203): E2303 Typname erwartet
[BCC32 Fehler] Sourcecode.h(203): E2139 In Deklaration fehlt ;
[BCC32 Fehler] Sourcecode.h(204): E2303 Typname erwartet
[BCC32 Fehler] Sourcecode.h(204): E2238 Bezeichner 'TForm1:: ::string' mehrfach deklariert
[BCC32 Fehler] Sourcecode.h(203): E2344 'TForm1:: ::string' bereits deklariert
[BCC32 Fehler] Sourcecode.h(204): E2139 In Deklaration fehlt ;
[BCC32 Fehler] Sourcecode.h(212): E2303 Typname erwartet
[BCC32 Fehler] Sourcecode.h(212): E2139 In Deklaration fehlt ;

Nun meine eigentlichen Fragen. Wo sollte der Typedef stehen? Abhängig vom Ort, wie muss ich ihn aufrufen?

Was ist der einfachste Weg wie ich die Inhalte der Klasse TForm1 and den Thread sozusagen übergebe? Durch Public dachte ich kann ich recht leicht zugreifen, auch wenn die Datenkapselung dann nicht wirklich vorhanden ist.

Bin Dankbar um jede Hilfe!
 
Hi.
Code:
	typedef struct {
		int DB;         		// DB Aus Datei
		int Byte;            	// Byte Aus Datei
		int Bit;                // Bit Aus Datei
		string Projekt;         // Projekt
		string Kurzname;        // Kurzname
		bool no_nc;             // Schliesser Oeffner
		// für ReadMix_2
		bool Dig_NeuerZustand;	// Neuer Zustand
		bool Dig_AlterZustand;	// Alter Zustand
	} DIG_Vector_typ;
Die Verwendung von typedef in diesem Zusammenhang ist in C++ unüblich da unnötig. Es reicht aus ein benanntes struct zu definieren:
C++:
struct DIG_Vector_typ {
  ...
};
Nun meine eigentlichen Fragen. Wo sollte der Typedef stehen? Abhängig vom Ort, wie muss ich ihn aufrufen?
Ein typedef ist lediglich ein Typalias. Da kannst du nichts aufrufen (woraus vermutlich der Fehler resultiert).

Gruß
 
Wo genau sollte dann die Definition des Struct stehen? Über der Klasse? In der Klasse wo ich es verwende?

Wenn ich es an der selben stelle lasse, kommt nun:
Code:
[BCC32 Fehler] Sourcecode.h(200): E2303 Typname erwartet
[BCC32 Fehler] Sourcecode.h(200): E2139 In Deklaration fehlt ;
[BCC32 Fehler] Sourcecode.h(201): E2303 Typname erwartet
[BCC32 Fehler] Sourcecode.h(201): E2238 Bezeichner 'TForm1::DIG_Vector_typ::string' mehrfach deklariert
[BCC32 Fehler] Sourcecode.h(200): E2344 'TForm1::DIG_Vector_typ::string' bereits deklariert
[BCC32 Fehler] Sourcecode.h(201): E2139 In Deklaration fehlt ;
[BCC32 Fehler] Sourcecode.h(209): E2303 Typname erwartet
[BCC32 Fehler] Sourcecode.h(209): E2139 In Deklaration fehlt ;

So der Struct:
Code:
	struct DIG_Vector_typ {
		int DB;         		// DB Aus Datei
		int Byte;            	// Byte Aus Datei
		int Bit;                // Bit Aus Datei
		string Projekt;         // Projekt
		string Kurzname;        // Kurzname
		bool no_nc;             // Schliesser Oeffner
		// für ReadMix_2
		bool Dig_NeuerZustand;	// Neuer Zustand
		bool Dig_AlterZustand;	// Alter Zustand
	};

Die Meldung kommt, wenn der Compiler bei "string Projekt" ist
 
Zuletzt bearbeitet:
So der Struct:
Code:
	struct DIG_Vector_typ {
		int DB;         		// DB Aus Datei
		int Byte;            	// Byte Aus Datei
		int Bit;                // Bit Aus Datei
		string Projekt;         // Projekt
		string Kurzname;        // Kurzname
		bool no_nc;             // Schliesser Oeffner
		// für ReadMix_2
		bool Dig_NeuerZustand;	// Neuer Zustand
		bool Dig_AlterZustand;	// Alter Zustand
	};

Die Meldung kommt, wenn der Compiler bei "string Projekt" ist
Was ist string? Soll das std::string sein? Du hast doch wohl nicht in einer Headerdatei using namespace verwendet?

Zeig den kompletten Code, oder mach am besten ein vollständiges Minimalbeispiel.

PS: Hast du denn Include Guards verwendet?

Gruß
 
Zuletzt bearbeitet:
Hier mal die gekürzten Quellcodes:

Sourcecode.h
Code:
//---------------------------------------------------------------------------
#ifndef SourcecodeH
#define SourcecodeH
//---------------------------------------------------------------------------
#include <Classes.hpp>
... alle includes der Header Files
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-verwaltete Komponenten
... alle Elemente aus IDE
private:	// Benutzer Deklarationen

public:		// Benutzer Deklarationen
	__fastcall TForm1(TComponent* Owner);

	// Eigene Funktionen
... Weggelassen
	// Variablen
	BYTE AG_MPIAdresse;
	int DLLHandle;
	char DLLErrorString[255];

	// Globale Vars für Nächster Start
	int Dig_Meldungen_NextStart;
	bool Logging_Aktiv;

	// Strukt erzeugen Filter einlesen ...
	struct DIG_Vector_typ {
		int DB;         		// DB Aus Datei
		int Byte;            	// Byte Aus Datei
		int Bit;                // Bit Aus Datei
		string Projekt;         // Projekt
		string Kurzname;        // Kurzname
		bool no_nc;             // Schliesser Oeffner
		// für ReadMix_2
		bool Dig_NeuerZustand;	// Neuer Zustand
		bool Dig_AlterZustand;	// Alter Zustand
	};

	// Vars für DIG_Meldungen
	vector<DIG_Vector_typ> Dig_Meldungen;	// Vector für DIG_Meldungen
   	DWORD* Dig_Op_Type;						// Arrays für Parameter bei Mix_Read
	DWORD* Dig_Op_Address;
	DWORD* Dig_Op_DBNr;
	DWORD* Dig_Op_LengthByte;
	DWORD* Dig_Op_Data;

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Sourcecode.cpp
Code:
//---------------------------------------------------------------------------

#include <vcl.h>           	// Grafische Oberfläsche
#include <stdio.h>          // Ein und Ausgabe für Buffer
#include <IniFiles.hpp>		// Verwaltung INI Files
#pragma hdrstop

#include <fstream>          // Files einlesen für Filter
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;        // bis hier Filter

#include <time.h>			// Zeitroutinen für Start

#include "Sourcecode.h"
#include "TaskDigMeldungen.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void TForm1::GetNewMeldungen()
// Code für neue Meldungen holen ...
{
   new TaskDigMeldungen(false);
}

TaskDigMeldungen.h
Code:
//---------------------------------------------------------------------------

#ifndef TaskDigMeldungenH
#define TaskDigMeldungenH
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TaskDigMeldungen : public TThread
{
private:
protected:
	void __fastcall Execute();
public:
	__fastcall TaskDigMeldungen(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif

TaskDigMeldungen.cpp
Code:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "TaskDigMeldungen.h"
#include "Sourcecode.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------

// Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur
// in Methoden verwendet werden, die mit Synchronize aufgerufen wurden, z.B.:
//
//      Synchronize(&UpdateCaption);
//
// wobei UpdateCaption so aussehen könnte:
//
//      void __fastcall TaskDigMeldungen::UpdateCaption()
//      {
//        Form1->Caption = "In Thread aktualisiert";
//      }
//---------------------------------------------------------------------------

__fastcall TaskDigMeldungen::TaskDigMeldungen(bool CreateSuspended)
	: TThread(CreateSuspended)
{
	FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall TaskDigMeldungen::Execute()
{
	//---- Thread-Code hier einfügen ----
       Funktionsaufruf von TForm1
}
//---------------------------------------------------------------------------

In der Headerdatei hab ich using namespace, nur in der cpp. Aber im Struct bräuchte ich daher string?

Das mit den Include Guards schau ich mir mal an ob ich des umbau.
 
Jau besten Dank. Das schaut nun schon bedeutend besser aus. Hab nun jedoch ein kleines Problem mit meinem vector. Muss man da was beachten bzw. gibts nen Unterschied da ich nun von typedef zu struct gewechselt habe?

Code:
	// Strukt erzeugen Filter einlesen ...
	struct DIG_Vector_typ {
		int DB;         		// DB Aus Datei
		int Byte;            	// Byte Aus Datei
		int Bit;                // Bit Aus Datei
		std::string Projekt;         // Projekt
		std::string Kurzname;        // Kurzname
		bool no_nc;             // Schliesser Oeffner
		// für ReadMix_2
		bool Dig_NeuerZustand;	// Neuer Zustand
		bool Dig_AlterZustand;	// Alter Zustand
	};

	// Vars für DIG_Meldungen
	vector<DIG_Vector_typ> Dig_Meldungen;	// Vector für DIG_Meldungen

Bekomme nun die Meldung in der Zeile beim Vector:
Code:
[BCC32 Fehler] Sourcecode.h(210): E2303 Typname erwartet
[BCC32 Fehler] Sourcecode.h(210): E2139 In Deklaration fehlt ;

Rest scheint soweit zu stimmen, keine Meldungen ;)
 
Die Anwort hilft mir leider nicht weiter :(
Wie kann ich nun meinen Vector erstellen?
C++:
string Projekt;         // Projekt
Fehler:
Code:
E2303 Typname erwartet
Änderung:
C++:
std::string Projekt;         // Projekt
Fehler ist weg.

C++:
vector<...> Dig_Meldungen;	// Vector für DIG_Meldungen
Fehler:
Code:
E2303 Typname erwartet

Und da fällt dir nicht irgendwas auf? ;-]

Gruß
 
Zurück