Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Zugriffs Probleme

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
17.09.2003, 09:25 Uhr
Martin



Folgendes Problem:

Da ich immer wieder Veränderungen in einem bestimmten Programmteil vornehme habe eine neue Klasse "CUser" erstellt. In dieser möchte ich diesen bestimmten Programmteil ausgliedern.

CUser habe ich in der original Klasse als "friend" deklariert.

Jetzt kann ich aus CUser nicht auf die Struktur zugreifen, welche in der "original.h" global deklariert wurde.

Wenn ich in der neuen Klassenfunktion auf die Elemente der originalen Klasse zugreife, kommt immer die Fehlermeldung, dass er die Elemente der Struktur nicht kennt.

Klingt alles etwas kompliziert. Vielleicht liegt es auch an den Einstellungen von Visual ???

Schon mal Danke!
Martin
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.09.2003, 10:10 Uhr
ao

(Operator)


Vielleicht in user.cpp das #include "original.h" vergessen?

Ansonsten zeig uns mal die Codestelle, die den Fehler verursacht, sowie die Deklarationen (class ... { } von CUser und COriginal.

Dein Objektmodell ist etwas suspekt. Normalerweise ist "Ich verändere einen Programmteil häufig" kein Grund, daraus eine eigene Klasse zu machen. Ich vermute, dass du gerade einen Designfehler machst.

Was genau hast du vor?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.09.2003, 17:19 Uhr
Martin



Das Projekt ist ziemlich groß. Ich stelle Euch mal die wichtigsten Stellen heraus:

Der Originale Header-------------------------------------------------------

C++:
// USBTestDlg.h : header file
//
.......
#include "DynamicLED.h"
#include "3DMeterCtrl.h"

#include "Userdatei.h"
class CUser;

//
//Diese "struct" brauche ich in der neuen Klasse.
//
struct USB_iobuf {    
  unsigned char AD1_LO, AD1_HI;
  unsigned char AD2_LO, AD2_HI;
  unsigned char AD3_LO, AD3_HI;
  unsigned char AD4_LO, AD4_HI;
  unsigned char AD_TEMP;
  unsigned char PWM1, PWM2, SERVO, PWM_CONTR;
  unsigned char PORT_IN, PORT_OUT1, PORT_OUT2;
  unsigned char not_used[8];
  unsigned char number_of_interrupts[4];
};

/////////////////////////////////////////////////////////////////////////////
// CUSBTestDlg dialog   (Original Klasse)

class CUSBTestDlg : public CDialog
{
public:
    CUSBTestDlg(CWnd* pParent = NULL);    // standard constructor
    friend class CUser;    //meine friend-Deklaration

    enum { IDD = IDD_USBTEST_DIALOG };
    C3DMeterCtrl    m_Analog_Meter5;
    CSliderCtrl    m_SLIDER_SERVO;
    CSliderCtrl    m_SLIDER_PWM2;
    CSliderCtrl    m_SLIDER_PWM1;
    C3DMeterCtrl    m_Analog_Meter4;
    C3DMeterCtrl    m_Analog_Meter3;
    C3DMeterCtrl    m_Analog_Meter1;
    C3DMeterCtrl    m_Analog_Meter2;
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

protected:
    HICON m_hIcon;
    HANDLE hUSBRead;
    HANDLE hUSBWrite;

    BOOL m_bReadError, m_bWriteError;

    // USB data buffer
    USB_iobuf io_buffer;

    // USB I/F class
    CUsbIF    UsbIF;
    void CloseConnection();

    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    virtual void OnOKExit();
    virtual void OnCancel();
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};
#endif // !defined(AFX_USBTESTDLG_H__A6A66517_BBBE_4B75_BA11_67CFC720468B__INCLUDED_)

// ENDE Original Header


-----------------------------------------------------------------------

C++:
// Original-Klasse
#include "stdafx.h"
#include "USBTest.h"
#include "USBIF.h"
#include "USBTestDlg.h"

#include "Userdatei.h"

CUser User;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// Init Dialoge und so weiter
...........
void CUSBTestDlg::OnTimer(UINT nIDEvent)
{
    if ( (m_bReadError == TRUE) || (m_bWriteError == TRUE) )
    {
        CDialog::OnTimer(nIDEvent);
        return;        
    }
    unsigned long ulBytesSucceed;
........

//*********************************************************
//**************CUser**************************************
//*********************************************************

    User.Userfunktion();

//Dieser auskommentierte Teil soll in eine eigene Klasse exportiert werden
/*
// Analog - Meter---------------------------------------------------------
    CString    sUnitA1 = "Poti";
    m_Analog_Meter1.SetUnits(sUnitA1);
    m_Analog_Meter1.UpdateNeedle (io_buffer.AD1_LO);

    m_Analog_Meter2.UpdateNeedle (io_buffer.PORT_IN);
    m_Analog_Meter5.UpdateNeedle (io_buffer.AD_TEMP);
*/



//*********************************************************
//*********************************************************
//*********************************************************
    CDialog::OnTimer(nIDEvent);
}

// ENDE Original Klasse


------------------------------------------------------------------------

C++:
// Neue Header
// Userdatei.h : Header-Datei
//

#include "3DMeterCtrl.h"
#include "DynamicLED.h"

// Dialogfeld CUser
class CUser : public CDialog
{
// Konstruktion
public:
    CUser(CWnd* pParent = NULL);   // Standardkonstruktor

    void Userfunktion(void);

    enum { IDD = IDD_USBTEST_DIALOG };
    C3DMeterCtrl    m_Analog_Meter5;
    C3DMeterCtrl    m_Analog_Meter4;
    C3DMeterCtrl    m_Analog_Meter3;
    C3DMeterCtrl    m_Analog_Meter2;
    C3DMeterCtrl    m_Analog_Meter1;
    //}}AFX_DATA
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    

protected:
    DECLARE_MESSAGE_MAP()
};


#endif // AFX_USERDATEI_H__59CC76BC_0403_4D5B_A488_E1DD09DE66E7__INCLUDED_
//ENDE Neuer Header


-----------------------------------------------------------------------

C++:
// Neue Klasse
// Userdatei.cpp: Implementierungsdatei
//

#include "stdafx.h"
#include "usbtest.h"
#include "Userdatei.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// Dialogfeld CUser


CUser::CUser(CWnd* pParent /*=NULL*/)
    : CDialog(CUser::IDD, pParent)
{
}


void CUser::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CUser)
    DDX_Control(pDX, IDC_AN5_METER, m_Analog_Meter5);
    DDX_Control(pDX, IDC_AN4_METER, m_Analog_Meter4);
    DDX_Control(pDX, IDC_AN3_METER, m_Analog_Meter3);
    DDX_Control(pDX, IDC_AN2_METER, m_Analog_Meter2);
    DDX_Control(pDX, IDC_AN1_METER, m_Analog_Meter1);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CUser, CDialog)
    //{{AFX_MSG_MAP(CUser)
        // HINWEIS: Der Klassen-Assistent fügt hier Zuordnungsmakros für Nachrichten ein
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


