Avatar billede alkrojen Nybegynder
21. oktober 2003 - 16:05 Der er 16 kommentarer

Mystisk syntax fejl!

Når jeg builder følgende program i Microsoft eMbedded Visual C++:

#if !defined(AFX_PROFILEMEASUREMENT_H__BE7F515F_A3A7_4BA8_B3A1_C3ACEA8801AC__INCLUDED_)
#define AFX_PROFILEMEASUREMENT_H__BE7F515F_A3A7_4BA8_B3A1_C3ACEA8801AC__INCLUDED_

#include "MeasurePoint.h"
#include "Drawing.h"

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CProfileMeasurement 
    {
    private:
        TCHAR szTemp[30];
        int iNumberOfPoints;   

        //File Attributes
        TCHAR szFilePath[100];
       
        //Header Fields
        TCHAR szColumnDef[20];
        TCHAR szDate[30];
        TCHAR szDateTime[30];
        TCHAR szDirection[30];
        TCHAR szLine[30];
        TCHAR szPosition[20];
        TCHAR szRail[10];
        TCHAR szTime[15];
        TCHAR szType[10];

        CMeasurePoint mp[800];    //measure points
   
    public:
        CProfileMeasurement();
        virtual ~CProfileMeasurement();
       
        bool loadHeader(TCHAR* szFileName);            TCHAR* readHeader(int iHeaderField);            bool load(TCHAR* szFileName);                CMeasurePoint* getMeasurePoint(int iIndex);
        int getNumberOfPoints();
        void getExtremes(double* pMinX, double*  pMaxX, double* pMinY, double* pMaxY);
        void draw(CDrawing* dra);
    };

#endif // !defined(AFX_PROFILEMEASUREMENT_H__BE7F515F_A3A7_4BA8_B3A1_C3ACEA8801AC__INCLUDED_)

Får jeg følgende fejl:
ProfileMeasurement.h(47) : error C2061: syntax error : identifier 'CDrawing'

Hvilket er på linien med: void draw(CDrawing* dra);

CDrawing findes i projektet og er indkluderet i filen. Er der nogle der kan fortælle mig hvad denne fejl kan skyldes? og hvordan den kan rettes?
Avatar billede jpk Nybegynder
21. oktober 2003 - 16:14 #1
Har du prøvet en "Rebuild All"?
Avatar billede alkrojen Nybegynder
21. oktober 2003 - 16:30 #2
Ja det er prøvet utallige gange, med og uden precompiled headers!
Avatar billede bertelbrander Novice
21. oktober 2003 - 20:51 #3
Den kender tilsyneladene ikke CDrawing, Er du sikker på at du har stavet det rigtigt?

Prøv at skrive "class CDrawing;" (uden "") før linien med "class CProfileMeasurement", og se om det ændrer noget.
Avatar billede jpk Nybegynder
22. oktober 2003 - 08:06 #4
Includer Drawing.h også ProfileMeasurement.h?
Avatar billede segmose Nybegynder
22. oktober 2003 - 11:44 #5
jpk - hvad skulle det gøre, hvis den gør bliver problemet alligevel løst af guard'en i toppen af ProfileMeasurement.h.
Avatar billede jpk Nybegynder
22. oktober 2003 - 12:01 #6
segmose >> Bortset fra at disse includes står inden for guard'en så problemet bliver løst FOR godt..!
Avatar billede jpk Nybegynder
22. oktober 2003 - 12:02 #7
Løsningen er, som bertelbrander skriver, at lave en forerklæring af den ene klasse.
Avatar billede segmose Nybegynder
22. oktober 2003 - 13:13 #8
jpk er jeg gået glip af et eller andet her? nedenstående exemple skulle få både a.h og b.h includeret, dog bliver b.h's indhold i c.c ikke brugt da det er guarded ud af includeringen i a.h.

a.h:
#ifndef A_H
#include "b.h"
extern int a;
#endif

b.h:
#ifndef B_H
#include "b.h"
extern int b;
#endif

c.c:
#include "a.h"
#include "b.h"

int a,b;

