You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Sunday, December 4th 2011, 6:17pm

Problem beim Kompilieren

Ich hab folgende Fehlermeldung erhalten:

1>C_ProcessingPoint.obj : error LNK2005: "struct Movie * * Film" (?Film@@3PAPAUMovie@@A) ist bereits in C_Cinema.obj definiert.

1>C_ProcessingPoint.obj : error LNK2005: "struct Order * NewOrder" (?NewOrder@@3PAUOrder@@A) ist bereits in C_CollectionPoint.obj definiert


Kann mich mal jemand aufklären, was das genau heißt?

Ich versteh nur, dass das Objekt ProcessingPoint ein struct Movie * * Film bzw. struct Order* NewOrder definiert, welches bereits im Cinema Objekt definiert worden ist.

Wobei mir das:"struct Movie * * Film" mit dem 2fachen Stern doch seltsam vorkommt.

Hier der Code

S_Movies.h

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef S_MOVIES_H
#define S_MOVIES_H

struct MTime
{
	unsigned int m_Hour;
	unsigned int m_Minute;
};

struct Movie
{
	const char* m_MovieName;
	unsigned int m_Seats[3];
	MTime* m_StartTime[3];

};
Movie* Film[3];



#endif S_MOVIES_H

S_Order.h beinhalten ungefähr das selbe
Das: Order* NewOrder; is der einzigste Unterschied

C_Cinema.h

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
#ifndef C_CINEMA_H
#define C_CINEMA_H

class C_CollectionPoint;
class C_ProcessingPoint;
class C_IssuingOffice;

class C_Cinema
{
public:
	C_Cinema(void);
	~C_Cinema(void);
	
	C_CollectionPoint* m_CollectionPoint;
	C_ProcessingPoint* m_ProcessingPoint;
	C_IssuingOffice* m_IssueOffice;
	

	void start();
	void showMovies();


};

#endif C_CINEMA_H
}


ProcessingPoint.h

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef C_PROCESSINGPOINT_H
#define C_PROCESSINGPOINT_H

class C_ProcessingPoint
{
public:
	C_ProcessingPoint(void);
	~C_ProcessingPoint(void);

	bool CheckOrder();

};

#endif C_PROCESSINGPOINT_H


in der CPP von Cinema
Include ich S_Movies.h
und ProcessingPoint.h

und erstell im Konstruktor vom Cinema eine Instanz von ProcessingPoint
m_ProcessingPoint= new C_ProcessingPoint();

Ich hoffe ihr könnt mir helfen.
Gruß Nobody

2

Sunday, December 4th 2011, 7:29pm

Hmm wie sehen die CPP Dateien aus, was und wie Includierst du?
Der Fehler sagt halt aus das du zwei Variablen mit dem sleben Namen hast welche er nicht unterscheiden kann.
Du musst die Variablen in der CPP deklarieren und in den Headerdatei definieren (mit dem Schlüsselwort extern), damit beim einbinden der Headerdatei klar ist das die Variable nur einmal deklariert ist.

Bsp:
CPP:

C/C++ Quellcode

1
int GlobaleVariable = 0;


Header:

C/C++ Quellcode

1
extern int GlobaleVariable;


Mfg Rushh0ur

3

Sunday, December 4th 2011, 8:20pm

Das mit dem extern ist mir neu... also das es das gibt.
Habs mal umgesetzt
Hier der Code

S_Order.h

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef S_ORDER_H
#define S_ORDER_H

struct OTime
{
	unsigned int m_Hour;
	unsigned int m_Minute;
};

struct Order
{
	char* m_OrderMovie;
	unsigned int m_OrderSeats;
	OTime* m_OrderTime;
};

extern Order* NewOrder;

#endif S_ORDER_H


In S_Movies hab ich es natürlich genauso umgesetzt
extern Order* NewOrder;
wollte nur nicht nochmal den ganzen Code posten

