Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

17.08.2011, 23:05

Problem mit maps und Definition in einer zweiten Code Datei.

Ich wollte mir mal ein kleines Analysis Rechenprogramm schreiben, dass ich nach und nach erweitern möchte.
Zurzeit sollen nur Punkte im 2-dimensionalen Koordinatensystem und Lineare Funktionen definiert werden und mit diesen gerechnet werden.
Punkte und Lineare Funktionen besitzen jeweils eine seperate Klasse und werden in eine seperate map gepackt.
Aufgrund der Größe ist das Ganze in mehreren Code Dateien aufgeteilt.
Soweit so gut.
Nun wollte ich mal einen kleinen Test starten, ob irgendwo sich Fehler verstecken.
Nach den üblichen Syntax Fehlern bin ich auf etwas gestoßen, worauf ich mir keinen Reim machen kann.
Die Maps werden in einer Header Datei deklariert:

C-/C++-Quelltext

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

#include <map>
#include "Klassen.hpp"

std::map<char, Punkt> Punkte;
std::map<char, Punkt>::iterator Pite;
std::pair<char, Punkt> PKey;

std::map<char, LineareFunktion> LineareFunktionen;
std::map<char, LineareFunktion>:: iterator Lite;
std::pair<char, LineareFunktion> LFKey;

#endif AFM_HPP


Die Funktionen zum Rechnen mit den Objekten sind hier:

C-/C++-Quelltext

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

#include "Maps.hpp"

void PunktErstellen ();
void LineareFunktionErstellen_Punkte ();
void LineareFunktionErstellen_Parameter ();
void FunktionswertAusgeben ();
void FunktionAusgeben ();
void LageGraphPunkt ();
void LageGraphGerade ();//ist noch nicht definiert/fertig

#endif FUNKTIONEN_HPP


C-/C++-Quelltext

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
#include "Funktionen.hpp"
#include <iostream>

using  std::cout;
using  std::cin;

//
//
void PunktErstellen ()
{
    double x, y;
    char P;

    cout << "Parameter Abfrage\n";
    cout << "X Koodinate eingeben\n";
    cin >> x;
    cout << "Y Koordinate eingeben\n";
    cin >> y;
    cout << "Geben sie einen Buchstaben als Bezeichner an\n";
    cin >> P;

    Punkt A (x, y, P);
    PKey = std::make_pair (A.m_Name, A);
    Punkte.insert (PKey);
}

//
//
void LineareFunktionErstellen_Punkte ()
{
    char P1;
    char P2;
    char Name;

    cout << "Waehlen sie zwei Punkte aus, um eine Lineare Funktion zu bilden\n";
    cout << "Erster Punkt\n";
    cin >> P1;
    cout << "Zweiter Punkt\n";
    cin >> P2;
    cout << "Name der Funktion?\n";
    cin >> Name;


    Pite = Punkte.find (P1);
    Punkt const &temp1 = Pite->second;

    Pite = Punkte.find (P2);
    Punkt const &temp2 = Pite->second;

    LineareFunktion f (temp1, temp2, Name);

    LFKey = std::make_pair (f.m_Name, f);
    LineareFunktionen.insert (LFKey);
}

//
//
void LineareFunktionErstellen_Parameter ()
{
    double Steigung;
    double y_AchsenSchnittPunkt;
    char Name;

    cout << "Geben sie die Steigung an\n";
    cin >> Steigung;
    cout << "Geben sie den y-Achsenschnittpunkt an\n";
    cin >> y_AchsenSchnittPunkt;
    cout << "Geben sie den Namen der Funktion an\n";
    cin >> Name;

    LineareFunktion f (Steigung, y_AchsenSchnittPunkt, Name);

    LFKey = std::make_pair (f.m_Name, f);
    LineareFunktionen.insert (LFKey);
}

//
//
void FunktionswertAusgeben ()
{
    char f;
    cout << "Geben sie den Funktions Bezeichner an\n";
    cin >> f;
    Lite = LineareFunktionen.find (f);
    double x;
    cout << "Geben sie die x-Stelle an\n";
    cin >> x;

    Lite->second.FunktionswertAusgeben (x);
}

//
//
void FunktionAusgeben ()
{
    char f;
    cout << cout << "Geben sie den Funktions Bezeichner an\n";
    cin >> f;
    Lite = LineareFunktionen.find (f);

    Lite->second.FunktionAusgeben ();
}

//
//
void LageGraphPunkt ()
{
    char fName;
    char PName;

    cout << "Geben sie den Funktions Bezeichner an\n";
    cin >> fName;
    cout << "Geben sie den Punkt Bezeichner an\n";
    cin >> PName;

    Lite = LineareFunktionen.find (fName);
    Pite = Punkte.find (PName);

    Lite->second.LageZuPunkten (Pite->second);
}

//
//