int main() {
  return 0;
}
Avatar billede jpk Nybegynder
22. oktober 2003 - 15:42 #9
Jeg forstår ikke hvor du vil hen med dit eksempel..?

a.h includer b.h, men bruger ikke "noget" fra den
b.h includer b.h (mon ikke du mener a.h?), men bruger heller ikke noget fra den

Det giver jo ingen problemer!
Avatar billede segmose Nybegynder
23. oktober 2003 - 09:55 #10
jpk, jeg kan se hvad du mener, for at der ikke skal være nogen problemer med gensidig includering skal de dele den anden skal bruge stå over dennes includering (extern int a; skal stå over #include "b.h" i a.h).

a.h:
#ifndef A_H
extern int a;
#include "b.h"
class A { int alfa() { return b; } }
#endif

b.h:
#ifndef B_H
extern int b;
#include "a.h" // ja det skal være a.h ikke b.h
class B { int beta() { return a; } }
#endif
Avatar billede alkrojen Nybegynder
23. oktober 2003 - 13:39 #11
bertelbrander>> jeg har nu prøvet at skrive "class CDrawing;" før "class CProfileMeasurement" og det må siges at gøre en foreskel, nu kommer istedet følgende fejlmelding:

Linking...
uafxwced.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in coredll.lib(COREDLL.dll)
uafxwced.lib(afxmem.obj) : warning LNK4006: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in coredll.lib(COREDLL.dll); second definition ignored
  Creating library ARMDbg/MiniProf Pocket.lib and object ARMDbg/MiniProf Pocket.exp
ARMDbg/MiniProf Pocket.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.

MiniProf Pocket.exe - 2 error(s), 4 warning(s)

Jeg går ud fra at det er fordi der står class CDrawing bliver deklareret to steder i koden nu.. men hvordan kan jeg undgå denne fejl?
Avatar billede bertelbrander Novice
23. oktober 2003 - 19:17 #12
Udtrykket "class CDrawing;" er ikke en deklaration, men en forward deklaration. Du fortæller blot kompileren at du har tænkt dig at lave en klasse der hedder CDrawing, og du lover kompileren at du nok skal lave deklaration af klassen hvis/når den får brug for den.
Det er intet i vejen for at lave forward declarations, selv i endelige programmer. Se f.ex. http://www.eksperten.dk/spm/417294 jeg tror at det er det samme problem.

Jeg tror ikke linker fejlen har noget med ovennævnte at gøre, det ligner mere en fejl i hvilke biblioteker der bliver linket med, og måske at der bliver linket med både debug biblioteker/objekter og release biblioteker/objekter. Måske vil det hjælpe at undlade at linke med enten uafxwced.lib eller coredll.lib.
Jeg kender ikke embedded Visual C++.
Avatar billede alkrojen Nybegynder
28. oktober 2003 - 15:49 #13
Jeg har set det omtalte spørgsmål og kan stadig ikke få det til at virke.. Det lader som sagt meget til at der er tale om noget headerfil virvar!!! er der ikke en måde hvor man kan undgå at skulle indkludere de headerfiler i hver c-fil? således at man ikke skal spilde sin tid med den slags!!!
Man bliver jo næsten tvunget til at skrive det hele i en fil!!! og det bliver et helvede efter som projektet pt. fylder 11 filer!! HJÆÆÆLP!
Avatar billede jpk Nybegynder
28. oktober 2003 - 15:53 #14
Hvis du har lyst kan du sende mig projektet, så skal jeg se om jeg kan få det til at kompilere..?
Avatar billede segmose Nybegynder
28. oktober 2003 - 16:31 #15
Fejlen er muligvis i den .h fil der definere CDrawing

prøv istedet nederst i den .h fil at sætte et ; hvilket vil afslutte evt. uafsluttede definitioner, istedet for den forward class definition som du har lavet nu.
Avatar billede the_bma_man Nybegynder
29. januar 2004 - 08:19 #16
Ang. include af en masse filer.
Hvis det er nogle, du inkludere i alle (eller næsten alle) andre filer, så kan du med fordel include dem i stdAfx. På denne måde bliver de også precompileret - hvilket gør kompilering hurtigere.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester