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. 👍 🙂


Anmelden zum Antworten