Die Log-Konsole spuckt das hier aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1>------ Erstellen gestartet: Projekt: Lineare Funktionen, Konfiguration: Debug Win32 ------
1>  Funktionen.cpp
1>main.obj : error LNK2005: "class std::_Tree_iterator<class std::_Tree_val<class std::_Tmap_traits<char,class LineareFunktion,struct std::less<char>,class std::allocator<struct std::pair<char const ,class LineareFunktion> >,0> > > Lite" (?Lite@@3V?$_Tree_iterator@V?$_Tree_val@V?$_Tmap_traits@DVLineareFunktion@@U?$less@D@std@@V?$allocator@U?$pair@$$CBDVLineareFunktion@@@std@@@3@$0A@@std@@@std@@@std@@A) ist bereits in Funktionen.obj definiert.
1>main.obj : error LNK2005: "struct std::pair<char,class LineareFunktion> LFKey" (?LFKey@@3U?$pair@DVLineareFunktion@@@std@@A) ist bereits in Funktionen.obj definiert.
1>main.obj : error LNK2005: "class std::map<char,class LineareFunktion,struct std::less<char>,class std::allocator<struct std::pair<char const ,class LineareFunktion> > > LineareFunktionen" (?LineareFunktionen@@3V?$map@DVLineareFunktion@@U?$less@D@std@@V?$allocator@U?$pair@$$CBDVLineareFunktion@@@std@@@3@@std@@A) ist bereits in Funktionen.obj definiert.
1>main.obj : error LNK2005: "class std::_Tree_iterator<class std::_Tree_val<class std::_Tmap_traits<char,class Punkt,struct std::less<char>,class std::allocator<struct std::pair<char const ,class Punkt> >,0> > > Pite" (?Pite@@3V?$_Tree_iterator@V?$_Tree_val@V?$_Tmap_traits@DVPunkt@@U?$less@D@std@@V?$allocator@U?$pair@$$CBDVPunkt@@@std@@@3@$0A@@std@@@std@@@std@@A) ist bereits in Funktionen.obj definiert.
1>main.obj : error LNK2005: "class std::map<char,class Punkt,struct std::less<char>,class std::allocator<struct std::pair<char const ,class Punkt> > > Punkte" (?Punkte@@3V?$map@DVPunkt@@U?$less@D@std@@V?$allocator@U?$pair@$$CBDVPunkt@@@std@@@3@@std@@A) ist bereits in Funktionen.obj definiert.
1>main.obj : error LNK2005: "struct std::pair<char,class Punkt> PKey" (?PKey@@3U?$pair@DVPunkt@@@std@@A) ist bereits in Funktionen.obj definiert.
1>Menü.obj : error LNK2005: "class std::_Tree_iterator<class std::_Tree_val<class std::_Tmap_traits<char,class LineareFunktion,struct std::less<char>,class std::allocator<struct std::pair<char const ,class LineareFunktion> >,0> > > Lite" (?Lite@@3V?$_Tree_iterator@V?$_Tree_val@V?$_Tmap_traits@DVLineareFunktion@@U?$less@D@std@@V?$allocator@U?$pair@$$CBDVLineareFunktion@@@std@@@3@$0A@@std@@@std@@@std@@A) ist bereits in Funktionen.obj definiert.
1>Menü.obj : error LNK2005: "struct std::pair<char,class LineareFunktion> LFKey" (?LFKey@@3U?$pair@DVLineareFunktion@@@std@@A) ist bereits in Funktionen.obj definiert.
1>Menü.obj : error LNK2005: "class std::map<char,class LineareFunktion,struct std::less<char>,class std::allocator<struct std::pair<char const ,class LineareFunktion> > > LineareFunktionen" (?LineareFunktionen@@3V?$map@DVLineareFunktion@@U?$less@D@std@@V?$allocator@U?$pair@$$CBDVLineareFunktion@@@std@@@3@@std@@A) ist bereits in Funktionen.obj definiert.
1>Menü.obj : error LNK2005: "class std::_Tree_iterator<class std::_Tree_val<class std::_Tmap_traits<char,class Punkt,struct std::less<char>,class std::allocator<struct std::pair<char const ,class Punkt> >,0> > > Pite" (?Pite@@3V?$_Tree_iterator@V?$_Tree_val@V?$_Tmap_traits@DVPunkt@@U?$less@D@std@@V?$allocator@U?$pair@$$CBDVPunkt@@@std@@@3@$0A@@std@@@std@@@std@@A) ist bereits in Funktionen.obj definiert.
1>Menü.obj : error LNK2005: "class std::map<char,class Punkt,struct std::less<char>,class std::allocator<struct std::pair<char const ,class Punkt> > > Punkte" (?Punkte@@3V?$map@DVPunkt@@U?$less@D@std@@V?$allocator@U?$pair@$$CBDVPunkt@@@std@@@3@@std@@A) ist bereits in Funktionen.obj definiert.
1>Menü.obj : error LNK2005: "struct std::pair<char,class Punkt> PKey" (?PKey@@3U?$pair@DVPunkt@@@std@@A) ist bereits in Funktionen.obj definiert.
1>C:\Users\****\Documents\Visual Studio 2010\Projects\Lineare Funktionen\Debug\Lineare Funktionen.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


Ich hoffe, ich konnte mich verständlich ausdrücken :wacko:

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

17.08.2011, 23:14

Wieso verwendest du globale Variablen?

In Headern deklariert man nur. Beispiel:

C-/C++-Quelltext

1
extern std::map<char, Punkt> Punkte;

in EINE cpp musst du dann definieren.

C-/C++-Quelltext

1
std::map<char, Punkt> Punkte;

Das ist allerdings keine gute Idee, weils halt globale Variablen sind.

Das ist besonders bei Iteratoren sehr gefährlich und unnötig.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

17.08.2011, 23:18

Hui, mir ist garnicht aufgefallen, dass meine map ja so gesehen global ist :whistling:

Nun gut, sollte ich die map auch als Klasse verwenden?

Werbeanzeige