Typname erwartet?
-
Hallo,
der Compiler meint:
Typname erwartet
bei:TCANObjectManagement *ptrCOM;
aber ich habe folgendes:
#include "TCANObjectManagement.h"
und der Klassenheader sdieht so aus:
#ifndef T_CAN_OBJECT_MANAGEMENT #define T_CAN_OBJECT_MANAGEMENT /** Includes ******************************************************************/ #include <vcl.h> // Standart Bibliothek #include <stdio.h> // Standart C Header #include <dos.h> // DOS Header #include "VCI2.h" // Standart VCI Header mit Funktions Prototypen #include "XatXXReg.h" // IXXAT Registry Zugriff #include "Xatdynl.h" // Header Dataei für das Dynaische Linken von XAT10Reg.DLL #include "UnitFrmBaudRate.H" // Baudratenauswahl #include "MsgOut.H" // FrmOutMsg #include "TraceWatch.H" // Form mit TraceWindow #include "MainUnit.h" // Hauptformular /** Defines *******************************************************************/ #define COM "CANObjectManagement" #define COM_Version 0x01 #define CAN_NUM 0 #define ANZ_BUFFERS 10 /** Funktionsprototypen *******************************************************/ // Empfangs Call Back Funktion void receive_queuedata(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ FAR *p_obj); // Exception Call Back Funktion void exception_handler(VCI_FUNC_NUM func_num, INT32 err_code, UINT16 ext_err, char *err_str); // Message Call Back Funktion void message_handler(char *msg_str); int TempGlobNodeID; //****************************************************************************** class TCANObjectManagement { public: UINT16 BoardHdl; //Board Handle UINT16 TxQueHdl; //Tx Queue Handle UINT16 RxQueHdl2; //Rx Queue Handle UINT16 BufHdl[ANZ_BUFFERS]; //Buffer Handle void Init_Board(void); //Board Initialisieren void Init_CAN(void); //CAN Initialisieren void Receive_BufferData(void); //Receive Buffer auslesen void Send_Data(UINT8 *buffer, UINT16 CobID, UINT8 Dlc); //Daten Senden void CloseConnection(void); //Verbindung Beenden -> Reset Adapter void ShowErrOutMsg(AnsiString msg); //ErrOutMsg Anzeigen void ShowTraceWatch(void); //Trace Window Anzeigen void HideTraceWatch(void); //TraceWindow verbergen void RefreshData(void); //Globale Option Variablen mit option Struct abgleichen unsigned short ReadBoardStatus(void); //Liest den Akt. Status des Boardes ein unsigned short ReadCanStatus(void); //Liest den Akt. Status des CAN Controllers ein void SetPreoperation(void); //Preoperation setzen void SetPDO(int delay); //PDO setzen void SetStart(void); //Bus hochfahren void SetHoming(void); //Modus auf Homing setzen void SetVelocity(void); //Modus auf Velocity setzen void SetPositioning(void); //Modus auf Positionsmodus umschalten void SetZiel(signed long position); //Zeil schreiben void SetSpeed(signed long speed); //Geschwindigkeit setzen void SetControlWord_2B(unsigned long controlword);//Startword setzen void SetControlWord_23(unsigned int controlword);//Startword setzen void SetPreset(signed long position); //Position setzen void SetSWSwitch1(signed long position); //Softareendschalter 1 setzen void SetSWSwitch2(signed long position); //Softareendschalter 2 setzen void GoSWSwitch1(void); //Softareendschalter 1 als Ziel definieren void GoSWSwitch2(void); //Softareendschalter 2 als Ziel definieren void SaveToEEPROM(void); //Informationen im EEPROM speichern void Step(signed int step); //Step fahren void Delay(int ms); //Zeitverzögerung void Take_I_Values(int ms); //Neue Werte Lesen void Take_V_Values(int ms); //Neue Werte Lesen void Take_Pos_Values(int ms); //Neue Werte Lesen void Prepare_CAN(void); //Standart vorbereiten signed int Get_Pos(void); //Aktuelle Position einlesen unsigned int Read_Address(char *Address); //Wert an DSP Adresse auslesen V_Regler Get_VRegler(void); //V Regler Werte einlesen Pos_Regler Get_PosRegler(void); //Pos Regler Werte Einlesen void Set_V_Regler(V_Regler value); //Setzen der V - Reglerwerte void Set_Pos_Regler(Pos_Regler value); //Setzen der Pos - Reglerwerte //void Set_I_Regler(); ~TCANObjectManagement(void); //Dekonstruktor TCANObjectManagement(void); //Konstruktor AnsiString Num2Function[28]; //Funktionsnummer nach Funktionsname Konvertieren private: char MsgTemp[160]; unsigned char Baudraten[9][2]; //Baudraten Speicher AnsiString VCIErrNum2ErrStr[7]; //Standart VCI Err Codes zu String Umwandeln protected: }; #endif //TCANOBJECTMANAGEMENT
bitte nicht über das Design lästern, die Software muss ich lediglich überarbeiten und ist nicht von mir....
Danke aber trozdem für die Hilfe...
-
Zeig mal die Zeilen bis zu deiner Fehlerzeile...
-junix
-
junix schrieb:
Zeig mal die Zeilen bis zu deiner Fehlerzeile...
-junix
okay:
//--------------------------------------------------------------------------- #ifndef MainUnitH #define MainUnitH //--------------------------------------------------------------------------- #define MDT "Motoren Design Tool" #define MDT_VERSION "1.0" #define MDT_OWNER "Baumer Electric AG" #define MDT_DEVELOPER "PASCAL HÜRST" #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Buttons.hpp> #include <Chart.hpp> #include <ComCtrls.hpp> #include <ExtCtrls.hpp> #include <Menus.hpp> #include <Series.hpp> #include <IniFiles.hpp> #include <TeEngine.hpp> #include <TeeProcs.hpp> #include <ToolWin.hpp> #include "GlobVar.h" // Alles Globale #include "TMSIAObjectManagement.h" #include "TCANObjectManagement.h" #include <ExtCtrls.hpp> #include "PERFGRAP.h" #include <Chart.hpp> #include <Series.hpp> #include <TeEngine.hpp> #include <TeeProcs.hpp> #include <Buttons.hpp> #include <Menus.hpp> #include <ComCtrls.hpp> #include <ToolWin.hpp> #include <ImgList.hpp> #include <Dialogs.hpp> struct GLOB_OPTION glob_option; struct STD_VALUES std_values; struct GLOB_STATE glob_state; //--------------------------------------------------------------------------- class TFrmMain : public TForm { __published: // Von der IDE verwaltete Komponenten // 'n haufen Components private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TFrmMain(TComponent* Owner); __fastcall TFrmMain::~TFrmMain(); TCANObjectManagement *ptrCOM;
-
Vielleicht hast Du irgendwo ein gegenseitiges include?
Was Du auf jeden Fall probieren kannst ist eine Forward-Deklaration zu ver-
wenden und den (oder das, oder die) include in die cpp-Datei zu verschieben:roN schrieb:
// Ein Haufen defines und ähnliche Späße... // Das hier ins cpp:#include "TCANObjectManagement.h" // Ein Haufen includes und anderes... class TCANObjectManagement; class TFrmMain : public TForm { __published: // Von der IDE verwaltete Komponenten // 'n haufen Components private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TFrmMain(TComponent* Owner); __fastcall TFrmMain::~TFrmMain(); TCANObjectManagement *ptrCOM;
Vielleicht hilft das...
Gruß,
Alexander
-
Alexander Kempf schrieb:
Vielleicht hast Du irgendwo ein gegenseitiges include?
Okay, das hab' ich, aber das brauchi ich, und bei meinen anderen Sachen funktionierts auch mit den gegenseitigen includes....muss was anderes sein, aber was...? Und denkt bitte daran, ich sollte die Software "lediglich" erweiter, also ich hab' keinen Bock (und auch keine Zeit) darauf, das ganze Konzept zu überarbeiten.
-
Alex hat ja schon vorgeschlagen eine Forwarddeklaration zu versuchen?!?
-
junix schrieb:
Alex hat ja schon vorgeschlagen eine Forwarddeklaration zu versuchen?!?
was ist denn das genau? *googling*
-
roN schrieb:
und bei meinen anderen Sachen funktionierts auch mit den gegenseitigen includes
Sowas soll's geben: Hier funktioniert's, dort nicht...und das, obwohl *alles*
vollkommen gleich ist...oder? Naja, der eine winzige Unterschied kann's ja wohl
nicht sein...usw.roN schrieb:
also ich hab' keinen Bock (und auch keine Zeit) darauf, das ganze Konzept zu überarbeiten.
Was ist an einer Forward-Deklaration so schlimm? Du musst mit Sicherheit nicht
Dein Konzept überarbeiten. Das, was ich Dir vorgeschlagen habe, hast Du schneller
umgesetzt, als hier einen Beitrag zu verfassen. Oder hast Du's ausprobiert und
es hat nicht funktioniert?Gruß,
Alexander
-
roN schrieb:
junix schrieb:
Forwarddeklaration
was ist denn das genau? *googling*
Was das genau ist, kann ich Dir nicht sagen, aber im Groben bedeutet das, dass
Du dem Compiler mitteilst: "Hier wird eine Klasse verwendet, die es gibt, aber
ich verrate Dir jetzt noch nicht, wie sie aussieht. Das erfährst Du rechtzeitig."So ungefähr.
Gruß,
Alexander
-
Alexander Kempf schrieb:
Was ist an einer Forward-Deklaration so schlimm? Du musst mit Sicherheit nicht
Dein Konzept überarbeiten. Das, was ich Dir vorgeschlagen habe, hast Du schneller
umgesetzt, als hier einen Beitrag zu verfassen. Oder hast Du's ausprobiert und
es hat nicht funktioniert?ja, sorry, ich kannte das vorher gar nicht, bin jetzt am googeln, oder ihr dürft mir natürlich auch sagen, wie ich das anwende und was das ist...
-
Forwarddeklaration
Wenn ich das so anwende:forward TBUSObjectManagement *ptrCOM;
Ändert sich nichts, heisst immernoch
Typname erwartet
Okay, hab' gesehen wie's gehen würde...hm, wenn ich es korrekt mache, kommen andere Fehler, werd' mal genauer schauen, korrekt ist:
class TBUSObjectManagement; class TFrmMain : public TForm { __published: // Von der IDE verwaltete Komponenten TMainMenu *MainMenu1; TMenuItem *Datei1; // Mehr Deklarationen...
-
Lies Dir doch einfach mal mein erstes Posting durch. Da steht sogar der Code drin.
Gruß,
Alexander
-
Okay, nächstes Problem,
ich greif' von einem anderen Formular über mein FrmMain auf die Klasse TBUSObjectManagement zu und zwar so:
FrmMain->ptrCOM->TempGlobNodeID = Edit1->Text.ToInt();
der Compiler meint jetzt, nach dem ich TBUSObjectManagement als forward Klasse in TFrmMain deklariert habe folgendes:
[C++ Fehler] UnitFrmBaudRate.cpp(52): E2315 'TempGlobNodeID' ist kein Element von 'TBUSObjectManagement', weil der Typ nicht definiert ist.
was bedeutet das?TempGlobNodeID ist vom Typ int
-
roN schrieb:
was bedeutet das?
Das bedeutet, dass Du kein aufmerksamer Leser bist und nich mal einfachste Dinge, die man Dir vorkaut, in Dein Programm
übernehmen kannst. Du hast das include Deines Headers nicht im cpp (siehe mein erstes posting).Gruß,
Alexander
-
Alexander Kempf schrieb:
Das bedeutet, dass Du kein aufmerksamer Leser bist und nich mal einfachste Dinge, die man Dir vorkaut, in Dein Programm
übernehmen kannst. Du hast das include Deines Headers nicht im cpp (siehe mein erstes posting).*hups* Sorry, ich dachte du meinst damit nur in dem file, in dem ich die Instanz erstellte...aber logisch eigentlich, sorry...
Okay, jetzt kompilierts ohne Probleme, herzlichen Dank für die Hilfe von Dir und junix.