ProcessingPoint.cpp

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "C_ProcessingPoint.h"
#include "S_Order.h"
#include "S_Movies.h"
C_ProcessingPoint::C_ProcessingPoint(void)
{
}


C_ProcessingPoint::~C_ProcessingPoint(void)
{
}


bool CheckOrder()
{
	Order* NewOrder;
	Movie* Film[3];
	for(int i = 0; i < 3; ++i)
	{
		if(Film[i]->m_MovieName == NewOrder->m_OrderMovie)
		{
			for(int j = 0; j < 3; ++j)
				{
					if(Film[i]->m_StartTime[j]->m_Hour == NewOrder->m_OrderTime->m_Hour)
					{
						if(Film[i]->m_StartTime[j]->m_Minute == NewOrder->m_OrderTime->m_Minute)
						{
							if(Film[i]->m_Seats[j] >= NewOrder->m_OrderSeats)
							{
								Film[i]->m_Seats[j] -= NewOrder->m_OrderSeats;
								return true;

							}
						}
					}

				}

			

		}


	}
	
	return false;
}


Cinema.cpp

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include "C_Cinema.h"
#include "C_CollectionPoint.h"
#include "C_IssuingOffice.h"
#include "C_ProcessingPoint.h"
#include "S_Movies.h"

#include <iostream>
#include <stdlib.h>

C_Cinema::C_Cinema(void)
{
	
	
	Film[0]->m_MovieName="Film1";
	Film[0]->m_Seats[0]=100;
	Film[0]->m_Seats[1]=100;
	Film[0]->m_Seats[2]=100;
	Film[0]->m_StartTime[0]->m_Hour=13;
	Film[0]->m_StartTime[0]->m_Minute=30;
	Film[0]->m_StartTime[1]->m_Hour=17;
	Film[0]->m_StartTime[1]->m_Minute=15;
	Film[0]->m_StartTime[2]->m_Hour=22;
	Film[0]->m_StartTime[2]->m_Minute=30;

	Film[1]->m_MovieName="Film2";
	Film[1]->m_Seats[0]=100;
	Film[1]->m_Seats[1]=100;
	Film[1]->m_Seats[2]=100;
	Film[1]->m_StartTime[0]->m_Hour=13;
	Film[1]->m_StartTime[0]->m_Minute=30;
	Film[1]->m_StartTime[1]->m_Hour=17;
	Film[1]->m_StartTime[1]->m_Minute=15;
	Film[1]->m_StartTime[2]->m_Hour=22;
	Film[1]->m_StartTime[2]->m_Minute=30;

	Film[2]->m_MovieName="Film3";
	Film[2]->m_Seats[0]=100;
	Film[2]->m_Seats[1]=100;
	Film[2]->m_Seats[2]=100;
	Film[2]->m_StartTime[0]->m_Hour=13;
	Film[2]->m_StartTime[0]->m_Minute=30;
	Film[2]->m_StartTime[1]->m_Hour=17;
	Film[2]->m_StartTime[1]->m_Minute=15;
	Film[2]->m_StartTime[2]->m_Hour=22;
	Film[2]->m_StartTime[2]->m_Minute=30;

	m_CollectionPoint = new C_CollectionPoint();
	m_ProcessingPoint= new C_ProcessingPoint();
	m_IssueOffice = new C_IssuingOffice();
}


C_Cinema::~C_Cinema(void)
{
	delete m_CollectionPoint;
	delete m_ProcessingPoint;
	delete m_IssueOffice;
}

void C_Cinema::start()
{
	
	Movie* Film[3];

	unsigned int Menu=3;
	do
	{
		system("cls");
		std::cout<<"Kinokarten Bestellsystem\n";
		std::cout<<"1: Kartenbestellen\n";
		std::cout<<"2: Vorführung anzeigen\n";
		std::cout<<"3: Beenden";
		std::cin>>Menu;
	
		switch(Menu)
		{
			case 1:	//Order
					m_CollectionPoint->DoOrder();
					break;

			case 2: //Show Movies
					showMovies();
					break;

			case 3: //exit 
					//delete all

			default: system("pause");
		}

		if(Menu==1)
		{
				if(m_ProcessingPoint->CheckOrder())
				{
					
					if(m_IssueOffice->SetContainer())
					{
			
						std::cout<<"Karten liegen zum abholen im Container bereit";
						system("pause");
					}

					
				}
				else
				{
						std::cout<<"Es ist ein Fehler aufgetreten";
						system("pause");
				}
	
		}
		
	}
	while(Menu!=3);
}