void CUser::Userfunktion(void)
{
// Analog - Meter----------------------------------------------------------------------
    CString    sUnitA1 = "Poti";
    m_Analog_Meter1.SetUnits(sUnitA1);
    m_Analog_Meter1.UpdateNeedle (io_buffer.AD1_LO);

    m_Analog_Meter2.UpdateNeedle (io_buffer.PORT_IN);
    m_Analog_Meter5.UpdateNeedle (io_buffer.AD_TEMP);
}
// ENDE Neue Klasse


In der neuen Klassenfunktion CUser::Userfunktion(void) kennt er die Variablen "io_buffer", "PORT_IN" und "AD_TEMP" nicht und meckert.

Fehlermeldung

Code:
:\Userdatei.cpp(58) : error C2065: 'io_buffer' : nichtdeklarierter Bezeichner
D:\Userdatei.cpp(58) : error C2228: Der linke Teil von '.AD1_LO' muss eine Klasse/Struktur/Union sein
D:\Userdatei.cpp(60) : error C2228: Der linke Teil von '.PORT_IN' muss eine Klasse/Struktur/Union sein
D:\Userdatei.cpp(61) : error C2228: Der linke Teil von '.AD_TEMP' muss eine Klasse/Struktur/Union sein
Generieren von Code...
Ueberspringen... (keine relevanten Aenderungen gefunden)
USBTest.cpp
Fehler beim Ausführen von cl.exe.
Browse-Informationsdatei wird erstellt...

USBTest.exe - 4 Fehler, 0 Warnung(en)



Danke
Martin

--edit: Kannst du nächstes mal selber dran denken, cpp- und code-tags zu setzen? Danke.

Dieser Post wurde am 17.09.2003 um 17:39 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.09.2003, 17:41 Uhr
0xdeadbeef
Gott
(Operator)


Du solltest vielleicht noch in der Klassendeklaration (Header-Datei) festlegen, was io_buffer ist und ihn irgendwo vor Gebrauch initialisieren.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.09.2003, 17:57 Uhr
Martin



"io_buffer" ist eine Variable der Struktur "USB_iobuf".

"USB_iobuf" ist global in "USBTestDlg.h" deklariert.
"io_buffer" ist vom Typ "USB_iobuf" und ist auch in "USBTestDlg.h" deklariert.

Wenn ich die "USBTestDlg.h" in meiner Datei "Userdatei.cpp" include, dann bekomme ich immer 3 Fehler, die nichts mit den Variablen zu tun haben welche ich benutzen will.

Ich bin fast am Ende meiner Weisheit / Dummheit.
Ihr könnt mir aber auch gerne ein neues Konzept oder ein Beispiel geben, wie ich ein Programmteil in eine EXTRA Datei verpacken kann.

Merci
Martin
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.09.2003, 09:37 Uhr
ao

(Operator)



Zitat:


C++:
m_Analog_Meter1.UpdateNeedle (io_buffer.AD1_LO);




Das funktioniert nur, wenn io_buffer eine globale Variable ist oder ein Member von CUser oder von einer Basisklasse von CUser. In Wahrheit ist es ein Member von CUSBTestDlg, und so musst du es auch ansprechen:

Es muss eine Variable vom Typ CUSBTestDialog geben, die muss davor:

C++:
m_Analog_Meter1.UpdateNeedle (MyUSBTestDlg.io_buffer.AD1_LO);



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.09.2003, 19:54 Uhr
Martin



io_buffer ist eine globale Variable der Struktur USB_iobuf.
Wenn ich jetzt die header-Datei include, in der die Struktur und die Variable angelegt wurden, dann bekomme ich 3 neue Fehlermeldungen:


C++:
//USBTestDlg.h-----------------------------------------------
class CUSBTestDlg : public CDialog
{

// Construction
public:
    CUSBTestDlg(CWnd* pParent = NULL);    // standard constructor

//    friend class CUser;    //meine friend-Deklaration
//    friend void CUser::Userfunktion(void);


//
// buffer to transmit/receive USB data
//

// Dialog Data
    //{{AFX_DATA(CUSBTestDlg)
    enum { IDD = IDD_USBTEST_DIALOG };
    C3DMeterCtrl    m_Analog_Meter1;
    C3DMeterCtrl    m_Analog_Meter2;
protected:
    virtual void DoDataExchange(CDataExchange* pDX);


protected:
    HICON m_hIcon;
    HANDLE hUSBRead;
    HANDLE hUSBWrite;

    BOOL m_bReadError, m_bWriteError;

    // USB I/F class
    CUsbIF    UsbIF;
    void CloseConnection();

    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    virtual void OnOKExit();
    virtual void OnCancel();
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    DECLARE_MESSAGE_MAP()
};
//-----------------------------------------------------------------



Code:
//Fehlermeldungen
Userdatei.cpp
d:\usbtestdlg.h(111) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'UsbIF'
d:\usbtestdlg.h(111) : error C2501: 'CUsbIF' : Fehlende Speicherklasse oder Typbezeichner
d:\usbtestdlg.h(111) : error C2501: 'UsbIF' : Fehlende Speicherklasse oder Typbezeichner
Generieren von Code...
Fehler beim Ausführen von cl.exe.
Browse-Informationsdatei wird erstellt...

USBTest.exe - 3 Fehler, 0 Warnung(en)

-------------------------------------------------------


Diese Fehlermedungen bekomme ich immer, wenn ich die 2 header-Dateien über Kreuz include.
Ich bin auch der Meinung, das es eigentlich richtig sein müsste, beide dateien so zu includen.
Aber die neuen Fehlermeldungen betreffen Zeilen, die mit der Sache nichts zu tun haben.
edit mike: cpp tags

Dieser Post wurde am 18.09.2003 um 21:10 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.09.2003, 21:12 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!

Zitat:
io_buffer ist eine globale Variable der Struktur USB_iobuf.

Das versteh ich nicht ganz. Wo ist sie deklariert?

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.09.2003, 06:46 Uhr
Martin



Sie ist in der header-Datei "USBTestDlg.h" global deklariert worden.

Mittlerweile habe ich die komplette Struktur in meine "Userdatei.h" global eingebettet.
Jetzt meckert der Compiler nicht mehr. Aber beim Ausführen kommt eine Windows-Fehlermeldung und nach bestätigen wird das Programm direkt wieder beendet.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.09.2003, 14:37 Uhr
mike
Pinguinhüpfer
(Operator)


Hmmm...
Wird sie durch die friend Klasse global? Den USB_iobuf io_buffer ist ja protected oder?

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: