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

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

1

04.03.2010, 18:35

Ungewöhnliches Problem :(

Es geht um die Aufgabe in Kapitel 5 doch habe ich keine schwierigkeiten das programm zu schreiben sondern ein problem das auch überall hätte auftauchen können...

ich habe die aufgabe schon fertig geschrieben und dann kommt da eine fehlermeldung.

(1>main.obj : error LNK2005: "int x" (?x@@3HA) ist bereits in field.obj definiert.
1>main.obj : error LNK2005: "struct sField (* sFieldData)[5]" (?sFieldData@@3PAY04UsField@@A) ist bereits in field.obj definiert.
1>main.obj : error LNK2005: "int y" (?y@@3HA) ist bereits in field.obj definiert.
1>C:\...\main.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.)

nun habe ich schon versucht -da es sich ja anscheinend um die variable int x und int y handelt- die variable umzubenennen in x1 und y1 aber bringt nichts .. (-.-')

ich hoffe ihr könnt mir weiter helfen den ich habe nirgens was gefunden aber wie man die console resetet :D

Gruß Tobi

naja gut hier mal das programm:

main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// Aufgabenstellung Kapitel 5

//


#include "field.h"
#include <iostream>

using namespace std;

int main()
{
    FieldMenue();
    return 0;
}


field.h

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
// Aufgabenstellung Kapitel 5

//


// Variablen


const int Breite = 5;
const int Hoehe = 5;

int x;
int y;

struct sField
{
    bool bUsed;
    char Name[50];
};

sField sFieldData[Breite][Hoehe];

// Funktionen

int FieldMenue();
int printField();
int deleteField();
int writeField();
int showField();


field.cpp

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
// Aufgabenstellung Kapitel 5

//


#include "field.h"
#include <iostream>

using namespace std;

int FieldMenue()
{
    int ProgramMenueEingabe;

    do
    {
        cout << "Menue\n";
        cout << "1: Feld zeigen\n";
        cout << "2: Feld besetzen\n";
        cout << "3: Felddaten anzeigen lassen\n";
        cout << "4: Feld Loeschen\n";
        cout << "5: Programm beenden\n";

        cout << "Deine Wahl: ";
        cin >> ProgramMenueEingabe;

        if(ProgramMenueEingabe == 1)
            printField();
        else if(ProgramMenueEingabe == 2)
            writeField();
        else if(ProgramMenueEingabe == 3)
            showField();
        else if(ProgramMenueEingabe == 4)
            deleteField();
        else if(ProgramMenueEingabe == 5)
            cout << "Tschüss!";
        else
            cout << "Falsche Eingabe!" << endl;

    }while(ProgramMenueEingabe != 5);

    return 0;
}

int writeField()
{
    int xx;
    int yy;

    do 
    {
        cout << "Gib bitte die Koordinaten an: (1-5)\n Breite: ";
        cin >> xx;

        cout << "Gib bitte die Koordinaten an: (1-5)\n Hoehe: ";
        cin >> yy;
    }while((xx < 5) || (xx > 0) && (yy < 5) || (yy > 0) &&
            sFieldData[xx-1][yy-1].bUsed == false);
    
    cout << "Bitte Namen für dieses Feld eingeben: ";
    cin.ignore();
    cin.get(sFieldData[xx-1][yy-1].Name, 49);
    sFieldData[xx-1][yy-1].bUsed = true;

    return 0;
}
    
int printField()
{
    for (y=0; y<Hoehe; y++)
    {
        for (x=0; x<Breite; x++)
        {
            if(sFieldData[x][y].bUsed == true)
                cout << "x";
            else 
                cout << ".";
        }
        cout << endl;
    }
    return 0;
}

int deleteField()
{
    for (y=0; y<Hoehe; y++)
    {
        for (x=0; x<Breite; x++)
        {
            sFieldData[x][y].bUsed = false;
        }
    }
    return 0;
}

int showField()
{
    int xPos;
    int yPos;
    
    do
    {
        cout << "Bitte Breitengrad angeben: (1-5) ";
        cin >> xPos;

        cout << "Bitte Hoehengrad angeben: (1-5) ";
        cin >> yPos;

    }while((xPos < 5) || (xPos > 0) && (yPos < 5) || (yPos > 0));

    if (sFieldData[xPos-1][yPos-1].bUsed = false)
        cout << "Dieses Feld ist noch nicht belegt!" << endl;
    else 
        cout << "Belegt von " << sFieldData[xPos-1][yPos-1].Name << endl;

    return 0;
}

killmichnich

unregistriert

2

04.03.2010, 18:38

also ich tippe mal darauf, dass es daran liegt, dass du in field.h int x und int y deklarierst, und danach in field.cpp in der funktion writeField() nochmal ôO

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

3

04.03.2010, 18:40

hab aber grad schon versucht einfach in writeField() int x und y auf x1 und y1 zu ändern und in showField() x und y auf x2 und y2 .. klappt auch nich aber wenn ich auf rechtsklick so ohne die zahlen dahinter auf "siehe Deklaration" gehe dann geht er in die field.h datei aber makiert mir nicht die dort deklarierten int x und y ..



//////////////////////////////////////////// EDIT OBEN ////////////////////////////////////////////////////////////

ich hab oben mal so geändert wie ich es eben versucht habe mit anderen namen aber es funzt auch so nicht also fiel.cpp nochmal durchlesen

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

04.03.2010, 19:57

wie wärs wenn du erstmal keine globalen variablen benutzt?
edit: dein problem ist dass du den header in 2 cpp datein includierst. schreib das an den anfang der headerdatei:

C-/C++-Quelltext

1
2
#ifndef FIELD_H
#define FIELD_H

und ans ende

C-/C++-Quelltext

1
#endif

problem gelöst
"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?

5

04.03.2010, 20:12

Zitat von »"NachoMan"«

wie wärs wenn du erstmal keine globalen variablen benutzt?
edit: dein problem ist dass du den header in 2 cpp datein includierst. schreib das an den anfang der headerdatei:

C-/C++-Quelltext

1
2
#ifndef FIELD_H
#define FIELD_H

und ans ende

C-/C++-Quelltext

1
#endif

problem gelöst


Das hätte ich ihm auch vor einer Stunde geposted, wenn es denn funktioniert hätte... Sicher fehlen die Guards, aber das Problem bleibt.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

6

04.03.2010, 20:29

schreib "static" vor die globalen variablen.
"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?

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

7

04.03.2010, 20:57

Jetzt hat sich ein Teil des Problems schonmal gelöst aber halt noch nicht alles..

Quellcode

1
2
1>main.obj : error LNK2005: "struct sField (* sFieldData)[5]" (?sFieldData@@3PAY04UsField@@A) ist bereits in field.obj definiert.
1>C:\...\main.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.


soll wohl was mit der struktur zu tun haben aber ich weiß einfach nicht was :(

und ich möchte lieber keien "guards" verwenden da ich im buch noch nicht soweit bin^^

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

8

04.03.2010, 22:30

es geht um diese zeile:

C-/C++-Quelltext

1
sField sFieldData[Breite][Hoehe]; 

das ist auch eine globale variable.
da du sowieso schon etwas vorweg nimmst(den code auf mehrere datein aufteiln) kannst du auch die guards benutzen oder?
"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?

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

9

05.03.2010, 18:57

nein es geht mir darum das ich lieber nicht sachen benutze die ich noch nicht im buch hatte und funktionen und das aufteilen in datein wurde in kapitel 4 schonmal erwähnt und ich habe damit rumgespielt und es jetzt so beibehalten damit ich es gleich verinnerliche..

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

10

05.03.2010, 19:03

das gehört aber dazu. es wurde nur erwähnt und nicht erklärt.
funktionierts jetzt?
"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?

Werbeanzeige