void showMovies()
{
	for (int i = 0; i < 3; ++i)
	{
		std::cout<<"Filmtitel"<<Film[i]->m_MovieName;
		std::cout<<"\nZeiten";
		for(int j = 0; j < 3; ++j)
		{
			std::cout<<"\nZeit(HH:MM)"<<Film[i]->m_StartTime[j]->m_Hour;
			std::cout<<Film[i]->m_StartTime[j]->m_Minute;
			std::cout<<"\nPLaetze"<<Film[i]->m_Seats[j];
		}
	
	}

}


Nun spuckt er mir folgendes aus:

c_cinema.cpp(63): warning C4101: 'Film': Unreferenzierte lokale Variable
Handelt sich zwar nur um eine Warnung, aber ich glaube trotzdem das mein Programm dadurch nicht korrekt laufen wird.

1>C_Cinema.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""struct Movie * * Film" (?Film@@3PAPAUMovie@@A)".

struct Movie * * Film: Bedeutet das nicht eigentlich das man mit einem Pointer auf einen anderen Pointer verweist? Bin mir grad nicht sicher.

4

Sunday, December 4th 2011, 9:15pm

c_cinema.cpp(63): warning C4101: 'Film': Unreferenzierte lokale Variable

Bedeutet nur das du die Variable nicht benutzt hast.

struct Movie * * Film: Bedeutet das nicht eigentlich das man mit einem Pointer auf einen anderen Pointer verweist? Bin mir grad nicht sicher.

Jou bedeutet es, wobei der letzter Pointer dan auf die Structur Movie verweist.



1>C_Cinema.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""struct Movie * * Film" (?Film@@3PAPAUMovie@@A)".

Ist das nun der einzige Fehlertyp (LNK2001) der kommt?

Also du möchtest die Variablen Movie* Film[3]; global in jeder cpp Datei verwenden.
Dafür definierst du diese in einer CPP-Datei einmal global (nicht lokal):

cinema.cpp

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
#include "C_Cinema.h"
#include "C_CollectionPoint.h"
#include "C_IssuingOffice.h"
#include "C_ProcessingPoint.h"
#include "S_Movies.h"
 
#include <iostream>
#include <stdlib.h>
 
Movie* Film[3];
....


Um diese nun in den anderen zu Benutzen musst du diese entweder direkt in der CPP Datei in der du diese benutzt oder in einem eingebunden Header mit extern nochmal aufführen.

C/C++ Quellcode

1
2
3
4
5
6
7
extern Movie* Film[3];
 
...
int funktion()
{
  *Film[0] = ....
}


Google mal am besten nach C/++ und extern um die Funktionsweiße besser zu verstehen. Siehe auch hier.

Mfg Rushh0ur

5

Sunday, December 4th 2011, 10:05pm

"Ist das nun der einzige Fehlertyp (LNK2001) der kommt?"

Jo, das ist der einzige danach kommen nur LNK2019 Fehler.
Das sind aber denk ich Folgefehler.
1>C_Cinema.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: bool __thiscall C_IssuingOffice:: SetContainer(void)" (?SetContainer@C_IssuingOffice@@QAE_NXZ)" in Funktion ""public: void __thiscall C_Cinema::start(void)" (?start@C_Cinema@@QAEXXZ)".

Ich danke dir für deine Hilfe :)
Ich werd mir morgen das mit dem extern erstmal genauer anschauen.
eventuell kann mir mein Prof. dann noch weiterhelfen

schönen abend noch

Social bookmarks